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 sudo
kata sandi sekali, atau akankah saya perlu memasukkan sudo
kata sandi pada setiap permintaan perintah di dalam skrip, yang memerlukan sudo
izin? Dengan kata lain, apakah perintah di dalam skrip bash 'mewarisi' izin eksekusi, jadi untuk berbicara?
Dan, jika mereka memang melakukan , masih ada kemungkinan bahwa sudo
izin akan waktu (jika, misalnya, perintah tertentu membutuhkan waktu cukup panjang melebihi sudo
batas waktu)? Atau akankah sudo
kata sandi masuk yang pertama berlangsung selama durasi keseluruhan skrip?
sumber
Jawaban:
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.Tidak, mereka tidak akan kehabisan waktu dalam skrip. Hanya jika Anda secara interaktif mengetiknya di dalam shell di mana kredensial diberikan. Setiap kali
kutipan dari halaman manual sudosudo
dieksekusi dalam shell ini, batas waktu diatur ulang. Tetapi dalam kasus Anda kredensial mereka akan tetap selama skrip mengeksekusi dan menjalankan perintah dari dalamnya.sumber
sudo -u $(logname) <command>
harus bekerja.bash
dan semua proses turunannya akan berjalan dengan izin pengguna super. Jadi Anda tidak perlu memasukkan kembali kata sandi untuk perintah dalam skrip bash Anda.Batas
sudo
waktu hanya berlaku untuk (nanti) doa terpisah darisudo
. Itu tidak akan memengaruhi proses bash Anda yang sudah berjalan, atau keturunannya.sumber
Semua jawaban ini mungkin benar. Namun, ini bukan cara yang umum digunakan (sejauh yang saya ketahui) untuk membuat skrip bash yang memerlukan
sudo
izin. Secara umum, di bagian atas skrip Anda menganggap itu belum dijalankan dengansudo
izin dan sebaliknya memanggilsudo -v
diri Anda (yang akan meminta pengguna untuk kata sandi mereka) untuk 'mengatur' asudo
'sesi'. Anda bisaecho
beberapa teks penjelasan sebelum prompt, atau menimpasudo
prompt sendiri dengan-p
switch, untuk memberi tahu pengguna bahwa Anda memerlukansudo
akses untuk beberapa perintah.Kemudian, dalam skrip Anda, Anda akan baik-baik saja untuk memanggil
sudo
perintah 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 sendirisudo
) akan melampaui batas waktu sudo, Anda dapat memanggilsudo -v
di tengah untuk mengeluarkan semacamsudo
sesi '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.sumber
sudo -v
akan meminta kata sandi pengguna lagi. Bukan masalah terburuk menurut saya. Mungkin untuk membantu, membuat pengguna sadar akan mekanismenya mungkin berguna.sudo -u $SUDO_USER
membuat 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./etc/sudoers.d
menggunakanvisudo -c -f /tmp/tempsudoers
untuk 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 sandiNOPASSWD
dengan menyimpan setiap perintah / argumen ke dalam array untuk membangun file.sudo
sesi 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