Telnet は、「外部ホストによって接続が終了しました」というメッセージを表示しません。接続が切断されたとき

Telnet は、「外部ホストによって接続が終了しました」というメッセージを表示しません。接続が切断されたとき

私は組み込みLinuxデバイスを使用しており、これが私の状況です:

マイコンピュータ(Ubuntu 16.04システム)を使用してrebootコマンドを実行したデバイスにTelnetで接続し、デバイスが正常に再起動しました。

問題は、Connection closed by foreign host.デバイスが自動的にシャットダウンしたときにTelnetに戻ってメッセージを表示させることです。しかし時間が合わなかったので、むしろConnection closed by foreign host.その後のみメッセージが表示されます。

  1. マイコンピュータでEnterキーを押します。 そして

  2. デバイス起動後/中

マイ コンピューターで別のデバイスで同じ操作を実行する場合、これらの問題はありません。

なぜそんなことですか?これはTelnet、マイコンピュータ、または内蔵デバイスに問題がありますか?どうすれば解決できますか?

答え1

ほとんどの場合、クライアントシステム(Telnetを実行しているシステム)でTCPキープアライブがグローバルに有効になっていない(おそらく有効にしてはいけません)、組み込みシステムは正常に接続を終了しません。

これは、各ユーザーセッションごとに別々のプロセスを作成し、メインプロセスが終了したときに終了しないネットワークサービスの一般的な問題ですが、サービスを再起動して接続ユーザーに影響を与えることなくアップグレードできます。これが彼らが最初にそうした理由です)。

答え2

ソケットにいくつかのオプションを適用して、Telnet接続に対してのみ接続維持を有効にできます。プログラムをコーディングして再コンパイルする代わりに、既存のライブラリを簡単に使用できます。libkeepalive

ソースtarファイルをダウンロードlibkeepalive-0.3.tar.gzし、コマンドを使用してライブラリをコンパイルしますmake

tar xvzf libkeepalive-0.3.tar.gz
cd libkeepalive-0.3
make

ファイルがありますlibkeepalive.so。これで、プリロードされたライブラリを使用してTelnetを実行できるようになりました。これにより、socket()機能が適切に変更されます。グローバルKeepaliveなど、ご使用の環境で設定できる値は3つです。例えば、

LD_PRELOAD=$PWD/libkeepalive.so \
 KEEPCNT=2 KEEPIDLE=2 KEEPINTVL=4 telnet hostname

リモートデバイスがkeepaliveパケットへの応答を停止すると、telnetコマンドは次のように終了します。Connection closed by foreign host.

READMEソースのファイルを確認してください。

KEEPCNT     <=>   net.ipv4.tcp_keepalive_probes
KEEPIDLE    <=>   net.ipv4.tcp_keepalive_time
KEEPINTVL   <=>   net.ipv4.tcp_keepalive_intvl

KEEPIDLE 秒後、KEEPINTVL 秒ごとにコネクション保持パケットが送信されます。 KEEPCNT KEEPCNT データパケットへの応答がない場合、接続は切断されます。

関連情報