การรันหลายคำสั่งด้วย su ใน Bash


10

ฉันต้องการใช้su -cเพื่อรันเป็นคำสั่งหลายคำสั่งพร้อมกัน ฉันไม่ต้องการใช้สคริปต์พิเศษสำหรับสิ่งนี้

ฉันพยายามต่อไปนี้:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & " -c "ls -lh"

แต่มันดำเนินการเพียงอย่างเดียวlsไม่ใช่คนแรก

ฉันพยายามต่อไปนี้:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

;แต่มันบอกว่ามีข้อผิดพลาดกับอัฒภาค

คุณรู้วิธีการทำเช่นนั้น?

คำตอบ:


14

คำสั่งนี้ทำงานได้ดี:

su root -c "date; ls -lh"

แต่ในคำสั่งนี้:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

เนื่องจากคุณมี&มาก่อน;ดังนั้นคุณจะได้รับข้อผิดพลาด ลองลบ&และเรียกใช้คำสั่งอีกครั้ง

หรือคุณสามารถเรียกใช้คำสั่งของคุณเช่นนี้:

su root -c "(tcpdump -i wlan0 -s 1500 -w CCCCCC &); ls -lh"

แน่นอนว่าไม่มีเหตุผลที่จะเพิ่มวงเล็บยกเว้นว่า OP จริงต้องการพิมพ์;ระหว่างtcpdumpและlsคำสั่งจริงๆ - เพียงแค่ใช้เครื่องหมายอัฒภาคแล้วมันจะทำงาน
G-Man กล่าวว่า 'Reinstate Monica'

2

ดังที่anubhava พูดคุณ

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"

คำสั่งเป็นความล้มเหลวเพราะคุณไม่ได้รับอนุญาตให้ได้ ตามทันทีโดย& ;คุณสามารถเห็นสิ่งนี้เพียงแค่พิมพ์คำสั่งลงในเชลล์โดยตรง:

  • true & true  โรงงาน
  • true & ; true ไม่ทำงาน

ถ้าคุณต้องการให้tcpdumpคำสั่งที่จะทำงานในพื้นหลังเอา;เป็นใน

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ls -lh;"

(และคุณไม่ต้องการ;ในตอนท้ายเช่นกัน แต่ก็ไม่เจ็บ)


1

ฉันคิดว่าnohupคำสั่งจะให้สิ่งที่คุณต้องการเช่นกัน ... tcpdump ทำงานในพื้นหลัง (ไม่จำเป็นต้องใช้เครื่องหมายและ):

su root -c "nohup tcpdump -i wlan0 -s 1500 -w CCCCCC ; ls -lh"

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

(1) เป็นการดีที่จะใช้nohupเมื่อคุณเรียกใช้คำสั่งในพื้นหลัง แต่มันไม่มีอะไรเกี่ยวข้องกับคำถามนี้ (2) คำตอบนี้ผิด - nohupโดยตัวมันเองไม่ได้ทำให้คำสั่งทำงานในพื้นหลัง; คุณยังคงต้องพิมพ์&(ซึ่งทำให้เรากลับไปที่ที่เราเริ่มด้วยข้อผิดพลาดทางไวยากรณ์ในคำสั่ง)
G-Man กล่าวว่า 'Reinstate Monica'

0

เพียงเพิ่มคำตอบที่ยอดเยี่ยมของ Anubhava :

คุณสามารถใช้{}เช่นนี้:

su root -c "{ tcpdump -i wlan0 -s 1500 -w CCCCCC & }; ls -lh"

{}มีประสิทธิภาพมากกว่าเล็กน้อย()ที่จะไม่สร้างเชลล์ย่อย {}ไม่จำเป็นต้องมีช่องว่างหลังจาก{และ a ;ก่อน}เว้นแต่ว่าเรามี&แล้ว


แน่นอนว่ายังมีเหตุผลที่จะเพิ่มการจัดฟันหรือวงเล็บที่ทุกคนเว้นแต่ผู้ใช้จริงๆไม่มีจริงๆจริงๆอยากจะพิมพ์;ระหว่างtcpdumpและlsคำสั่ง - เพียงแค่ออกจากอัฒภาคและมันจะทำงาน
G-Man กล่าวว่า 'Reinstate Monica'

-1

ใช้&&เพื่อแยกคำสั่งของคุณดังนี้:

$ su -c "ls && ls"

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

3
&& หมายถึง "รันคำสั่งที่สองเฉพาะหากคำสั่งแรกสำเร็จ" หากคำสั่งแรกของคุณเกิดข้อผิดพลาดคำสั่งที่สองจะไม่ทำงาน นี่เป็นเรื่องปกติ แต่ฉันก็ลังเลที่จะอธิบาย && ว่าเป็นตัวคั่นอย่างหมดจด
Leo

และถ้าคุณต้องการที่จะเรียกใช้tcpdumpกระบวนการในพื้นหลัง&&คุณไม่ดีเลย
G-Man กล่าวว่า 'Reinstate Monica'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.