Jika saya sudo mengeksekusi file skrip Bash, akankah semua perintah di dalam skrip Bash juga dieksekusi sebagai sudo?

30

Saya ingin menulis skrip pasca-instalasi otomatis di Bash (disebut post-install.sh, misalnya). Skrip akan secara otomatis menambah dan memperbarui repositori, menginstal dan memperbarui paket, mengedit file konfigurasi, dll.

Sekarang, jika saya menjalankan skrip ini, misalnya dengan sudo post-install.sh, apakah saya hanya akan diminta sudokata sandi sekali, atau akankah saya perlu memasukkan sudokata sandi pada setiap permintaan perintah di dalam skrip, yang memerlukan sudoizin? Dengan kata lain, apakah perintah di dalam skrip bash 'mewarisi' izin eksekusi, jadi untuk berbicara?

Dan, jika mereka memang melakukan , masih ada kemungkinan bahwa sudoizin akan waktu (jika, misalnya, perintah tertentu membutuhkan waktu cukup panjang melebihi sudobatas waktu)? Atau akankah sudokata sandi masuk yang pertama berlangsung selama durasi keseluruhan skrip?

Dabbler yang Layak
sumber
4
Anda mungkin tertarik untuk melihat beberapa alat yang dirancang khusus untuk tugas ini. 3 yang umum adalah: Wayang, koki, dan ancible.
Spuder
@spuder, dan untuk skala yang lebih besar, arsitektur tingkat perusahaan dan keamanan manajemen konfigurasi Anda, Anda dapat menggunakan CFEngine 3. (Bukan untuk yang lemah hati, atau untuk perintah satu kali.)
Wildcard

Jawaban:

38

T # 1: Apakah saya hanya akan diminta kata sandi sudo sekali, atau akankah saya perlu memasukkan kata sandi sudo pada setiap permintaan perintah di dalam skrip, yang memerlukan izin sudo?

Ya, sekali, selama menjalankan skrip Anda.

CATATAN: Saat Anda memberikan kredensial sudo, otentikasi biasanya baik selama 5 menit di dalam shell tempat Anda mengetik kata sandi. Selain itu setiap proses anak yang dieksekusi dari shell ini, atau skrip apa pun yang berjalan di shell (kasing Anda) juga akan berjalan pada level yang lebih tinggi.

T # 2: apakah masih ada kemungkinan bahwa izin sudo akan habis (jika, misalnya, perintah tertentu membutuhkan waktu yang cukup lama untuk melebihi batas waktu sudo)? Atau apakah pintu masuk sudo kata sandi awal akan bertahan selama seluruh naskah?

Tidak, mereka tidak akan kehabisan waktu dalam skrip. Hanya jika Anda secara interaktif mengetiknya di dalam shell di mana kredensial diberikan. Setiap kali sudodieksekusi dalam shell ini, batas waktu diatur ulang. Tetapi dalam kasus Anda kredensial mereka akan tetap selama skrip mengeksekusi dan menjalankan perintah dari dalamnya.

kutipan dari halaman manual sudo

Batas ini khusus untuk kebijakan; batas waktu prompt kata sandi default untuk kebijakan keamanan sudoers adalah 5 menit.

slm
sumber
1
Jawaban untuk Q1 adalah "Tidak, Anda tidak akan diminta lagi."
dannysauer
@dannysauer - baca Q-nya lagi. Saya mengatakan Ya untuk diminta kata sandi hanya sekali!
slm
Pertanyaannya mengatakan "apakah itu a atau b", dan hanya mengatakan "ya" tidak menjelaskan apakah itu "ya, a" atau "ya, b". Hanya mencoba mengklarifikasi hal-hal untuk pembaca masa depan. : D
dannysauer
@dannysauer - lihat pembaruan.
slm
1
Pertanyaan baru ini adalah: stackoverflow.com/questions/3522341/… . sudo -u $(logname) <command>harus bekerja.
Gauthier
17

