ฉันต้องการที่จะสามารถส่งสัญญาณ (SIGINT เป็นสิ่งสำคัญที่สุด) ผ่าน ssh
คำสั่งนี้:
ssh server "sleep 1000;echo f" > foo
จะเริ่ม sleep บนเซิร์ฟเวอร์และหลังจาก 1,000 วินาทีมันจะใส่ 'f \ n' ในไฟล์ foo บนเครื่องของฉัน ถ้าฉันกด CTRL-C (เช่นส่ง SIGINT ไปยัง ssh) มันจะฆ่า ssh แต่จะไม่ฆ่า sleep บนเซิร์ฟเวอร์ระยะไกล ฉันต้องการที่จะฆ่า sleep บนเซิร์ฟเวอร์ระยะไกล
ดังนั้นฉันจึงพยายาม:
ssh server -t "sleep 1000;echo f" > foo
แต่ถ้า stdin ไม่ใช่เทอร์มินัลฉันได้รับข้อผิดพลาดนี้:
Pseudo-terminal will not be allocated because stdin is not a terminal.
จากนั้น SIGINT ยังไม่ถูกส่งต่อ
ดังนั้นฉันจึงพยายาม:
ssh server -t -t "sleep 1000;echo f" > output
แต่ผลลัพธ์ใน foo ไม่ใช่ 'f \ n' แต่แทน 'f \ r \ n' ซึ่งเป็นหายนะในสถานการณ์ของฉัน (เนื่องจากผลลัพธ์ของฉันคือข้อมูลไบนารี)
ในข้างต้นฉันใช้ "sleep 1000; echo f" แต่ในความเป็นจริงที่ผู้ใช้จัดหาดังนั้นมันสามารถมีอะไรก็ได้ อย่างไรก็ตามหากเราสามารถทำให้มันใช้งานได้สำหรับ "sleep 1000; echo f" เรามักจะทำให้มันทำงานได้ในสถานการณ์จริงทั้งหมด
ฉันไม่สนใจที่จะเอาเครื่องหลอกมาใช้ที่ปลายอีกด้าน แต่ฉันไม่สามารถหาวิธีอื่นในการรับ ssh เพื่อส่งต่อ SIGINT ของฉัน
มีวิธีอื่นอีกไหม?
แก้ไข:
ผู้ใช้สามารถให้คำสั่งที่อ่านข้อมูลไบนารีจาก stdin เช่น:
seq 1000 | gzip | ssh server "zcat|bzip2; sleep 1000" | bzcat > foo
ผู้ใช้สามารถให้คำสั่งที่มี cpu เข้มข้นเช่น:
ssh server "timeout 1000 burnP6"
Edit2:
รุ่นที่ดูเหมือนจะใช้งานได้สำหรับฉันคือ:
your_preprocessing |
uuencode a | ssh -tt -oLogLevel=quiet server "stty isig -echoctl -echo ; uudecode -o - |
your_command |
uuencode a" | uudecode -o - |
your_postprocessing
ขอบคุณ digital_infinity ที่ชี้ให้ฉันไปในทิศทางที่ถูกต้อง
ssh
จะต้องซับซ้อนกว่าสิ่งที่คุณแสดงเป็นตัวอย่างเพราะคุณสามารถรับพฤติกรรมที่คุณต้องการได้ด้วยการจัดเรียงใหม่อย่างง่าย:sleep 1000 && ssh server "echo f" > foo
(ต้อง&&
ไม่ใช่ไม่ใช่การ;
ฆ่านั้นsleep
ทำให้ssh
คำสั่งไม่ทำงาน) หากฉัน ถูกต้องโปรดทำให้ตัวอย่างของคุณเป็นตัวแทนของการใช้งานจริงของคุณมากขึ้นเพื่อให้ได้คำตอบที่ดีขึ้น