Jika saya mengetik "sudo" di awal satu liner, apakah itu berlaku untuk seluruh perintah?

10

Jika saya mengetikkan sudodi awal liner satu di bash, apakah itu berlaku untuk seluruh perintah?

Dengan kata lain, apakah ini:

sudo foo | foo2 | foo3

setara dengan ini:

sudo foo | sudo foo2 | sudo foo3
Mike B
sumber

Jawaban:

11

Sebagai cara untuk meyakinkan diri Anda bahwa sudohanya berjalan menggunakan perintah pertama yang disediakan itu, dan segala sesuatu yang lain setelah pipa pertama dijalankan sebagai ID pengguna asli Anda, Anda dapat menggunakan rantai perintah yang tidak berguna ini untuk melihatnya.

Contoh 1

$ sudo whoami > file1 | whoami > file2 | whoami > file3

Kemudian ketika Anda catfile-file Anda akan melihat nama pengguna berikut:

$ cat file{1..3}
root
saml
saml

Contoh # 2

Namun jika Anda menjalankan subkulit:

$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'

Kemudian ketika Anda catfile-file ini Anda akan melihat nama pengguna berikut:

$ cat file{4..6}
root
root
root

Contoh # 3

Komentar Anda tentang sudo foo1 | sudo foo2 ...tidak akan pernah berhasil, karena output dari sudo foo1akan diumpankan ke sudo foo2. Menggunakan whoamicontoh saya ini menunjukkan bahwa rantai perintah tidak melakukan apa pun.

$ sudo whoami | sudo whoami | sudo whoami
root

Yang pertama berjalan, tetapi yang ke-2 dan ke-3 tidak melakukan apa-apa karena mereka tidak siap untuk mengambil input. Sebaliknya saya pikir Anda bermaksud menulis sesuatu seperti ini:

$ sudo whoami;sudo whoami;sudo whoami
root
root
root

Yang setara dengan menjalankannya 3 kali pada 3 prompt perintah yang berbeda. Atau ini:

$ sudo whoami && sudo whoami && sudo whoami
root
root
root

Tetapi jangan pernah melakukan yang terakhir ini. Itu milik di bagian selanjutnya.

Cara tidak jelas untuk memanggil sudo

Ini bukan pekerjaan terbaik saya tetapi cara lain Anda mungkin telah melihat saya mengeksekusi beberapa perintah menggunakan sudo. Saya tunjukkan di sini hanya untuk mengajar bukan agar orang lain mau melakukannya !

Cara # 1

$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh

Bagaimana itu bekerja?

Program gema di dalam tanda kutip ganda berjalan sebagai root, karena sudo, tetapi shell yang mengarahkan output gema ke file root-only masih berjalan seperti Anda. Shell Anda saat ini melakukan redirection sebelum sudodimulai.

Cara # 2

$ sudo tee /proc/sys/vm/drop_caches <<<1

Bagaimana itu bekerja?

Metode ini menjalankan teeprogram sebagai root AND mengambil input dari string di sini yang berjalan sebelum sudomenjalankan teeperintah.

Cara # 3

# this way
$ sudo -s -- 'whoami'

# or this way
sudo -s -- sh -c 'whoami;whoami'

Bagaimana itu bekerja?

Ini mungkin terlihat berbeda tetapi mereka benar-benar melakukan hal yang sama. Saat menggunakan -ssakelar, sudoakan menjalankan satu perintah. Saya tidak akan pernah tahu jika ada cara untuk menghindarinya. Tidak ada yang seperti ini yang akan berhasil.

# this
$ sudo -s -- 'whoami;whoami'

# or this
$ sudo -s -- 'whoami\;whoami'

Tetapi dalam melihat halaman manual, -sswitch mengatakan bahwa itu akan memberikan perintah tunggal ke shell yang ditentukan dalam entri /etc/passwdfile oleh pengguna. Jadi kita menggunakan trik dalam bentuk kedua, terutama melewati shell, shell lain ( sh -c) di mana kita "backdoor" menjalankan serangkaian perintah kita.

Ada lebih banyak tetapi saya akan berhenti di sini. Ini hanya untuk menunjukkan kepada Anda apa yang dapat Anda lakukan jika Anda memahami hal-hal, tetapi tidak harus hanya rantai sampah bersama karena Anda bisa, Anda harus mencoba dan menjaga pragma kode Anda ke tingkat logis yang masuk akal sehingga orang lain dapat memahami dan mendukung mereka di masa depan.

slm
sumber
6

Tidak, dalam contoh Anda hanya foodijalankan oleh sudo. Jika Anda ingin menjalankan semua perintah dengan hak yang ditingkatkan, Anda dapat menelurkan shell:

sudo sh -c 'foo | foo2 | foo3'
jordanm
sumber