Câu hỏi liên quan: bắt đầu kết nối ssh từ máy chủ đến máy khách
Trả lời từ đó đã giúp tôi rất nhiều, lệnh này làm những gì tôi cần:
ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP
Vì vậy, tôi đã viết kịch bản để kết nối lại mọi lúc:
#!/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
Và thêm nó vào /etc/crontab
. Nhưng tôi phát hiện ra rằng nó hoạt động nếu chỉ tôi thực hiện nó "bằng tay" từ shell, nhưng nếu nó được gọi bằng cron, ssh kết nối và ngay lập tức kết thúc. (vì vậy, đoạn script trên kết nối lại mọi lúc)
Từ đó man ssh
, tôi thấy rằng đối với các kết nối nền tôi nên gọi nó bằng -n
khóa, nhưng nó không giúp được gì. Sau đó, tôi chỉ tìm xung quanh các tập lệnh tương tự và tôi thấy rằng nó hoạt động nếu tôi gọi tail -f something
, tức là một số lệnh "không bao giờ", vì vậy tôi chỉ tạo tập tin trống /tmp/dummy_file
và bây giờ lệnh ssh của tôi trông như thế này:
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file
Nó hoạt dộng bây giờ! Nhưng, giải pháp này có vẻ hơi xấu, cộng với tôi không thực sự hiểu lý do thực sự của hành vi đó. Chỉ là tình cờ, tôi đã cố gắng gọi bash
thay vì tail -f
( bash
dường như cũng là lệnh "không bao giờ"), nhưng nó không hoạt động.
Vì vậy, bất cứ ai cũng có thể giải thích hành vi này, và cách chính xác để tạo kết nối ssh nền để giữ đường hầm ssh ngược lên là gì?
while
vòng lặp của tôi sẽ chạy đi chạy lại, bắt đầu ssh
kết nối nền mới cứ sau 5 giây, phải không? Đây không phải là thứ tôi cần.
&
ở cuối lệnh ssh của bạn:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &