web-dev-qa-db-ja.com

Linuxに、終了するまで待機するコマンドはありますか?

ポートフォワーディングでPuTTY/plinkを開始するWindowsバッチファイルを作成しようとしています。これで、Windowsパーツの準備が整いました。

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 [email protected]

認証後に他のコマンドの実行を許可したくないので、ForceCommandMatch 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は接続を維持し、ポート転送を終了しません。

yespingreadのようなコマンドを考えましたが、それらは

  • ターミナルウィンドウにスパムを送信しています
  • 実際に何かをしている/不要なCPU負荷を生成している
  • 誰かがEnterキーを押すと、予期せず閉じる可能性があります

誰かがCtrl + Cで終了するか、PuTTYウィンドウを閉じてSSH接続を閉じるまで、永久に何もしないコマンドはありますか?

waitTillControlCには何を使用すればよいですか?

11
stuXnet

他のすべての応答がここでループを使用したい理由がわかりません。スリープは実用的な目的のために十分長く待機することができ、それを実行するクロックサイクルを使用しません。

たとえば、ここでは疑わしい100年間眠ろうとし、とにかく要求に応じるのに十分なことをします。

echo "Something"; sleep 36500d

または、入力するまでこれもブロックする必要があります Enter キー:

echo "Something"; read foo
13
jlliagre

代わりに-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).
9
chepner

これは、(顕著な)量の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はバイトを返しません。そのため、コマンドは永久にスリープします。

8
nitro2k01

あなたは間違った端からこれを解決しようとしています。シェルを終了させたくない場合は、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 やりたいことをしませんか?

0
Gabe

次のことを簡単に試すことができます。

echo "your commands" && while :; do sleep 1; done
0
user2783132