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 がログインしていることを確認できます。HostA で別のコンソールから再度実行すると、期待どおりに動作し、2 番目のトンネルは起動されません。

これまでのところすべて順調です。

ここで、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が、それは細かいことです。ここでの重要な点は、スクリプトが 1 分ごとに実行されていることです。

私の質問は次のとおりです: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

crontab:

# 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

私も同様の問題を抱えていました。スクリプトから実行した場合は ssh トンネルが機能しますが、crontab からは機能しません。ssh は、$HOME/.ssh でキーと known_hosts を検索します。ユーザー tom で bash からスクリプトを実行している場合、$HOME は /home/tom になります。スクリプトが crontab から実行される場合、ユーザーは root になり、$HOME は /home/root (または未定義) になります。

解決策: キーを持つユーザーのスクリプトに HOME を定義します。

HOME=/home/tom

関連情報