Jika Anda benar-benar ingin membuat pekerjaan, Anda dapat menentukan fungsi shell yang disebut yang menjalankan shell root baru ketika menjalankan cara itu, dan hanya menjalankan perintah biasa jika tidak.sudo cd directorybashsudosudo
Seperti yang disajikan dalam jawaban lain, sebagian besar pengguna tidak ingin repot melakukan itu, tetapi sebaliknya ingin:
- Jalankan
sudo -s, atau sudo -ijika Anda ingin shell login (ingat bahwa salah satu efeknya sudo -iadalah untuk memulai Anda di direktori home root), atau sudo bashjika Anda ingin memaksa bashatau dapat meneruskan opsi ke shell.
- Jalankan di shell baru.
cd directory
- Lakukan tindakan apa pun (lainnya) yang perlu diambil sebagai root di shell baru.
- Setelah selesai, jalankan
exituntuk meninggalkan shell baru. Penting untuk tidak melupakan ini, karena Anda tidak ingin melakukan lebih banyak tindakan sebagai root daripada yang Anda inginkan!
Jadi, jika Anda mau, maka Anda dapat menulis fungsi shell (atau skrip) yang melakukan dua tindakan pertama saat sudodiikuti oleh cd, dan hanya berjalan secara sudonormal jika tidak. Tolong jangan gunakan ini sebagai alternatif untuk belajar mengapa sudo cd tidak berhasil , karena jika Anda tidak mengerti apa yang sedang terjadi, maka Anda mungkin akan sangat bingung dengan berada di shell baru (dan Anda mungkin tidak mengerti pesan kesalahan apa pun) itu terjadi).
Inilah salah satu cara untuk menulis fungsi shell seperti itu, yang juga mengingatkan Anda bahwa Anda berada di shell baru dan bahwa Anda harus exitkeluar darinya ketika Anda selesai. (Pengingat Itu mungkin akan berguna bagi pengguna dari setiap tingkat keterampilan, karena salah satu umumnya tidak terbiasa berada di shell baru ketika salah satu berjalan sudotanpa -s, -iatau nama shell yang sebenarnya sebagai argumen.)
# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
sudo bash -c '
if cd -- "$2"; then # When cd fails, its own message is enough.
printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
exec bash # Replace this bash shell with an interactive one.
fi
' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
else
command sudo "$@"
fi
}
Anda bisa memasukkan ini ke dalam Anda ~/.bashrc, meskipun ini adalah cara yang cukup aneh untuk digunakan sudosehingga Anda mungkin hanya ingin mengaktifkannya sesekali. Dalam hal ini, lebih baik untuk meletakkannya di file sendiri. Jika Anda membuat file yang disebut sudo.bashdi direktori home Anda dengan konten-konten itu, maka Anda dapat membuat sudofungsi tersedia - sehingga itu akan berjalan alih-alih sudoperintah biasa - dengan menjalankan . ~/sudo.bash. Itu berlaku di shell saat ini dan shell anaknya, tetapi tidak yang lain. Untuk alasan yang sama bahwa file seperti .bashrctidak dapat dieksekusi, jangan tandai sudo.bashdieksekusi dengan chmod. Ini benar-benar perpustakaan, bukan skrip shell mandiri. Jika Anda melakukannyajalankan sebagai skrip shell, itu akan mendefinisikan fungsi ... tetapi hanya di shell yang menjalankan skrip, bukan untuk Anda sebagai penelepon. (Tentu saja, Anda dapat menulis skrip untuk ini, itu tidak terjadi karena pendekatan yang saya ambil di sini.)
Untuk memeriksa dan melihat apakah sudosaat ini didefinisikan sebagai fungsi shell, dan untuk melihat definisi saat ini jika itu adalah salah satu, jalankan type sudo. Untuk menonaktifkan (mis. Undefine) fungsi setelah ditetapkan, jalankan unset -f sudo. Untuk secara manual menjalankan sudoperintah reguler secara langsung bahkan jika fungsi shell didefinisikan, jalankan command sudo. Namun, perhatikan bahwa Anda tidak harus melakukan itu, karena sudofungsi ini sebenarnya melakukan itu sendiri setiap kali ada lebih atau kurang dari dua argumen yang diteruskan ke sana atau argumen pertama yang diteruskan ke sana adalah apa pun kecuali cd. Itu sebabnya Anda masih bisa menggunakannya dengan cara yang biasa digunakan orang sudo.
Perhatikan juga bahwa fungsi shell yang ditunjukkan di atas masih memungkinkan Anda meneruskan argumen lain sudo, tetapi itu akan mencegahnya memperlakukan cdsecara khusus . Menjalankan khususnya tidak didukung, meskipun Anda dapat memperluas fungsi shell untuk mendukung kasing itu. Tidak juga . Shell yang dibuatnya mirip dengan apa yang Anda dapatkan . Kode tidak benar-benar berjalan , tetapi menggunakan , sehingga opsi berfungsi dengan baik. Ini benar-benar berjalan dua kali ketika Anda lulus dan argumen direktori untuk itu (dan nol kali sebaliknya). Saat Anda menjalankan , pertama itu memotong shell bash terpisah dari yang Anda menjalankan fungsi dan mengubah direktori. Jika itu berhasil, itu menggantikansudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo bash shell dengan yang baru dan interaktif yang bisa Anda gunakan.
Berikut adalah contoh bagaimana shell berfungsi secara otomatis "melakukan hal yang benar." Perhatikan bahwa sudo ls -A /rootberperilaku normal. Hanya ketika saya kemudian mencoba untuk cdke direktori dengan sudoshell baru dibuat, dan saya diingatkan secara eksplisit tentang apa yang terjadi.
ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude .bashrc .config .emacs.d .nano .rpmdb
.bash_history .cache .dbus .local .profile
ek@Io:~$ sudo -k # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$
Jika Anda mencoba ke sudo cddirektori yang tidak dapat Anda ubah bahkan sebagai root, maka Anda hanya akan mendapatkan pesan kesalahan:
ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$
Saya telah menggunakan sudo -kdi antara doa dalam contoh di atas untuk menunjukkan bahwa itu mengotentikasi Anda sebagai root sebelum mencoba mengubah direktori. Tetapi Anda sebenarnya tidak harus lari sudo -ksendiri. Karena fungsi shell hanyalah pembungkus tipis untuk sudoperintah sebenarnya , caching kredensial Anda dan sudoperilaku umum lainnya masih berfungsi secara normal.
Meskipun itu bekerja dengan baik dan agak rapi, saya akui bahwa membayangi sudoperintah sebenarnya dengan fungsi dengan nama yang sama adalah super aneh. Sebagian besar pengguna mungkin akan hanya ingin melakukan langkah-langkah sudo -s, sendiri. Tetapi kalau-kalau ada yang menginginkan ini - dan juga untuk menunjukkan bahwa itu mungkin - itu dia.cd directory
ls -ldirektori itu sendiri.