タイムアウト変数出力設定

タイムアウト変数出力設定

Telnetを介して状態を自動的に照会しようとしています(この場合は不明です)。アイデアは、何かをgrepし、結果を変数に割り当て、後で条件文に渡すことです。問題は、ターゲットデバイスへのリンクが開始されない可能性があるため、タイムアウトで終了しないと、スクリプトが無期限に中断される可能性があることです。

これは私が期待するものを設定しますoutputが、リンクのクローズを処理しません。

output=$(telnet 1.2.3.4 1234 | grep "something")

リンククローズを処理すると、予想される出力が出力されます。

timeout --signal=9 3 telnet 1.2.3.4 1234 | grep "something"

出力を含むファイルに出力を送信することもできます。

timeout --signal=9 3 telnet 1.2.3.4 1234 | grep "something" > /tmp/tmpfile.txt

残念ながら、このようなファイルの高速書き込み/読み取りはログファイルをいっぱいにする可能性があるため、オプションではありません。

ただし、すべてを組み合わせようとすると、変数は設定されません。

output=$(timeout --signal=9 3 telnet 1.2.3.4 1234 | grep "something")

または、むしろ空の値に設定します。上記を実行する前に設定すると、後で変数が空になるためです。

ベストアンサー1

telnet標準入力にはttyが必要ですが、timeoutそれを削除してください。

本当にTelnetの使用に固執する場合は、次のように--foregroundオプションを追加することで実行できますtimeout

output=$(timeout --foreground --signal=9 3 telnet 1.2.3.4 1234 2>&1 | grep "something")

また、ncシステムにインストールできる場合は、実際に用途に合わせて使用​​する必要があります。

output=$(timeout 3 nc 1.2.3.4 1234 | grep "something")

ncどちらも効果がない場合は、timeout --foregroundttyを必要としないTelnetに代わるものが必要です。

Bashの独自のネットワーキング機能を使用できるように、質問にタグを追加したことを確認しました。bashしたがって、行は次のようになります。

output=$(timeout 3 cat < /dev/tcp/1.2.3.4/1234 | grep "something")

これがオプションでない場合は、catBashで次のように1行スクリプトに置き換えることができます。

output=$(timeout 3 stdbuf -oL bash -c 'while read line ; do echo "${line}" ; done < /dev/tcp/1.2.3.4/1234 | grep "something"')

少なくともstdbuf(標準coreutilsパッケージの一部である)システムで利用できることを願っています。

ただし、最後の選択肢ではgrep正規表現に注意してください。一重引用符がある場合は、まずデフォルトの一重引用符ペアを終了してエスケープする必要があります。

これは、シェルから1行スクリプトに変数(ホスト名やポート番号など)を渡す必要がある場合にも必要です。たとえば、

hostname=1.2.3.4
portnumber=1234

output=$(timeout 3 stdbuf -oL bash -c 'while read line ; do echo "${line}" ; done < /dev/tcp/'"${hostname}"'/'"${portnumber}"' | grep "something"')

${hostname}ここでは、値が信頼できると仮定します${portnumber}。つまり、あなたまたは他の信頼できる情報源から提供され、違法、無効、または危険な値を提供しません。

おすすめ記事