หากฉันพิมพ์sudo
ที่จุดเริ่มต้นของซับในหนึ่งจะใช้กับคำสั่งที่เหลือหรือไม่?
กล่าวอีกนัยหนึ่งคือ:
sudo foo | foo2 | foo3
เทียบเท่ากับสิ่งนี้:
sudo foo | sudo foo2 | sudo foo3
หากฉันพิมพ์sudo
ที่จุดเริ่มต้นของซับในหนึ่งจะใช้กับคำสั่งที่เหลือหรือไม่?
กล่าวอีกนัยหนึ่งคือ:
sudo foo | foo2 | foo3
เทียบเท่ากับสิ่งนี้:
sudo foo | sudo foo2 | sudo foo3
คำตอบ:
เป็นวิธีการที่จะโน้มน้าวตัวคุณเองว่าsudo
รันโดยใช้คำสั่งแรกที่ให้ไว้เท่านั้นและทุกอย่างอื่นหลังจากไพพ์แรกนั้นถูกเรียกใช้เป็น ID ผู้ใช้ดั้งเดิมของคุณคุณสามารถใช้คำสั่งที่ไร้ประโยชน์นี้เพื่อดูคำสั่ง
$ sudo whoami > file1 | whoami > file2 | whoami > file3
จากนั้นเมื่อคุณcat
ไฟล์เหล่านั้นคุณจะเห็นชื่อผู้ใช้ดังต่อไปนี้:
$ cat file{1..3}
root
saml
saml
อย่างไรก็ตามหากคุณเรียกใช้ subshell:
$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'
จากนั้นเมื่อคุณcat
ไฟล์เหล่านี้คุณจะเห็นชื่อผู้ใช้ต่อไปนี้:
$ cat file{4..6}
root
root
root
ความคิดเห็นของคุณเกี่ยวกับ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
ที่คุณอาจได้เห็นฉันรันคำสั่งต่างๆโดยใช้ ฉันแสดงที่นี่เพียงเพื่อสอนไม่ให้คนอื่นทำอย่างนั้น!
$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh
มันทำงานอย่างไร?
โปรแกรม echo ภายในเครื่องหมายคำพูดคู่รันเป็นรูทเนื่องจาก sudo แต่เชลล์ที่เปลี่ยนทิศทางเอาต์พุตของ echo ไปยังไฟล์ root เท่านั้นยังคงทำงานเหมือนคุณ เชลล์ปัจจุบันของคุณทำการเปลี่ยนเส้นทางก่อนที่จะsudo
เริ่ม
$ sudo tee /proc/sys/vm/drop_caches <<<1
มันทำงานอย่างไร?
เมธอดนี้รันtee
โปรแกรมในฐานะ root และรับอินพุตจากสตริงที่นี่ซึ่งรันก่อนที่จะsudo
เรียกใช้tee
คำสั่ง
# 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
) ซึ่งเรา "ลับๆ" สตริงคำสั่งของเราเพื่อทำงาน
มีมากขึ้น แต่ฉันจะหยุดที่นี่ สิ่งเหล่านี้เป็นเพียงการแสดงให้คุณเห็นว่าคุณสามารถทำอะไรถ้าคุณเข้าใจสิ่งต่าง ๆ แต่ไม่ควรเพียงแค่เชื่อมโยงขยะเข้าด้วยกันเพราะคุณทำได้คุณควรพยายามรักษารหัสของคุณให้อยู่ในระดับตรรกะที่เหมาะสมเพื่อให้ผู้อื่นเข้าใจ พวกเขาในอนาคต
ไม่มีในตัวอย่างของคุณเท่านั้นที่จะถูกดำเนินการโดยfoo
sudo
หากคุณต้องการเรียกใช้คำสั่งทั้งหมดด้วยสิทธิ์ระดับสูงคุณสามารถวางไข่เปลือก:
sudo sh -c 'foo | foo2 | foo3'