Pertanyaan Saat menggunakan && dan sudo pada perintah pertama, apakah perintah kedua dijalankan sebagai sudo juga?


Jika saya menjalankan perintah.

sudo some-command && some-other-command

Apakah perintah kedua dijalankan dengan sudo previlege juga?


55
2018-06-10 11:32


asal




Jawaban:


TL; DR: TIDAK


Perintah pertama adalah

sudo some-command

Perintah kedua adalah

some-other-command

Perintah sudo mengambil perintah berikut dan mengeksekusinya dengan hak istimewa tinggi. Itu &&Namun, bukan milik perintah dan ditafsirkan oleh shell, sebelum mengeksekusi perintah pertama. Ini memberitahu bash untuk pertama mengeksekusi perintah pertama, dan pada keberhasilan yang kedua.

Sehingga sudo tidak tahu tentang && some-other command. Ketika proses yang ditinggikan berakhir, bash mengambil nilai kembalinya, dan kemudian mengeksekusi perintah lainnya, yang lagi-lagi tidak tahu yang pertama.

Ini dapat ditunjukkan dengan mudah:

$ sudo whoami && whoami
root
username

Untuk mencapai apa yang Anda inginkan, Anda dapat memulai bash yang ditinggikan, dan membiarkannya menjalankan kedua perintah:

$ sudo bash -c 'whoami && whoami'
root
root

Jadi sekarang, kedua perintah dieksekusi sebagai root, karena seluruh proses yang dijelaskan di atas dijalankan dalam proses yang ditinggikan, yaitu sesi bash dimulai dengan perintah ini, yang segera keluar setelah selesai. Namun, keduanya whoamis tidak tahu keberadaan satu sama lain.

Ini tidak sesuai dengan tujuan apa pun tetapi untuk demonstrasi ini, cara yang lebih mudah adalah melakukannya dengan mudah

sudo some-command && sudo some-other-command

103
2018-06-10 11:44



+1 untuk whoami contoh. - Carl H
Di-Tweet twitter.com/StackExchange/status/609076664795033600 - Tim
Demonstrasi ini sangat keren! Harus memikirkannya ketika mencoba mengajarkan sudo kepada orang lain lain kali! - Fragmentation Needed


Tidak. Beberapa contoh yang melakukan ini adalah:

sudo some-command && sudo some-other-command 
sudo sh -c "some-command && some-other-command"

atau jika Anda menginginkan perintah sarang, Anda bahkan dapat melakukannya:

sudo bash <<"EOF"
some-command
some-other-command
sudo bash <<"EOF2"
    some-command2
    some-other-command2
EOF2
EOF
  • Yang ke-2 menggunakan shell lain.
  • Ingatlah bahwa ketika Anda menggunakan 'atau' dalam versi ke-2, Anda harus menghindarinya dalam perintah atau parameter dari perintah itu (mis. \ 'Atau \ ") sehingga dapat menjadi rumit dengan sangat cepat.

18
2018-06-10 11:41



Metode ketiga tidak berfungsi: $ sudo -s -- whoami && whoami memberi root  username - BartekChom
@BartekChom maaf saya melewatkan tanda kutip pada yang satu itu - Rinzwind
sudo -s -- "whoami && whoami" tampaknya memberi perintah tidak ditemukan, kurang lebih sama dengan perintah "whoami && whoami". Bagaimana cara menggunakan konstruksi ini dengan &&? saya melihat bahwa sudo -s cd .. tidak memberikan kesalahan sebagai lawan sudo cd ... - BartekChom
Saya telah belajar sesuatu yang baru hari ini: sudo bash <<"EOF"! Terima kasih! :-) - Fabby


Tidak, Anda harus menulis sudo dua kali, atau melakukan sesuatu seperti

sudo bash -c 'foo && bar'

4
2018-06-10 11:41





&& berarti bahwa perintah sisi kanan (kedua) hanya akan berjalan hanya jika perintah paling tidak (pertama) berhasil, yaitu kode keluar $? aku s 0.

Kedua perintah berbeda satu sama lain dan akan berjalan di lingkungan mereka sendiri sehingga perintah kedua tidak akan berjalan sudo hak istimewa.

Ini akan membuat Anda jelas:

$ sudo whoami && whoami 
root
foobar

2
2018-06-10 11:49





Di baris perintah, ketika Anda melihat

$ command one && command two

maksudnya adalah mengeksekusi perintah yang mengikuti & & hanya jika perintah pertama berhasil.

Apakah perintah lain berjalan sebagai sudo juga?

sama sekali tidak, ini sama seperti menulis dua perintah berturut-turut, ini && tidak memberikan hak istimewa tambahan untuk sebuah perintah. Itu hanya seperator.

Untuk membuktikan itu mari kita ambil contoh.

touch fileA fileB 

Saya membuat dua file fileA dan fileB. Sekarang saya akan menjalankan perintah

sudo chown test:test fileA && chown test:test fileB

Saya mengubah pengguna dan pemilik grup dari file-file ini menjadi tes nama pengguna dan grup. Sekarang perintah pertama harus dijalankan sementara yang lainnya?

Outputnya adalah:

chown: changing ownership of `fileB': Operation not permitted

Jadi perintah itu tidak berjalan karena perlu sudo dan meskipun kita dapat menyimpulkan bahwa && bukan merupakan pengganti yang kedua sudo


0
2018-06-10 11:42





TIDAK, dan yang berikut ini pernah sangat makro.

sudo reboot && exit

Hampir semua orang harus melakukan ini setidaknya sekali

sudo apt-get update && sudo apt-get upgrade

Jadi itu adalah pertanyaan wawancara "mickey mouse" yang hebat.

Ini sangat mudah diuji bahwa pertanyaan itu mungkin dicurigai sebagai latihan padding stat.


0
2018-06-13 18:19