我有一個在端點上建立反向隧道的腳本HostB
。它看起來像這樣:
cat tun.sh
#!/usr/bin/env bash
# Test code
/usr/bin/ssh -V 1> /home/userA/bin/tun.stdout 2> /home/userA/bin/tun.stderr
# Establish tunnel
createTunnel() {
/usr/bin/ssh -R *:19999:localhost:22 userB@hostB
}
# Do nothing if tunnel is already established
/usr/bin/ssh -p 19999 userA@hostB true
if [[ $? -ne 0 ]]; then
createTunnel
fi
當我手動運行它時,它就像./tun.sh
它一樣工作,並且我可以在HostB 上看到,userA 已登入。會啟動第二個隧道。
到目前為止一切都很好。
我現在將 crontab 編輯為如下所示:
crontab -l
# m h dom mon dow command
*/1 * * * * /home/userA/bin/tun.sh
它每分鐘運行一次腳本。這應該沒問題,因為如果隧道已經建立,腳本就會終止。
但是,現在 userA 沒有像我從控制台手動運行它一樣登入。
腳本頂部的測試程式碼確認該腳本正在被調用,並且它具有執行權限/usr/bin/ssh
:
~/bin$ ls
tun.sh tun.stderr tun.stdout
~/bin$ cat tun.stderr
OpenSSH_5.3p1 Debian-3ubuntu7, OpenSSL 0.9.8k 25 Mar 2009
~/bin$ cat tun.stdout
[empty]
由於某種原因-V
寫入stderr
而不是寫入stdout
,但這是一個細節。這裡的重點是腳本每分鐘都會執行一次。
我的問題是:為什麼SSH隧道沒有建立?
答案1
感謝@Andrew 指出ssh-agent
.據我所知,如果希望能夠建立隧道而不必每次輸入密碼,則必須儲存或刪除密碼。我選擇刪除它。作為記錄,以下是根據我收到的評論進行的一些清理:
#!/usr/bin/env bash
# Establish tunnel
createTunnel() {
/usr/bin/ssh -i /home/laptopuser/.ssh/id_rsa_tunnel -R 2200:localhost:22 [email protected]
}
# Do nothing if tunnel is already established
/usr/bin/ssh -i /home/user/laptopuser/.ssh/id_rsa_tunnel -p 2200 [email protected] true
if [[ $? -ne 0 ]]; then
createTunnel
fi
定時任務:
# m h dom mon dow command
*/1 * * * * /home/laptopuser/bin/establishTunnel.sh
將您的隧道 ID 複製到 vps:
ssh-copy-id -i /home/user/laptopuser/.ssh/id_rsa_tunnel vps.com
等待隧道運行(請參閱sudo watch grep CRON /var/log/syslog
),如果您尚未進入,請複製您的普通 ID~/.ssh/authorized_keys
ssh-copy-id vps.com -p 2200
理想情況下,隧道將作為專用用戶在 vps 和筆記型電腦上運行。
答案2
我有一個類似的問題 - 如果從腳本執行而不是從 crontab 執行,ssh 隧道可以工作。 ssh 在 $HOME/.ssh 中尋找金鑰和known_hosts。如果您在使用者 tom 下從 bash 執行腳本,則 $HOME 將是 /home/tom。如果腳本從 crontab 執行,則使用者將為 root,$HOME 將為 /home/root(或未定義)。
解決方案:在腳本中為擁有金鑰的使用者定義 HOME。
HOME=/home/tom