Aku punya script yang mengeksekusi tiga fungsi: A && B && C
.
Fungsi B
perlu dijalankan sebagai pengguna super, sementara A
dan C
tidak.
Saya punya beberapa solusi tetapi tidak ada yang memuaskan:
sudo seluruh skrip:
sudo 'A && B && C'
Tampaknya itu ide buruk untuk dijalankan
A
danC
sebagai pengguna super jika tidak diperlukanbuat skrip menjadi interaktif:
A && sudo B && C
Saya mungkin harus mengetikkan kata sandi, tetapi saya ingin agar skrip saya non-interaktif, karena setiap fungsi memerlukan waktu, dan saya tidak ingin skrip menunggu. Yah, itu juga mengapa itu skrip di tempat pertama, jadi saya tidak harus melihatnya berjalan.
Solusi bodoh:
sudo : && A && sudo -n B && C
Pertama tampaknya bodoh untuk menjalankan no-op
sudo
pertama, dan juga saya harus mengatakan bahwa A tidak akan mengambil lebih dari$sudo_timeout
.Solusi hipotetis (Saya harap Anda memberi tahu saya ada):
sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'
Itu akan meminta kata sandi saya di awal, dan kemudian menggunakan kredensial itu hanya ketika diperlukan.
Apa pendapat Anda tentang semua ini? Saya akan sangat terkejut bahwa tidak ada solusi untuk masalah itu, karena saya pikir itu adalah masalah yang cukup umum (bagaimana dengan make all && sudo make install
)
sumber
A
danC
secara eksplisit menggunakansu -l some_non_priviliged_user
. Tidak ada masalah batas waktu, dan tidak ada privelig untuk A dan C. Saya tidak berpikir bahwa 4 mungkin,sudo
tampaknya "keadaan global" bagi pengguna.Jawaban:
Saya pikir hal terbaik yang dapat Anda lakukan adalah meluncurkan skrip dengan
sudo
dan kemudian meluncurkan proses yang ingin Anda jalankan sebagai pengguna normal secara eksplisit dengansu user
atausudo -u user
:sumber
Tambahkan skrip Anda ke
/etc/sudoers
file denganNOPASSWD
atribut, sehingga diizinkan untuk berjalan tanpa diminta kata sandi. Anda dapat mengikat ini ke pengguna tertentu (atau set pengguna), atau membiarkannya dijalankansudo
oleh siapa saja di sistem Anda.Baris sampel untuk skrip yang dipanggil
/usr/local/bin/bossy
mungkin terlihat seperti iniDan Anda kemudian akan menggunakan sesuatu seperti ini
Untuk contoh ini saya berasumsi
PATH
termasuk/usr/local/bin
. Jika tidak, gunakan saja path lengkap ke skrip, yaitusudo /usr/local/bin/bossy
sumber
Anda mungkin ingin menggunakan
!requiretty
opsi inisudo
sertaNOPASSWD
opsi. Namun perlu diingat ini mengurangi keamanan.sumber
/etc/sudoers
entri untuk pengguna untuk menjalankan perintahB
denganNOPASSWD
adalah jawaban yang tepat.Membangun jawaban saya untuk pra-otorisasi sudo? (Agar bisa dijalankan nanti) , tulis dua skrip:
ABC_script
:B_script
:Jalankan
./ABC_script
:sudo -b ./B_script
. Ini meminta kata sandi ( segera setelah Anda menjalankanABC_script
). Dengan asumsi bahwa kata sandi yang benar dimasukkan, kata kunci itu akan munculB_script
di b ackground (karena-b
telah ditentukan) sebagai root. Ini tampaknya setara dengansudo sh -c "./B_script &"
.B_script
mulai berjalan secara tidak sinkron, bersamaan denganABC_script
.B_script
menguji keberadaan file yang dipanggilA_is_done
dan loop sampai muncul.ABC_script
berjalanA
. Jika / ketikaA
selesai dengan sukses, skrip membuat file bernamaA_is_done
.ABC_script
kemudian menguji keberadaan file yang dipanggilB_is_done
dan loop sampai muncul.B_script
mendeteksi keberadaanA_is_done
dan keluar dari loop. Ini menghapusA_is_done
file dan berjalanB
. Ingat,B_script
berjalan sebagai root, jadi itu berjalanB
sebagai root. Jika / ketikaB
selesai dengan sukses, skrip membuat file yang dipanggilB_is_done
dan keluar.ABC_script
mendeteksi keberadaanB_is_done
dan keluar dari loop. Ini menghapusB_is_done
file. Ingat,B_script
jalankan sebagai root, sehinggaB_is_done
dimiliki oleh root, dan Anda ingin menggunakannyarm -f
untuk menghindari permintaan konfirmasi.ABC_script
lalu lariC
dan keluar.Catatan untuk penyempurnaan lebih lanjut:
ABC_script
mungkin harus dijalankanB_script
oleh jalur absolut daripada./
.A_is_done
danB_is_done
,ABC_script
mungkin harus menghasilkan nama file acak dan unik.Perlu ada ketentuan untuk skrip yang menunggu giliran untuk diberi tahu jika program yang ditunggu telah selesai tetapi gagal. (Saat ini, jika
A
gagal, kedua skrip masuk ke loop tunggu tanpa batas.) Ini bisa sesederhana mengubahuntuk
dan kemudian memodifikasi spin-tunggu untuk membaca
X_is_done
file, dan lanjutkan jika itu berisi 0 dan keluar sebaliknya.sumber
Bodoh. gunakan banyak baris.
sumber
&&
A && sudo B && C
. Seperti yang dijelaskan Antoine dalam pertanyaan; ini tidak meminta kata sandi sampaiA
selesai, dan dia tidak ingin harus menunggu untuk itu, atau skrip menunggu untuknya.