ดำเนินการคำสั่งในเทอร์มินัลที่ใช้งานระยะไกล


10

สมมติว่าคุณมีเทอร์มินัลอีมูเลเตอร์ (T1) เปิดด้วย PID 6350

จากเทอร์มินัลอื่นให้พิมพ์คำสั่งนี้ (C1):

echo "ls\n" > /proc/6350/fd/0

สิ่งนี้เขียนlsและขึ้นบรรทัดใหม่ใน T1 แต่ไม่ได้ดำเนินการ ทำไม?

ฉันพยายามใช้cat|bashด้วยecho "ls\n" > /proc/catid/fd/0แต่ก็ยังไม่ได้ดำเนินการ

ฉันจะสะท้อนคำสั่งไปยังเทอร์มินัลอื่นและสั่งการได้อย่างไร?

คำตอบที่เป็นไปได้:

$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;

ในกรณีนี้คุณไม่สามารถเขียนได้อีกต่อไปในเทอร์มินัลโดยตรง (ทุกอย่างจะแสดงในลักษณะเดียวกับที่แสดงคำสั่ง (C1) ในเทอร์มินัลนี้



ฉันอ่านมันแล้วแต่มันไม่ค่อยมีประโยชน์
rvlander

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

โอเคคุณทำไม่ได้ แต่ทำไมถึงแสดงข้อความในเทอร์มินัลอื่น
rvlander

เนื่องจากคุณส่งข้อความไปยังส่วนต่อประสานเทอร์มินัลไม่ใช่ไปยังเชลล์
เร่ง

คำตอบ:


11

มียูทิลิตีบรรทัดคำสั่งที่เรียกttyechoว่าสามารถส่งคำสั่งไปยังเทอร์มินัลอื่น (tty / pts) และมีการดำเนินการคำสั่ง

sudo ttyecho -n /dev/pts/5 ls

โปรดดู: ยูทิลิตี้เพื่อส่งคำสั่งหรือข้อมูลไปยังเทอร์มินัลอื่น (tty / pts)

ยังเห็น: ttyechoรหัสที่มาบน GitHub

คำสั่ง tty ที่น่าสนใจอีกอย่างหนึ่งคือselectormatcher รูปแบบการโต้ตอบตามเวลาจริงในคอนโซลที่อัพเดตบัฟเฟอร์อินพุต tty

# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)

ดู: ตัวเลือก - ค้นหาแบบไดนามิกในคอนโซล


น่าเศร้าที่ลิงก์ไปยังttyechoซอร์สโค้ดบน github ดูเหมือนว่าจะใช้งานไม่ได้ อย่างไรก็ตามดูเหมือนว่าจะมีให้ที่github.com/osospeed/ttyechoแทนตอนนี้
Wilson F

7

เมื่อคุณออกเขียนไป/dev/pts/X( /proc/6350/fd/0, 1และ2เป็นเพียง symlink ไปว่า) สิ่งที่เกิดขึ้นคือสิ่งเดียวกันที่เกิดขึ้นเมื่อกระบวนการ6350(หรือหนึ่งในลูก ๆ ของมันคดเคี้ยวเหมาะสม) บางสิ่งบางอย่างเอาท์พุท: มันจะเขียนไปยังสถานี

หากคุณพยายามอ่านจากอุปกรณ์นั้น ( cat < /dev/pts/X) สิ่งต่าง ๆ จะเกิดขึ้น คุณจะเห็นสิ่งที่คุณพิมพ์ในเปลือกเดิมปรากฏขึ้น (อาจเป็นไปได้หลังจากบรรทัดใหม่แรกที่คุณพิมพ์ - ฉันคาดเดาว่าโปรแกรมเทอร์มินัล ( xtermหรืออะไรก็ตามที่คุณใช้) ทำการบัฟเฟอร์บรรทัดบางส่วนและ6350เชลล์ที่ถูกบล็อกบนreadรับชิ้นส่วนนั้นจากนั้นเชลล์อาจหรือ ไม่ชนะการอ่านที่ตามมา แต่ฉันอาจผิดอย่างสมบูรณ์เกี่ยวกับเรื่องนี้)

สิ่งนี้คือ: เมื่อคุณอ่านหรือเขียนไปยังอุปกรณ์นั้นคุณไม่ได้พูดคุยกับเชลล์ตัวอื่นที่ใช้งานอยู่ คุณกำลังพูดกับเทอร์มินัลอีมูเลเตอร์ ( xtermตัวอย่าง) เฉพาะเทอร์มินัลอีมูเลเตอร์เท่านั้นที่สามารถฉีดข้อมูลลงในช่องสัญญาณนั้น (สิ่งที่เชลล์อ่าน) และเชลล์ทั้งหมดที่เขียนไปยังเทอร์มินัล การแนบเปลือกที่สองจะไม่เปลี่ยน

หากคุณต้องการฉีดคำสั่งลงใน6530กระบวนการนั้นจะต้องทำผ่านเทอร์มินัล (ไม่ว่าจะเป็นแอป X11 หรืออย่างอื่น)

การอ่านที่แนะนำ: อะไรคือความแตกต่างที่แน่นอนระหว่าง 'terminal', 'shell', 'tty' และ 'console'


1
ที่น่าสนใจคือการอ่านจาก pts ( cat /dev/pts/xคุณไม่ต้องการ<) ฉันได้รับตัวอักษรสลับระหว่างขั้วอย่างเคร่งครัด
เควิน

ไม่ได้ใช้การเปลี่ยนเส้นทางอาจไม่เปลี่ยนแปลงมากนัก ฉันได้รับผลลัพธ์ที่ไม่สามารถคาดการณ์ได้ทั้งสองทาง
จ้า

น่าสนใจขอบคุณสำหรับลิงค์ ดังนั้น/proc/6350/fd/0simlink ไปยัง stdin parent process 6350ซึ่งเป็นเทอร์มินัล ฉันคิดว่ามันเหมือนกันสำหรับแอพพลิเคชั่นที่มีหน้าต่าง
rvlander
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.