そこにある回答は私にとって非常に有用であり、このコマンドは私の要件を満たしています。
ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP
だから私は常に再接続するスクリプトを書いています。
#!/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
に追加しましたが、/etc/crontab
シェルで「手動で」実行すると機能しますが、cronから呼び出すとsshが接続されてすぐに完了することがわかりました。 (これで上記のスクリプトは常に再接続されます)
私はバックグラウンド接続のためにman ssh
キーを使って呼び出す必要があることに気づきましたが、-n
これは役に立ちませんでした。その後、同様のスクリプトを見て、tail -f something
「終わらない」コマンドを呼び出すとうまくいくことがわかりました。だから私は空のファイルを作成し、/tmp/dummy_file
今sshコマンドは次のようになります。
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file
今大丈夫!ただし、このソリューションは少し見苦しく見え、この動作の実際の理由を実際には理解していません。偶然代わりbash
に呼び出しを試みましたがtail -f
(bash
私の考えでは「終わりのない」コマンドでもあります)、うまくいきませんでした。
もしそうなら、誰もがこの動作を説明することができ、バックグラウンドSSHトンネルを実行し続けるためにバックグラウンドSSH接続を作成する正しい方法は何ですか?
答え1
-N
sshオプションが欲しいようです。
-N Do not execute a remote command. This is useful for just forwarding ports
(protocol version 2 only).
答え2
ぜひご検討ください。autossh
。接続損失が根本的な原因であることを確認し、再接続を試みる頻度を減らす特定の経験的方法があります。また、追加のトンネルを使用して接続を監視するため、要求したシナリオにも役立ちます。
たとえば、Ubuntuを使用している場合は、Web検索を介してautossh upstart
トンネルを継続的に維持するようにUbuntuを設定する方法のいくつかの便利な例を見つけることができます。
私はこれを使用して、特定のサービスに対して常に私のサーバーへのオープントンネル接続を維持します。
答え3
二度目になります@0xC0000022Lの提案を使用してautossh
。私はこれをある場所から別の場所に持って行くとき、私のラップトップへのSSH接続を維持するために使用し、正常に動作します。私はこの接続を使用してバックポート25と2143をトンネリングしてプライベートSMTPおよびIMAPサーバーにアクセスします。
これは私が使用するスクリプトです。
$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash
autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o
次に、Host
ファイル$HOME/.ssh/config
にホストエントリを保持しますimap-o
。
$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes
GatewayPorts yes
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa
Host imap-o
User sam
ProxyCommand ssh [email protected] nc `echo %h|sed 's/-o//'` %p
autossh_mail.sh
ログインすると、スクリプトはデスクトップの一部として実行されます。経由でアクセスできますgnome-session-properties
。