มีคำสั่งใน Linux ที่รอจนกว่าจะถูกยกเลิก?


11

ฉันกำลังพยายามสร้างไฟล์แบตช์ของ Windows ซึ่งเริ่มมีสีโป๊ว / plink ด้วยการส่งต่อพอร์ตและไม่มีอะไรอื่น ส่วน Windows พร้อมแล้ว:

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 sampleUser@192.168.0.1

เนื่องจากฉันไม่ต้องการอนุญาตให้เรียกใช้งานคำสั่งอื่นหลังจากการตรวจสอบฉันจึงใช้ForceCommandกับการMatch Userประกาศ:

Match User sampleUser
    ForceCommand echo 'Success! Close this window to log out.'

ปัญหาคือการรันไฟล์แบตช์เริ่มฉาบอย่างถูกต้อง แต่มันจะปิดทันทีหลังจากรัน echoing ข้อความที่ฉันระบุ

ความคิดของฉันคือการใช้สิ่งนี้:

ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC

ด้วยวิธีนี้สีโป๊ว / SSH ควรรักษาการเชื่อมต่ออยู่และจะไม่ออกจากการส่งต่อพอร์ตของฉัน

ผมเคยคิดว่าคำสั่งเช่นyes, pingหรือreadแต่พวกเขา

  • กำลังสแปมหน้าต่างเทอร์มินัลของฉัน
  • กำลังทำสิ่งต่างๆ / สร้างภาระของ CPU ที่ไม่จำเป็น
  • สามารถปิดโดยไม่คาดหมายได้ถ้ามีคนกด Enter

มีคำสั่งที่จะไม่ทำอะไรเลยตลอดไปจนกว่าใครจะยกเลิกมันด้วย Ctrl + C หรือปิดการเชื่อมต่อ SSH โดยปิดหน้าต่างโป๊วหรือไม่

ฉันควรใช้ทำwaitTillControlCอะไร


ฉันพบคำถามเช่นsuperuser.com/questions/587629/…แต่พวกเขาจะปล่อยให้เชลล์พร้อมใช้
stuXnet

คำตอบ:


13

ฉันไม่เข้าใจว่าทำไมคำตอบอื่น ๆ ทั้งหมดจึงต้องการใช้การวนซ้ำที่นี่การนอนหลับสามารถรอได้นานพอสำหรับการใช้งานจริงและจะไม่ใช้วงจรนาฬิกาทำ

ตัวอย่างเช่นจะลองที่นี่เพื่อนอนหลับเป็นเวลาหนึ่งร้อยปีที่น่าสงสัยและมีแนวโน้มว่าจะเพียงพอที่จะปฏิบัติตามคำขอต่อไป:

echo "Something"; sleep 36500d

หรือมิฉะนั้นสิ่งนี้ควรบล็อกด้วยเช่นกันจนกว่าคุณจะพิมพ์Enterรหัส:

echo "Something"; read foo

9

ลองใช้-Nตัวเลือกแทน จากplinkเอกสารประกอบ :

-N        don't start a shell/command (SSH-2 only)

นี่คือลักษณะการทำงานเช่นเดียวกับsshตัวเลือก-Nตามที่อธิบายไว้ในหน้าคน :

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).

2
นี่ควรเป็นคำตอบที่ยอมรับได้ คนอื่น ๆ บอกว่าวิธีการที่จะทำให้การแก้ปัญหา แต่คนนี้บอกว่าวิธีการทำมันขวา
Moshe Katz

ขอบคุณสำหรับการแก้ไข; ไม่มีกล่อง Windows เพื่อตรวจสอบฉันไม่คิดว่าจะหาเอกสาร plink ออนไลน์
chepner

I don't want to allow to execute other commands after authenticationคำตอบนี้ไม่เหมาะสมกับความต้องการของฉันเพราะ -Nจะทำสิ่งนี้ให้สำเร็จบนฝั่งไคลเอ็นต์ดังนั้นคุณสามารถลบ -N เพื่อรันคำสั่งอื่น ๆ หลังจากการพิสูจน์ตัวตน
stuXnet

8

สิ่งนี้ควรนอนหลับตลอดไปโดยไม่ต้องใช้พลังงาน CPU จำนวนมาก (สังเกตได้)

echo "Something" && while true; do sleep 9999; done

ฉันก็ไม่แน่ใจเหมือนกันว่าคุณจะให้คำสั่งเหมือนในForceCommandประโยคหรือไม่ คุณอาจต้องใส่คำสั่งในเชลล์สคริปต์

#!/usr/bin/env bash
echo "Success! Close this window to log out." && while true; do sleep 9999; done

แน่นอนสคริปต์นี้ควรอยู่ในสถานที่และมีสิทธิ์เช่นว่าไม่มีผู้ใช้ทั่วไปบนเซิร์ฟเวอร์สามารถเขียนถึงมัน

