Perintah dalam sebuah skrip mengeksekusi satu per satu, secara independen. Script itu sendiri sebagai induk dari semua perintah dalam skrip, adalah proses independen lainnya dan perintah su tidak dan tidak dapat mengubahnya menjadi root: perintah su menciptakan proses baru dengan hak akses root.
Setelah perintah su selesai, proses induk, masih berjalan sebagai pengguna yang sama, akan mengeksekusi sisa skrip.
Yang ingin Anda lakukan adalah menulis skrip wrapper. Perintah istimewa masuk ke skrip utama, misalnya~/main.sh
#!/bin/sh
ls /root
Skrip wrapper memanggil skrip utama dengan izin root, seperti ini
#!/bin/sh
su -c ~/main.sh root
Untuk meluncurkan proses ini, Anda menjalankan pembungkus, yang pada gilirannya meluncurkan skrip utama setelah mengalihkan pengguna ke pengguna root.
Teknik pembungkus ini dapat digunakan untuk mengubah skrip menjadi pembungkus di sekitarnya. Pada dasarnya periksa untuk melihat apakah itu berjalan sebagai root, jika tidak, gunakan "su" untuk meluncurkan kembali sendiri.
$ 0 adalah cara praktis untuk membuat skrip merujuk pada dirinya sendiri, dan perintah whoami dapat memberi tahu kita siapa kita (apakah kita root?)
Jadi skrip utama dengan pembungkus bawaan menjadi
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
Perhatikan penggunaan exec. Ini berarti "ganti program ini dengan", yang secara efektif mengakhiri pelaksanaannya dan memulai program baru, diluncurkan oleh su, dengan root, untuk berjalan dari atas. Instance pengganti adalah "root" sehingga tidak menjalankan sisi kanan ||
sudo su
membuat mataku sakit.