Contoh scriptnya bisa seperti di bawah ini:
#!/bin/bash
sudo su
ls /root
Saat menggunakan ./test.sh
sebagai pengguna biasa, jalankan ls
sebagai pengguna super dan keluar, ia beralih ke root; dan ketika saya keluar, itu mengeksekusi ls /root
sebagai pengguna biasa.
Adakah yang bisa memberi tahu saya tentang mekanismenya?
Jawaban yang Diterima:
Perintah dalam skrip dijalankan satu per satu, secara independen. Skrip 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 membuat proses baru dengan hak akses root.
Setelah perintah su selesai, proses induk, yang masih berjalan sebagai pengguna yang sama, akan mengeksekusi skrip lainnya.
Yang ingin Anda lakukan adalah menulis skrip pembungkus. 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 sekelilingnya. Pada dasarnya periksa untuk melihat apakah itu berjalan sebagai root, jika tidak, gunakan "su" untuk meluncurkan kembali dirinya sendiri.
$0 adalah cara praktis untuk membuat skrip merujuk ke 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 eksekusi dan memulai program baru, diluncurkan oleh su, dengan root, untuk dijalankan dari atas. Instance pengganti adalah "root" sehingga tidak mengeksekusi sisi kanan ||