Anda dapat mengatur loop yang berjalan di latar belakang untuk secara berkala mengeksekusi "sudo -v", triknya tentu saja adalah mendapatkan loop untuk mengakhiri dengan bersih ketika skrip Anda berakhir. Jadi harus ada beberapa jenis komunikasi antara kedua proses; File tmp baik untuk ini, dan mereka dapat dengan mudah dibersihkan setelah skrip berjalan juga. (Lagi pula, skrip instal biasanya melakukan ini.)
Misalnya (hapus pernyataan 'gema' untuk menggunakan ini; ini hanya menunjukkan itu "berfungsi"):
#!/bin/bash
log=running_setup.txt
sudo_stat=sudo_status.txt
echo "========= running script $$ ========"
echo $$ >> $sudo_stat
trap 'rm -f $sudo_stat >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 15
sudo_me() {
while [ -f $sudo_stat ]; do
echo "checking $$ ...$(date)"
sudo -v
sleep 5
done &
}
echo "=setting up sudo heartbeat="
sudo -v
sudo_me
echo "=running setup=" | tee $log
while [ -f $log ]
do
echo "running setup $$ ...$(date) ===" | tee -a $log
sleep 2
done
# finish sudo loop
rm $sudo_stat
Maka Anda akan melihat ... (catatan: pid dimasukkan ke dalam file tmp, supaya Anda dapat dengan mudah membunuhnya. Namun, tidak perlu):
$ ./do_it.sh
========= running script 6776 ========
=setting up sudo heartbeat=
[sudo] password for user:
=running setup=
checking 6776 ...Wed May 4 16:31:47 PDT 2011
running setup 6776 ...Wed May 4 16:31:48 PDT 2011 ===
running setup 6776 ...Wed May 4 16:31:50 PDT 2011 ===
running setup 6776 ...Wed May 4 16:31:52 PDT 2011 ===
checking 6776 ...Wed May 4 16:31:53 PDT 2011
running setup 6776 ...Wed May 4 16:31:54 PDT 2011 ===
<ctrl-c> (cleans up files, then exits)
Berdasarkan intisari ini , saya telah membuat versi yang ringkas dan bersih:
sumber
sudo -K
dipanggil di tempat lain dari skrip shell, versi Anda akan berteriaksudo: a password is required
ke stderr setiap menit.Menurut
sudo
halaman manual:Jadi saya kira jika Anda menambahkan beberapa
sudo -v
poin skrip pengaturan Anda untuk memvalidasi sesi (dan tidak hanya di awal), Anda akan mendapatkan apa yang Anda inginkan, karena setiap kali akan menambah batas waktu (hanya meminta kata sandi lagi jika batas waktu tercapai). Satu-satunya masalah adalah jika ada perintah pada skrip Anda yang membutuhkan lebih banyak waktu daripada batas waktu (jadi meskipun Anda memvalidasi tepat setelah itu, batas waktu akan berakhir sebelum menyelesaikan untuk validasi lain), tetapi ini adalah kasus yang sangat spesifik.Apa yang terjadi adalah bahwa menggunakan
sudo
saja tidak menambah batas waktu, dansudo -v
tidak menjalankan perintah, jadi Anda harus menggunakansudo -v
lebih banyak waktu untuk memvalidasi sesi.sumber
Berdasarkan intisari yang disediakan oleh Gregory Perkins dan pengalaman saya, inilah one-liner saya:
Atau
Penjelasan
trap "exit" INT TERM; trap "kill 0" EXIT
: Ini akan mencatat seluruh pohon proses saat keluar atau SIGINT / SIGTERM.sudo -v || exit $?
: Minta kata sandi di muka dan tembolok kredensial keamanan, tetapi jangan jalankan perintah. Jika kata sandi salah, keluar dengan kode yang dikembalikan oleh sudo.sleep 1
: Menunda sedikit agar kredensial keamanan disimpan secara efektif. Jika sudo berikutnya berjalan terlalu cepat, ia tidak akan mengetahuinya karena kredensial belum disimpan, sehingga akan meminta kata sandi lagi.while true; do sleep 60; sudo -nv; done 2>/dev/null &
: Perbarui kredensial keamanan sudo yang ada berulang kali. Perhatikan bahwa versi ini berbeda dari salah satu intisari tertaut: berjalansleep 60
pertama, dan kemudiansudo -nv
.The
&
Operator menempatkan seluruhwhile
lingkaran ke latar belakang, menjalankannya sebagai proses anak.The
2>/dev/null
mengarahkan stderr dariwhile
loop untuk kekosongan, sehingga pesan error yang dihasilkan oleh setiap perintah dalam loop akan dibuang.The
-n
pilihan untuksudo
mencegah dari mendorong pengguna untuk password, tetapi menampilkan pesan kesalahan dan keluar jika diperlukan password.Tidak ada
kill -0 "$$" || exit
di intisari tertaut, karena dua yang pertamatrap
akan melakukan pekerjaan. Tidak perlu tidur selama 59 detik sebelum mengetahui proses induknya tidak berjalan!sumber