bashdan semua proses turunannya akan berjalan dengan izin pengguna super. Jadi Anda tidak perlu memasukkan kembali kata sandi untuk perintah dalam skrip bash Anda.

Batas sudowaktu hanya berlaku untuk (nanti) doa terpisah dari sudo. Itu tidak akan memengaruhi proses bash Anda yang sudah berjalan, atau keturunannya.

Laurence Gonsalves
sumber
3

Semua jawaban ini mungkin benar. Namun, ini bukan cara yang umum digunakan (sejauh yang saya ketahui) untuk membuat skrip bash yang memerlukan sudoizin. Secara umum, di bagian atas skrip Anda menganggap itu belum dijalankan dengan sudoizin dan sebaliknya memanggil sudo -vdiri Anda (yang akan meminta pengguna untuk kata sandi mereka) untuk 'mengatur' a sudo'sesi'. Anda bisa echobeberapa teks penjelasan sebelum prompt, atau menimpa sudoprompt sendiri dengan -pswitch, untuk memberi tahu pengguna bahwa Anda memerlukan sudoakses untuk beberapa perintah.

Kemudian, dalam skrip Anda, Anda akan baik-baik saja untuk memanggil sudoperintah yang memerlukannya (dan hanya perintah itu yang membutuhkannya) tanpa permintaan kata sandi lebih lanjut. Jika Anda berpikir sekelompok perintah tertentu yang berjalan bersama dalam skrip Anda (terlepas dari penggunaannya sendiri sudo) akan melampaui batas waktu sudo, Anda dapat memanggil sudo -vdi tengah untuk mengeluarkan semacam sudosesi 'tetap hidup' di ' '

Jika sudo'sesi' benar-benar kedaluwarsa selama skrip, pengguna hanya akan diminta kata sandi mereka saat berikutnya Anda mengeluarkan perintah sudo dalam skrip.

alexrussell
sumber
1
Katakan bahwa salah satu langkah dari skrip adalah membangun kernel linux yang sama sekali baru, yang bisa memakan waktu dua jam. Menjaga sesi tetap hidup bisa menjadi tantangan, bagaimana Anda menghadapinya?
Gauthier
Kamu tidak bisa Tapi lain kali Anda meneleponnya sudo -vakan meminta kata sandi pengguna lagi. Bukan masalah terburuk menurut saya. Mungkin untuk membantu, membuat pengguna sadar akan mekanismenya mungkin berguna.
alexrussell
Kebalikan dari ini adalah mengharuskan pengguna untuk memanggil skrip dengan sudo per jawaban lain, dan kemudian sudo -u $SUDO_USERmembuat semua perintah yang tidak membutuhkan root berjalan tidak terangkat. Sayangnya itu menambahkan lebih banyak kode, tetapi merupakan satu-satunya cara yang dapat diandalkan untuk melakukan hal-hal root dalam proses yang berjalan lama.
dragon788
Saya kira saya harus menjelaskan, lain cara lain untuk melakukan hal ini akan memanggil sudo sekali di awal script untuk menempatkan file sementara ke /etc/sudoers.dmenggunakan visudo -c -f /tmp/tempsudoersuntuk memastikan file tersebut valid sebelum menyalin ke tempat, dan kemudian menghapus file yang pernah dilakukan (menggunakan jebakan saat keluar / kesalahan untuk memastikan eskalasi tidak dapat disalahgunakan). Implementasi yang paling aman dan aman hanya akan memungkinkan pengguna Anda untuk menjalankan perintah khusus dalam skrip Anda dengan argumen spesifik tanpa menggunakan kata sandi NOPASSWDdengan menyimpan setiap perintah / argumen ke dalam array untuk membangun file.
dragon788
Agak terlambat kembali ke @Gauthier di sini tetapi akan tampak bahwa saya salah ketika saya mengatakan Anda tidak dapat menjaga sudosesi tetap hidup jika satu tugas tertentu memakan waktu lebih lama daripada batas waktu. Saya menemukan teknik ini suatu hari di repo dotfiles Mathias Bynens: while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
alexrussell