sudo -u ชื่อผู้ใช้ -s“ cmd arg” ไม่พบคำสั่งส่งคืน


10

ฉันเคยรันคำสั่ง:

sudo -u elasticsearch -s "ulimit -Hn"

และมันก็คืนค่า ulimit -Hn ตามที่เห็นโดยผู้ใช้ elasticsearch จนกว่าฉันจะลองบน Ubuntu 11.10 ที่นั่นมันส่งคืน:

/bin/bash: ulimit -Hn: command not found

ฉันลองคำสั่งที่แตกต่างกันสองสามข้อและเมื่อฉันใช้อาร์กิวเมนต์ฉันจะได้รับ "ไม่พบคำสั่ง":

$ sudo -u elasticsearch -s "ls all.sh"
/bin/bash: ls all.sh: command not found

แนวคิดใดบ้างที่ฉันสามารถรันคำสั่งที่ต้องใช้อาร์กิวเมนต์ผ่านsudo?


ทำไม-s? เพียงแค่เก็บเปลือกปกติและใช้มันเพื่อรันคำสั่ง sudo -u elasticsearch ls all.shเช่น หากelasticsearchมีเชลล์เริ่มต้นที่ใช้ไม่ได้ให้ใช้-s bash ก่อนคำสั่งจริง
glglgl

คำตอบ:


16

คุณต้องลบเครื่องหมายคำพูดคู่ มันพยายามรันคำสั่งที่เรียกว่า "ulimit -Hn" เป็นคำสั่งเดียวเว้นวรรคและทั้งหมด -sจำเป็นต้องเป็นsudoตัวเลือกสุดท้ายในsudoบรรทัดคำสั่งและอาร์กิวเมนต์ต่อไปนี้ทั้งหมดจะถูกส่งไป$SHELL -cยังเพื่อดำเนินการ

sudo -u elasticsearch -s ulimit -Hn

ฉันเดาวิธีการ-sประมวลผลมีการเปลี่ยนแปลงเป็นวิธีปัจจุบันช่วยให้คุณสามารถส่งผ่านข้อโต้แย้งด้วยช่องว่างไป$SHELLโดยหนีพวกเขาในบรรทัดคำสั่ง:

$ touch '/tmp/foo bar'
$ sudo -s rm '/tmp/foo bar'

วิธีเก่าของการจัดการอาร์กิวเมนต์จะแยก'/tmp/foo bar'อาร์กิวเมนต์นั้นเป็นสองแยกคำสั่ง


คุณทดสอบที่ไหนมันจะไม่แยกคำสั่ง?
Zarathustra

@Zarathustra นั่นเป็นห้าปีที่แล้ว - ฉันจำไม่ได้ว่าไกล ฉันขอแนะนำให้ขุดผ่านประวัติศาสตร์ซอร์สโค้ด sudo - คุณควรจะพบเมื่อพฤติกรรมเปลี่ยนไป
camh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.