Saya telah meretas bersama skrip bash ini yang menguji apakah pengguna memiliki hak pengguna super dan jika mereka tidak meminta mereka. Pada akhirnya saya mencoba untuk membalikkan pernyataan 'jika' kedua sehingga saya dapat menghapus dua baris berikut (gema "kata sandi ok" dan yang lainnya pada baris berikut)
# Root user only
if [[ "$EUID" != 0 ]]; then
sudo -k # make sure to ask for password on next sudo
if sudo true; then
echo "Password ok"
else
echo "Aborting script"
exit 1
fi
fi
echo "do my ops"
Apakah tujuan "benar" pada baris keempat hanyalah pernyataan nol?
Saya perlu membalikkan tes pada baris keempat, bagaimana saya melakukannya? Inilah yang saya coba:
if sudo false; then
if sudo true == false; then
if [!(sudo true)]; then
echo "Aborting script" >&2
Jawaban:
true
di bash bukan kata kunci, ini adalah program yang langsung keluar dengan kode keluar yang sukses. Demikian juga,false
adalah program yang keluar dengan kode keluar yang tidak berhasil.Anda dapat mencoba ini dengan menjalankan kedua program dari terminal Anda, dan kemudian membaca
$?
variabel, yang berisi kode keluar dari program terakhir;if sudo true
tidak setara denganif sudo == true
.if sudo true
sedang menjalankantrue
program menggunakansudo
, dan memeriksa kode keluar.Karena itu:
if sudo false; then
sedang menjalankan programfalse
sebagai sudo. Pengembaliannya akan selalu salah.if sudo true == false
akan menjalankan programtrue
dengan argumen==
danfalse
menggunakansudo
. Ini jelas bukan yang Anda inginkan.if [!(sudo true)]
sintaks tidak valid.Apa yang mungkin Anda cari adalah
sumber
true
danfalse
"builtin", perintah ditafsirkan langsung oleh shell; dalam sistem mirip Unix secara umum , mereka juga ada sebagai program mandiri pada sistem file. Perbedaannya tidak terlalu penting di sini, tetapi sejauh yang saya tahu,sudo true
akan menjalankan program mandiri, bukan bash builtin.true
danfalse
adalah judul-judul pada halaman manual mereka:true - do nothing, successfully
danfalse - do nothing, unsuccessfully
true
tidak ada, kode dalam pertanyaan menunjukkan mengapa orang perlu menemukannya! Ini adalah program minimal yang hanya bisa gagal jika sistem yang dihidupkannya benar-benar rusak. Jadi seseorang dapat menggunakannya untuk menetapkan apakah kredensial aksesnya OK.Saya merasa jawaban yang diterima tidak benar-benar menjawab pertanyaan Anda?
The Tujuan melakukan hal ini adalah untuk memeriksa bahwa Anda dapat benar-benar
sudo
.Cara pemeriksaan ini dilakukan adalah melalui
true
program seperti dijelaskan dalam jawaban yang diterima.sumber
sudo true
juga cukup mudah, walaupun agak hacky.sudo
diinstal, sehingga cek tidak akan sepenuhnya setara ... Anda bisa berada di grup sudoers dan masih tidak dapat sudo. (Ini terutama bisa muncul jika Anda misalnya menulis skrip untuk menyiapkan gambar baru dari tarball rootfs minimal, yang mungkin tidak memiliki sudo.)sudo
tanpa berada di grup sudoers jika Anda (baik secara pribadi atau sebagai anggota dari beberapa grup lain ) terdaftar di/etc/sudoers
. Tetapi bahkansudo true
tidak bisa salah, karenasudo
akses dapat diberikan hanya untuk perintah tertentu, sehingga Anda mungkin dapatsudo true
, tetapi tidak untuksudo something_else
, atau sebaliknya. Tidak ada cara berbalut besi untuk menguji selain dengan mencoba menjalankan perintah yang sebenarnya ingin Anda jalankansudo
.sudoers
grup dan tidak dapat melakukannyasudo
karenasudoers
grup tersebut tidak tercantum dalamsudoers
file. Grup dengan empat hurufsudo
dalam namanya bukan indikasi yang valid apakah pengguna dalam grup itu dapat melakukan hal tertentu atau apa pun yang menggunakansudo
.Seperti yang saya lihat di skrip ini. Hanya memeriksa apakah sudo diaktifkan, itu saja ..
true hanya mengembalikan true.
Jadi dalam hal ini jika mereka perlu menjalankan perintah apa pun dengan sudo, ia memeriksa di awal, menanyakan kata sandi hanya satu kali.
Kondisi kerjanya seperti ini: jika sudo mengeksekusi perintah yang benar dengan benar, itu akan mengembalikan true untuk kondisi if, maka sudo diaktifkan dan pengguna mengetik kata sandi dengan benar, jika Anda salah memasukkan kata sandi atau sudo tidak diaktifkan, skrip tidak boleh dilanjutkan.
Perintah lain tidak perlu menanyakan kata sandi sudo, karena otentikasi Anda berhasil pertama kali (tetapi ini tergantung pada konfigurasi sudo, jadi skrip ini sangat tergantung pada konfigurasi lingkungan)
'Kata sandi gema ok' juga menunjukkan hal itu. skrip shell tidak akan menanyakan kata sandi lagi.
sumber
sudo true
dansudo -k
. Yang terakhir secara eksplisit tidak memerlukan kata sandi. Tidak ada perintah lain dalam skrip yang dijalankan melalui sudo, jadi tentu saja mereka tidak akan memerlukan kata sandi, terlepas dari apakah otentikasi berhasil pertama kali.