Match User sampleUser
    ForceCommand /usr/bin/waitforever

แก้ไข

ฉันพบคำสั่งที่ดูสง่างามกว่า:

echo "Something" && tail -f /dev/null

tail -fรอให้ไฟล์หรือสตรีมกลับไบต์ (มิฉะนั้นมีประโยชน์สำหรับการดูบันทึกในแบบเรียลไทม์) /dev/nullจะไม่ส่งคืนไบต์ และดังนั้นคำสั่งจะนอนตลอดไป


ในช่วงเวลานี้ฉันกำลังลองวนรอบการนอนหลับสำหรับตัวเอง - ใช่มันใช้งานได้แน่นอน! แม้แต่โดยตรงกับ ForceCommand:ForceCommand echo 'congrats' && while true; do sleep 9999; done
stuXnet

tail -f /dev/nullในทางเทคนิคแล้วแย่กว่า 9999 วง กระบวนการจะตื่นขึ้นทุกวินาทีแทนทุก ๆ 2 ชั่วโมง 56 นาที
jlliagre

ฉันพบว่าที่นี่: unix.stackexchange.com/questions/42901/ …ผู้ตอบคำถามนั้นอ้างว่า "(สมมติว่าสิ่งนี้ใช้การแจ้งเตือนภายในภายในไม่ควรมีการสำรวจหรือปลุกซ้ำดังนั้นนอกเหนือจากการมองแปลก ๆ มันควรจะเพียงพอ) "นี่เป็นข้อความหรือข้อสันนิษฐานที่ว่าหางใช้inotifyผิดหรือเปล่า?
nitro2k01

สมมติฐานถูกต้องได้tailรับการปรับปรุงเพื่อยกระดับinotifyเมื่อพร้อมใช้งาน นี่ควรเป็นกรณีเริ่มต้นที่มีค่ามากที่สุดหากไม่ใช่การกระจายที่เพียงพอล่าสุด อย่างไรก็ตามฉันเพิ่งทดสอบแล็ปท็อปลินุกซ์และสังเกตกิจกรรมที่น่าเกรงขามพร้อมtailการตรวจสอบ/dev/nullดังนั้นมันจึงเลวร้ายกว่าการนอนในรอบของนาฬิกา
jlliagre

ฉันไม่เชื่อว่าtailจะตื่นขึ้นทุกวินาที เหตุผลที่เป็นไปได้สำหรับผลลัพธ์คือคุณกำลังเรียกใช้ในเทอร์มินัลซึ่งอาจสื่อสารด้วยtailเหตุผลใดก็ตามในขณะที่sleepจะไม่ ไม่มีเหตุผลว่าทำไมจึงtailควรตื่นขึ้นมาเพียงแค่เฝ้า/dev/nullดู
nitro2k01

0

คุณสามารถลองต่อไปนี้:

echo "your commands" && while :; do sleep 1; done

1
สำหรับผู้เยี่ยมชมในอนาคตคุณควรให้ข้อมูลสรุปเกี่ยวกับการทำงานของมัน หลายคนอาจรู้ แต่คุณไม่สามารถคาดเดาได้ทั้งหมด
nerdwaller

sleepช่วงเวลาที่ยาวนานจะง่ายขึ้นบน CPU แม้ว่าsleep 1จะปลอดภัยพอสำหรับทุกสิ่งทุกอย่างที่สร้างขึ้นในสองทศวรรษที่ผ่านมา ...
Shadur

:trueเป็นชวเลข ฉันยังต้องการsleepระยะเวลานานกว่าเพียงแค่หลักการ
nitro2k01

0

คุณกำลังพยายามแก้ปัญหานี้จากจุดจบที่ผิด คุณไม่ต้องการให้เชลล์ไม่ออกคุณต้องการให้สีโป๊เปิดหน้าต่างทิ้งไว้

http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit - อธิบายสิ่งที่คุณต้องการเปลี่ยนแปลง หากคุณต้องการใช้ตัวเลือก "เฉพาะทางออกที่สะอาด" เพียงเพิ่มexit 1ที่ส่วนท้ายของ ForceCommand

แก้ไข:ฉันเข้าใจผิด; คุณต้องการรักษาพอร์ตที่ส่งต่อคุณไม่ต้องการเก็บเอาท์พุทของ ForceCommand ในกรณีนั้นhttp://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshellไม่ทำในสิ่งที่คุณต้องการ?


ปัญหาไม่ใช่ว่าหน้าต่างปิด แต่อุโมงค์ ssh ถูกปิด การบอก PuTTY ให้เปิดหน้าต่างทิ้งไว้ยังดูแลอุโมงค์ ssh ด้วยหรือไม่
Adrian Pronk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.