Apa tujuan "benar" di bash "jika sudo benar; kemudian"


20

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

2
Jika Anda akan membatalkan pertanyaan, harap bisakah Anda menjelaskan apa yang dapat saya lakukan untuk meningkatkan pertanyaan? Apakah ini bukan situs overflow yang tepat?
Matt Parkins

4
Tidak yakin dari mana downvote berasal; apakah Anda mencoba meniadakan pernyataan itu atau membatalkan pernyataan itu? Anda mengatakan Anda ingin menyingkirkan yang benar / gema dan "yang lain", jadi apa tujuan akhir Anda?
Jeff Schaller


1
@ ctrl-alt-delor mengikuti tautan itu yang tampaknya perlu saya lakukan hanyalah meletakkan tanda seru di depan sudo dan kemudian saya dapat menghapus echo dan yang lainnya, dan sekarang saya telah mengujinya, itu berfungsi, terima kasih.
Matt Parkins

2
Secara sepintas, Anda mungkin harus mengarahkan pesan kesalahan ke aliran kesalahan:echo "Aborting script" >&2
Toby Speight

Jawaban:


38

truedi bash bukan kata kunci, ini adalah program yang langsung keluar dengan kode keluar yang sukses. Demikian juga, falseadalah 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;

true
echo $? # 0
false
echo $? #1

if sudo truetidak setara dengan if sudo == true. if sudo truesedang menjalankan trueprogram menggunakan sudo, dan memeriksa kode keluar.

Karena itu:

if sudo false; thensedang menjalankan program falsesebagai sudo. Pengembaliannya akan selalu salah.

if sudo true == falseakan menjalankan program truedengan argumen ==dan falsemenggunakan sudo. Ini jelas bukan yang Anda inginkan.

if [!(sudo true)] sintaks tidak valid.

Apa yang mungkin Anda cari adalah

if ! sudo true;

12
Sebagai koreksi yang agak pedas untuk kalimat pertama: di bash , truedan false"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 trueakan menjalankan program mandiri, bukan bash builtin.
IMSoP

31
NB: rangkuman favorit saya truedan falseadalah judul-judul pada halaman manual mereka: true - do nothing, successfullydanfalse - do nothing, unsuccessfully
IMSoP

3
@ IMSoP Itu dalam.
brainplot

2
Jika truetidak 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.
nigel222

2
Dalam AT&T SYSV Unix, "true" adalah skrip shell / bin / true, yang terdiri dari pemberitahuan hak cipta besar dalam komentar ... dan tidak ada yang lain.
Lee Daniel Crocker

21

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 trueprogram seperti dijelaskan dalam jawaban yang diterima.


1
Intinya, ini. Alternatifnya bisa dengan mengecek apakah pengguna berada dalam grup sudoers, tetapi hanya menjalankannya sudo truejuga cukup mudah, walaupun agak hacky.
Sergiy Kolodyazhnyy

3
Perhatikan bahwa ini juga perlu sudodiinstal, 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.)
Mehrdad

1
OP ingin keluar jika Anda tidak bisa sudo, dan menyingkirkan dua baris daripada yang lain mengikuti noop.
mckenzm

2
Dan, sebaliknya, Anda juga bisa dapat sudotanpa berada di grup sudoers jika Anda (baik secara pribadi atau sebagai anggota dari beberapa grup lain ) terdaftar di /etc/sudoers. Tetapi bahkan sudo truetidak bisa salah, karena sudoakses dapat diberikan hanya untuk perintah tertentu, sehingga Anda mungkin dapat sudo true, tetapi tidak untuk sudo something_else, atau sebaliknya. Tidak ada cara berbalut besi untuk menguji selain dengan mencoba menjalankan perintah yang sebenarnya ingin Anda jalankan sudo.
Dave Sherohman

2
Selain itu, Anda dapat berada dalam sudoersgrup dan tidak dapat melakukannya sudokarena sudoersgrup tersebut tidak tercantum dalam sudoersfile. Grup dengan empat huruf sudodalam namanya bukan indikasi yang valid apakah pengguna dalam grup itu dapat melakukan hal tertentu atau apa pun yang menggunakan sudo.
jrw32982 mendukung Monica

5

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.


1
Satu-satunya perintah yang dijalankan melalui sudo ada sudo truedan sudo -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.
ilkkachu

Saya menulis: "Jadi dalam hal ini jika mereka perlu menjalankan perintah apa pun dengan sudo, ia memeriksa pada awalnya, menanyakan kata sandi hanya satu kali."
Luciano Andress Martini
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.