2010-12-13 12 views
7

これの最後の行が何であり、なぜ必要なのかを正確に説明できますか?Bash Script:これはどういう意味ですか? "done</ dev/null&disown"

while true; do 
    /usr/bin/ssh -R 55555:localhost:22 -i ~/.ssh/tunnel-id [email protected] 
    sleep 1 
done < /dev/null & disown 

これはスクリプト全体であり、その目的は中継サーバーへのSSHトンネルを作成することです。私はBashの新機能ですが、接続を継続的に維持しようとしているように見えますが、最後の行の構文はわかりません。

このスクリプトは、ファイアウォールの背後にSSHを使用するためのプロセスの一部、または私の場合にはNATです: http://martin.piware.de/ssh/index.html

答えて

7

最後の行は、入力としてループに/dev/nullをリダイレクトする - すぐにEOFを返す - とバックグラウンドでプロセスを実行します。その後、フォアグラウンドでコマンドdisown(1)を実行すると、プロセスが切り離され、HUPシグナルが停止するのを防ぎます(nohupのようなものです)。その効果はループをデーモンプロセスのようなものにすることです。

ループ全体では、1秒に1回sshコマンドが実行されます。このコマンドは、sshトンネルを開き、ローカルにポート5555に接続し、リモートでポート22(ssh)に接続します。接続する何かがある場合、それは行います。さもなければ、リダイレクトされたEOFはそれを終了させます。その後、1秒後にaagainを試行します。

(。またはそう私は実際にそれを試していない、と信じて)

bashで、勘当はビルトインです。詳細を見るにはhelp disownを使用してください。

+0

「ssh:connect to host server.com port 22:Operation not allowed」と出力されますが、「スリープ1」行をコメントアウトすると正常に動作しているようです。 – drifter

+0

これを読んでいる人には、私のLinuxディストリビューションでは起こらないCygwinの問題と思われます。 – drifter

2

/dev/nullwhileループにリダイレクトすると、exec <&-に相当するstdinが有効に終了します。

+0

Cygwinで実行すると、「stdinは端末ではないため、疑似端末は割り当てられません」というメッセージが出力されます。私はそれが普通だと思っています。 – drifter

+0

@drifter:私はそう信じています。 –

+0

ありがとうございます。私はもっ​​と奇妙なエラーが発生しています。私がチャーリー・マーティンの答えに載せたコメントを参照したいのであれば、私はそれを感謝するでしょう。 – drifter

関連する問題