エンドポイントにリバーストンネルを設定するスクリプトがあります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
文を書くのだが、それがディテールだ。ここで重要なのは、スクリプトが1分ごとに実行されることです。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