Saya memiliki skrip bash yang panjang dan berjalan lama di mana beberapa perintah perlu dijalankan sebagai root sementara mayoritas perintah harus dijalankan sebagai pengguna biasa sebelum sudo, karena itu akan mengacaukan kepemilikan file dan semacamnya.
Saya datang dengan beberapa metode, tetapi masing-masing memiliki beberapa masalah
Metode 1: Menggunakan sudo di dalam file
#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"
Ini akan terlihat bagus, dari cara kode ditulis. sudo
ditulis sebelum beberapa pernyataan yang sebenarnya perlu dijalankan oleh root, tetapi jika waktu antara setiap sudo
panggilan terlalu lama sudo
lagi meminta kata sandi. Juga, jika eksekusi pertama sudo
gagal, misalnya karena kata sandi tidak valid, sisa skrip masih dieksekusi.
Metode 2: menggunakan sudo untuk memanggil file dan kemudian kembali ke pengguna asli saat diperlukan
#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"
Ini juga menyebalkan, karena saya perlu menambahkan su username -c
di depan hampir setiap baris. Juga menemukan nama pengguna asli setelah sudo
itu mungkin, tetapi rumit.
Apakah ada cara yang lebih baik?
Sunting: Saya hanya memposting skrip kecil yang tidak masuk akal di sini untuk menunjukkan apa yang saya bicarakan. Dalam skrip yang sebenarnya saya memiliki beberapa baris yang memerlukan sudo (layanan mulai dan berhenti), beberapa baris di mana tidak masalah jika ada sudo dan cukup banyak baris yang benar-benar perlu dijalankan tanpa sudo.
sudo
jika perlu memiliki izin yang lebih tinggi. Tapi tidak ada gunanya beralihsu username -c
ke menjalankanecho
. Dengan kata lain, ini terdengar seperti [XY]. Bisakah Anda mengedit dan menjelaskan apa yang sebenarnya akan dilakukan skrip Anda dan mengapa Anda merasa harus sering berganti pengguna?man sudo
?-v, --validate
'Perbarui kredensial yang di-cache pengguna, diautentikasi jika perlu. Untuk plugin sudoers, ini memperpanjang batas waktu sudo selama 15 menit secara default, tetapi tidak menjalankan perintah. Tidak semua kebijakan keamanan mendukung kredensial yang di-cache. ' (Jika Anda menjalankannya cukup sering, sudo autentikasi seharusnya tidak habis.)Jawaban:
Mengenai metode 2, lebih mudah menggunakan fungsi. Sebagai contoh:
$SUDO_USER
adalah nama pengguna sudoer. Anda juga bisa menggunakannya$(logname)
sebagai gantinya.Berjalan di mesin saya:
sumber
Dengan membaca
man sudoers
, orang melihat:Dengan demikian, Anda dapat mengizinkan
regular
hostmachine1
untuk mengeksekusicommand1
dancommand2
sebagai root, tanpa otentikasi kata sandi dengan:tapi baca masing-masing
man -k sudo
untuk detailnya.sumber
Mungkin ini bisa membantu:
chmod 775 milikmu script.sh
Kemudian Anda dapat menggunakan sudo di dalam skrip (tanpa kata sandi) dan tidak dapat menggunakan sudo untuk perintah lain di dalam skrip Anda.
sumber
chmod 775
hanya memungkinkan Anda untuk mengeksekusi file dan tidak mengubah pengguna yang mengeksekusi file atau hak-hak mereka.