Jika saya mengetikkan sudo
di 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
Sebagai cara untuk meyakinkan diri Anda bahwa sudo
hanya 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.
$ sudo whoami > file1 | whoami > file2 | whoami > file3
Kemudian ketika Anda cat
file-file Anda akan melihat nama pengguna berikut:
$ cat file{1..3}
root
saml
saml
Namun jika Anda menjalankan subkulit:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
Kemudian ketika Anda cat
file-file ini Anda akan melihat nama pengguna berikut:
$ cat file{4..6}
root
root
root
Komentar Anda tentang sudo foo1 | sudo foo2 ...
tidak akan pernah berhasil, karena output dari sudo foo1
akan diumpankan ke sudo foo2
. Menggunakan whoami
contoh 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.
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 !
$ 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 sudo
dimulai.
$ sudo tee /proc/sys/vm/drop_caches <<<1
Bagaimana itu bekerja?
Metode ini menjalankan tee
program sebagai root AND mengambil input dari string di sini yang berjalan sebelum sudo
menjalankan tee
perintah.
# 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 -s
sakelar, sudo
akan 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, -s
switch mengatakan bahwa itu akan memberikan perintah tunggal ke shell yang ditentukan dalam entri /etc/passwd
file 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.
Tidak, dalam contoh Anda hanya foo
dijalankan oleh sudo
. Jika Anda ingin menjalankan semua perintah dengan hak yang ditingkatkan, Anda dapat menelurkan shell:
sudo sh -c 'foo | foo2 | foo3'