GNU/Linux >> Belajar Linux >  >> Linux

Mengapa "Sudo Su" Dalam Skrip Shell Tidak Menjalankan Skrip Lainnya Sebagai Root?

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 ||


Linux
  1. Bagaimana Menjalankan Perintah Sebagai Administrator Sistem (root)?

  2. Mengapa Skrip Bash Tidak Mengenal Alias?

  3. Mengapa ~/.bash_profile Tidak Berfungsi?

  1. Cara Membuat Script Shell Selalu Jalankan Sebagai Root?

  2. Linux – Mengapa Kernel Tidak Dapat Menjalankan Init?

  3. Dari Mana Skrip Shell Dijalankan?

  1. Bagaimana Cara Membuat Skrip A Sebagai Root Secara Retroaktif?

  2. Arti dari $? Dalam Skrip Shell?

  3. Cara menjalankan skrip Python dari shell