Sudo membuat variabel lingkungan "SUDO_USER" yang dapat Anda gunakan untuk mencari tahu pengguna yang masuk (sebenarnya siapa yang menjalankan Sudo).
Dengan asumsi Anda melakukan Sudo untuk melakukan rooting (Anda juga dapat menggunakan Sudo untuk mengakses pengguna lain), Anda dapat menulis skrip untuk mengotomatiskan dua langkah berikut.
cp source target
chown $SUDO_USER target
(Ini tidak akan berfungsi jika Anda sudo ke pengguna non root karena hanya root yang dapat memberikan file.)
Mengotomatiskannya akan sedikit bekerja. Jika sumber adalah file tunggal dan target bukan direktori, maka pekerjaan Anda selesai. Saya berasumsi bahwa Anda mengajukan pertanyaan karena masalahnya hanya masalah nyata dalam situasi yang lebih kompleks, misalnya ketika melakukan sesuatu seperti:
cp /path/source/some*files /path/target/directory/
Sebuah skrip yang rumit untuk mencari tahu file apa dan direktori apa yang dilewati, mana yang sudah ada sebelumnya, mana yang sebenarnya ditimpa, dan untuk mengubah kepemilikan hanya file yang berhasil disalin yang dapat ditulis.
Pekerjaan ini sudah dilakukan. Anda dapat menggunakan cpio
- Setelah sudo untuk melakukan rooting, gunakan cpio untuk menyalin file. cpio memerlukan daftar file yang akan disalin sehingga ini adalah proses dua langkah. Di bawah ini saya gunakan ls
untuk menghasilkan daftar file yang akan disalin.
ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/
The -pdm
berarti "mode passthrough, Buat direktori yang diperlukan, Menjaga kali modifikasi file"
--owner $SUDO_USER"
menyebabkan pengguna yang ditentukan memiliki file.
Operan terakhir adalah direktori di mana cpio harus menyimpan file.
Untuk mempelajari lebih lanjut tentang kehebatan cpio, buka halaman manual CPIO di sini
Melakukan ini dalam satu perintah sudo juga dimungkinkan. Dengan asumsi bahwa pengguna Anda memiliki hak untuk mengakses file, gunakan sudo hanya untuk bagian cpio, seperti ini:
ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/
Dalam kasus di atas saya menggunakan $ USER sebagai pengganti $ SUDO_USER karena dievaluasi sebelum Sudo berjalan. Atau, jika pengguna tidak memiliki akses untuk membuat daftar file, masukkan ke dalam skrip wrapper dan gunakan sudo untuk menjalankan wrapper. Ini bisa menjadi lebih sulit, tetapi dalam kasus yang paling sederhana Pembungkus membutuhkan dua argumen, satu sumber dan satu sasaran.
Ini masuk ke bungkus "cp_as_user":
ls $1 | cpio -pdm --owner $SUDO_USER $2
Kemudian gunakan pembungkus seperti ini:
sudo cp_as_user "/ path / ke / beberapa * file" / path / ke / target / direktori
sudo cat /etc/foo.txt > ~/foo.txt
. File cenderung hanya dapat dibaca oleh root karena suatu alasan, jadi ingatlah untuk mengingatnya ketika membuat salinan dapat dibaca oleh pengguna non-root.