คำถามที่เกี่ยวข้อง: เริ่มการเชื่อมต่อ ssh จากเซิร์ฟเวอร์ไปยังไคลเอนต์
คำตอบจากที่นั่นช่วยฉันได้มากคำสั่งนี้ทำในสิ่งที่ฉันต้องการ:
ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP
ดังนั้นฉันจึงเขียนสคริปต์เพื่อเชื่อมต่อใหม่ตลอดเวลา:
#!/bin/bash
while true; do
echo "try to connect..."
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
echo "restarting in 5 seconds.."
sleep 5
done
/etc/crontab
และเพิ่มความมันไป แต่ฉันพบว่าใช้งานได้ถ้าเพียงฉันรัน "ด้วยมือ" จากเปลือก แต่ถ้ามันถูกเรียกโดย cron, ssh เชื่อมต่อและเสร็จสิ้นทันที (ดังนั้นสคริปต์ด้านบนจะเชื่อมต่อใหม่ตลอดเวลา)
จากman ssh
ฉันพบว่าสำหรับการเชื่อมต่อพื้นหลังฉันควรโทรด้วย-n
กุญแจ แต่มันไม่ได้ช่วย จากนั้นฉันแค่มองไปรอบ ๆ เพื่อหาสคริปต์ที่คล้ายกันและฉันพบว่ามันใช้งานได้ถ้าฉันเรียกtail -f something
เช่นคำสั่ง "ไม่สิ้นสุด" ดังนั้นฉันเพิ่งสร้างไฟล์เปล่า/tmp/dummy_file
และตอนนี้คำสั่ง ssh ของฉันมีลักษณะดังนี้:
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file
มันใช้งานได้แล้ว! แต่วิธีนี้ดูเหมือนจะน่าเกลียดนิดหน่อยบวกกับฉันไม่เข้าใจเหตุผลที่แท้จริงของพฤติกรรมนั้น บังเอิญฉันพยายามโทรbash
แทนtail -f
( bash
ดูเหมือนว่าฉันจะสั่ง "ไม่รู้จักจบ" ด้วย) แต่มันก็ใช้ไม่ได้
ดังนั้นใครก็ได้โปรดอธิบายพฤติกรรมนี้และวิธีที่ถูกต้องในการสร้างการเชื่อมต่อ ssh พื้นหลังเพื่อให้อุโมงค์ย้อนกลับ ssh ขึ้นได้อย่างไร
while
ลูปของฉันก็จะทำงานซ้ำแล้วซ้ำอีกเริ่มssh
การเชื่อมต่อพื้นหลังใหม่ทุก 5 วินาทีใช่ไหม นี่ไม่ใช่สิ่งที่ฉันต้องการ
&
ที่ส่วนท้ายของคำสั่ง ssh ของคุณ:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &