ถ้าฉันพิมพ์“ sudo” ที่จุดเริ่มต้นของสายการบินเดียวมันจะใช้กับคำสั่งที่เหลือหรือไม่?


10

หากฉันพิมพ์sudoที่จุดเริ่มต้นของซับในหนึ่งจะใช้กับคำสั่งที่เหลือหรือไม่?

กล่าวอีกนัยหนึ่งคือ:

sudo foo | foo2 | foo3

เทียบเท่ากับสิ่งนี้:

sudo foo | sudo foo2 | sudo foo3

คำตอบ:


11

เป็นวิธีการที่จะโน้มน้าวตัวคุณเองว่าsudoรันโดยใช้คำสั่งแรกที่ให้ไว้เท่านั้นและทุกอย่างอื่นหลังจากไพพ์แรกนั้นถูกเรียกใช้เป็น ID ผู้ใช้ดั้งเดิมของคุณคุณสามารถใช้คำสั่งที่ไร้ประโยชน์นี้เพื่อดูคำสั่ง

ตัวอย่างที่ 1

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

จากนั้นเมื่อคุณcatไฟล์เหล่านั้นคุณจะเห็นชื่อผู้ใช้ดังต่อไปนี้:

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

ตัวอย่างที่ 2

อย่างไรก็ตามหากคุณเรียกใช้ subshell:

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

จากนั้นเมื่อคุณcatไฟล์เหล่านี้คุณจะเห็นชื่อผู้ใช้ต่อไปนี้:

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

ตัวอย่างที่ 3

ความคิดเห็นของคุณเกี่ยวกับsudo foo1 | sudo foo2 ...จะไม่ทำงานเนื่องจากผลผลิตจากจะเลี้ยงsudo foo1 sudo foo2การใช้whoamiตัวอย่างของฉันนี่แสดงให้เห็นว่าสายการบังคับบัญชานั้นไม่ได้ทำอะไรเลย

$ sudo whoami | sudo whoami | sudo whoami
root

คนที่หนึ่งวิ่ง แต่คนที่สองและคนที่สามไม่ทำอะไรเลยเพราะพวกเขาไม่พร้อมที่จะรับข้อมูล ค่อนข้างฉันคิดว่าคุณหมายถึงการเขียนสิ่งนี้:

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

ซึ่งเทียบเท่ากับการรัน 3 ครั้งบนพรอมต์คำสั่ง 3 แบบที่แตกต่างกัน หรือสิ่งนี้:

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

แต่ไม่เคยทำสิ่งนี้ครั้งสุดท้าย มันอยู่ในส่วนถัดไป

ปิดบังวิธีโทร sudo

เหล่านี้ไม่ได้งานที่ดีที่สุดของฉัน แต่มีวิธีการอื่น ๆ sudoที่คุณอาจได้เห็นฉันรันคำสั่งต่างๆโดยใช้ ฉันแสดงที่นี่เพียงเพื่อสอนไม่ให้คนอื่นทำอย่างนั้น!

วิธี # 1

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

มันทำงานอย่างไร?

โปรแกรม echo ภายในเครื่องหมายคำพูดคู่รันเป็นรูทเนื่องจาก sudo แต่เชลล์ที่เปลี่ยนทิศทางเอาต์พุตของ echo ไปยังไฟล์ root เท่านั้นยังคงทำงานเหมือนคุณ เชลล์ปัจจุบันของคุณทำการเปลี่ยนเส้นทางก่อนที่จะsudoเริ่ม

วิธี # 2

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

มันทำงานอย่างไร?

เมธอดนี้รันteeโปรแกรมในฐานะ root และรับอินพุตจากสตริงที่นี่ซึ่งรันก่อนที่จะsudoเรียกใช้teeคำสั่ง

วิธี # 3

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

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

มันทำงานอย่างไร?

สิ่งเหล่านี้อาจดูแตกต่างออกไป แต่พวกเขากำลังทำสิ่งเดียวกัน เมื่อใช้-sสวิตช์sudoจะเรียกใช้คำสั่งเดียว ฉันไม่สามารถคิดออกว่าจะมีวิธีที่จะหลบหนีได้หรือไม่ ไม่มีอะไรเหมือนสิ่งเหล่านี้จะทำงาน

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

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

แต่ในการดูหน้าคน-sสวิตช์บอกว่ามันจะส่งคำสั่งเดียวไปยังเชลล์ที่กำหนดไว้ในรายการของผู้ใช้/etc/passwdไฟล์ ดังนั้นเราจึงใช้เคล็ดลับในรูปแบบที่สองส่วนใหญ่ผ่านเปลือกหอยเชลล์อื่น ( sh -c) ซึ่งเรา "ลับๆ" สตริงคำสั่งของเราเพื่อทำงาน

มีมากขึ้น แต่ฉันจะหยุดที่นี่ สิ่งเหล่านี้เป็นเพียงการแสดงให้คุณเห็นว่าคุณสามารถทำอะไรถ้าคุณเข้าใจสิ่งต่าง ๆ แต่ไม่ควรเพียงแค่เชื่อมโยงขยะเข้าด้วยกันเพราะคุณทำได้คุณควรพยายามรักษารหัสของคุณให้อยู่ในระดับตรรกะที่เหมาะสมเพื่อให้ผู้อื่นเข้าใจ พวกเขาในอนาคต


6

ไม่มีในตัวอย่างของคุณเท่านั้นที่จะถูกดำเนินการโดยfoo sudoหากคุณต้องการเรียกใช้คำสั่งทั้งหมดด้วยสิทธิ์ระดับสูงคุณสามารถวางไข่เปลือก:

sudo sh -c 'foo | foo2 | foo3'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.