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


11

ポート転送でputty / plinkを開始するWindowsバッチファイルを作成しようとしていますが、それ以外は何もしません。これで、Windowsの部分の準備ができました。

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 sampleUser@192.168.0.1

認証後に他のコマンドの実行を許可したくないのでForceCommandMatch User宣言で使用しています:

Match User sampleUser
    ForceCommand echo 'Success! Close this window to log out.'

問題は、バッチファイルを実行するとパテが正しく起動するが、指定したテキストのエコーを実行した直後に閉じることです。

私の考えは、次のようなものを使用することです。

ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC

このようにして、putty / SSHは接続を維持し、ポート転送を終了しません。

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

  • 端末ウィンドウをスパムしています
  • 実際に何かをしている/不必要なCPU負荷を生成している
  • 誰かがEnterキーを押すと、突然終了する可能性があります

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

何に使うべきwaitTillControlCですか?


superuser.com/questions/587629/…のような質問を見つけましたが、ユーザーにはすぐに使用できるシェルが残されます。
stuXnet

回答:


13

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

たとえば、疑わしい100年の間、ここでスリープしようとします。とにかく、要求に応じるのに十分なことをします。

echo "Something"; sleep 36500d

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

echo "Something"; read foo

9

-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).

2
これは受け入れられた答えであるはずです。他の人は回避策を講じる方法を言っていますが、これは正しい方法を言っています
モシェカッツ

編集してくれてありがとう。チェックするWindowsボックスがないので、オンラインでplink docsを探すことは考えていませんでした。
chepner

この答えは私のニーズに合わない、なぜならI don't want to allow to execute other commands after authentication-Nクライアント側でこれを実現するため、認証後に-Nを削除して他のコマンドを実行するだけで済みます。
stuXnet

8

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


この瞬間、私は自分自身でスリープループを試みていました-ええ、これは間違いなく機能します ForceCommandを使用して直接:ForceCommand echo 'congrats' && while true; do sleep 9999; done
stuXnet

tail -f /dev/null技術的には、9999ループよりも悪いです。プロセスは、2時間56分ごとではなく、1秒ごとに起動します。
jlliagre

私はここでそれを見つけました:unix.stackexchange.com/questions/42901 / ...その質問に答える人は、「(これは内部的にinotifyを使用し、ポーリングまたはウェイクアップがないはずなので、見た目が奇妙であるだけで十分であるはずです) 「この声明またはtailがinotify間違っているという仮定ですか?
nitro2k01

仮定は正しいものでtailありinotify、利用可能な場合に活用するように最適化されています。これは、最近の十分な分布ではないにしても、ほとんどの場合のデフォルトのケースです。ただし、Linuxラップトップでテストしたところ、tail監視による偽のアクティビティが観察された/dev/nullため、クロックサイクルの観点でスリープするのは確かに悪いことです。
jlliagre

私はそれtailが毎秒目覚めるとは思わない。結果の考えられる理由は、tail何らかの理由で通信している端末で実行しているが、sleepそうでない場合です。監視だけtailを誤って起こす理由はありません。/dev/null
nitro2k01

0

以下を簡単に試すことができます。

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

1
将来の訪問者のために、これがどのように機能するかの要約を提供する必要があります。多くの人が知っているかもしれませんが、すべての意志を想定することはできません。
オタクウォーラー

sleepCPUでの期間が長くなるほど簡単になりますsleep 1が、過去20年間に構築されたものであればどれでも十分に安全であるはずです
...-Shadur

:はの省略形ですtruesleep原則として、もっと長い期間を希望します。
nitro2k01

0

あなたは間違った終わりからこれを解決しようとしています。シェルを終了させたくない、パテにウィンドウを開いたままにしておきたい。

http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit-変更する必要があるものを正確に説明しています。「クリーンな終了時のみ」オプションを使用する場合exit 1は、ForceCommandの最後に追加するだけです。

編集:私は誤解しました。転送されたポートのみを維持したい場合、ForceCommandの出力を保持したくない場合。その場合、http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshellはあなたがしたいことをしませんか?


問題は、ウィンドウが閉じることではなく、sshトンネルがシャットダウンされることです。PuTTYにウィンドウを開いたままにしておくと、sshトンネルも維持されますか?
エイドリアンプロンク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.