Cron 作業正在運作但未建立隧道

Cron 作業正在運作但未建立隧道

我有一個在端點上建立反向隧道的腳本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

相關內容