ポートフォワーディングでPuTTY/plinkを開始するWindowsバッチファイルを作成しようとしています。これで、Windowsパーツの準備が整いました。
start plink.exe -ssh -i key.ppk -L 1234:localhost:80 [email protected]
認証後に他のコマンドの実行を許可したくないので、ForceCommand
とMatch User
宣言を使用しています。
Match User sampleUser
ForceCommand echo 'Success! Close this window to log out.'
問題は、バッチファイルを実行するとPuTTYが正しく起動しますが、指定したテキストのエコーを実行するとすぐに閉じます。
私の考えは、次のようなものを使用することです。
ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC
このように、PuTTY/SSHは接続を維持し、ポート転送を終了しません。
yes
、ping
、read
のようなコマンドを考えましたが、それらは
誰かがCtrl + Cで終了するか、PuTTYウィンドウを閉じてSSH接続を閉じるまで、永久に何もしないコマンドはありますか?
waitTillControlC
には何を使用すればよいですか?
他のすべての応答がここでループを使用したい理由がわかりません。スリープは実用的な目的のために十分長く待機することができ、それを実行するクロックサイクルを使用しません。
たとえば、ここでは疑わしい100年間眠ろうとし、とにかく要求に応じるのに十分なことをします。
echo "Something"; sleep 36500d
または、入力するまでこれもブロックする必要があります Enter キー:
echo "Something"; read foo
代わりに-N
オプションを試してください。 plink
ドキュメント から:
-N don't start a Shell/command (SSH-2 only)
これは、 manページ で説明されているように、ssh
オプション-N
と同じ動作です。
-N Do not execute a remote command. This is useful for just for-
warding ports (protocol version 2 only).
これは、(顕著な)量のCPUパワーを消費することなく、永久にスリープするはずです。
echo "Something" && while true; do sleep 9999; done
また、ForceCommand
句のようなコマンドを実行できるかどうかもわかりません。コマンドをシェルスクリプトに入れる必要があるかもしれません。
#!/usr/bin/env bash
echo "Success! Close this window to log out." && while true; do sleep 9999; done
もちろん、このスクリプトは、サーバー上の通常のユーザーがスクリプトに書き込めないような場所に配置し、アクセス許可を持っている必要があります。
Match User sampleUser
ForceCommand /usr/bin/waitforever
よりエレガントに見えるコマンドを見つけました:
echo "Something" && tail -f /dev/null
tail -f
ファイルまたはストリームがバイトを返すのを待ちます。 (それ以外の場合は、ログをリアルタイムで監視するのに役立ちます。)/dev/null
はバイトを返しません。そのため、コマンドは永久にスリープします。
あなたは間違った端からこれを解決しようとしています。シェルを終了させたくない場合は、PuTTYでウィンドウを開いたままにしておきます。
http://the.earth.li/~sgtatham/PuTTY/0.60/htmldoc/Chapter4.html#config-closeonexit -何を変更する必要があるかを正確に説明しています。 「クリーン終了時のみ」オプションを使用する場合は、ForceCommandの最後にexit 1
を追加するだけです。
編集:私は誤解しました;転送されたポートのみを維持したいので、ForceCommandの出力を維持したくありません。その場合、 http://tartarus.org/~simon/PuTTY-snapshots/htmldoc/Chapter4.html#config-ssh-noshell やりたいことをしませんか?
次のことを簡単に試すことができます。
echo "your commands" && while :; do sleep 1; done