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 directory
bash
sudo
sudo
Seperti yang disajikan dalam jawaban lain, sebagian besar pengguna tidak ingin repot melakukan itu, tetapi sebaliknya ingin:
- Jalankan
sudo -s
, atau sudo -i
jika Anda ingin shell login (ingat bahwa salah satu efeknya sudo -i
adalah untuk memulai Anda di direktori home root), atau sudo bash
jika Anda ingin memaksa bash
atau 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
exit
untuk 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 sudo
diikuti oleh cd
, dan hanya berjalan secara sudo
normal 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 exit
keluar 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 sudo
tanpa -s
, -i
atau 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 sudo
sehingga Anda mungkin hanya ingin mengaktifkannya sesekali. Dalam hal ini, lebih baik untuk meletakkannya di file sendiri. Jika Anda membuat file yang disebut sudo.bash
di direktori home Anda dengan konten-konten itu, maka Anda dapat membuat sudo
fungsi tersedia - sehingga itu akan berjalan alih-alih sudo
perintah 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 .bashrc
tidak dapat dieksekusi, jangan tandai sudo.bash
dieksekusi 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 sudo
saat 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 sudo
perintah reguler secara langsung bahkan jika fungsi shell didefinisikan, jalankan command sudo
. Namun, perhatikan bahwa Anda tidak harus melakukan itu, karena sudo
fungsi 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 cd
secara 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 directory
sudo -i cd directory
sudo -s
sudo -s
sudo bash
-c
bash
cd
sudo cd directory
sudo
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 /root
berperilaku normal. Hanya ketika saya kemudian mencoba untuk cd
ke direktori dengan sudo
shell 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 cd
direktori 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 -k
di 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 -k
sendiri. Karena fungsi shell hanyalah pembungkus tipis untuk sudo
perintah sebenarnya , caching kredensial Anda dan sudo
perilaku umum lainnya masih berfungsi secara normal.
Meskipun itu bekerja dengan baik dan agak rapi, saya akui bahwa membayangi sudo
perintah 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 -l
direktori itu sendiri.