3

使用時に端末のサイズを変更する方法を探していtelnetlibます。Paramiko のresize_ptyを使用して SSH で同様の効果を達成しましたが、telnet プロトコルもサポートする必要があります。これは可能ですか (telnet には制御ストリームもありますか)?

telnetlib は必須ではないことに注意してください。より良いライブラリがあれば、喜んで使用します。

更新(背景の詳細​​): ネットワーク デバイスに接続するための Web ベースのインターフェイスを構築しています。フロントエンドは JS/AJAX を使用して構築されており、基本的にはキーストロークをバックエンドに送信し、そこから画面コンテンツを受け取るだけです。バックエンドは Python で記述されており、デバイスへの SSH/telnet セッションの開始、キーストロークの送信、および出力ストリームの取得を処理します。出力ストリームは、VT100 仮想端末 ( pyte ) を介して渡されます。次に、仮想スクリーンの内容がフロントエンドに送り返されます。この問題は、ユーザーがブラウザで端末の画面サイズを変更したい場合に発生します。SSHで送信するだけですresize_pty()Paramiko を介して、pyte の仮想端末の画面サイズも変更します。しかし、telnet では、端末のサイズを変更する必要があることをデバイスに伝える適切なサイズ変更機能を見つけることができませんでした。これは可能ですか?

4

1 に答える 1

4

わかりました、次の傑作を組み立てることができました。

naws_command = struct.pack('!BBBHHBB',
        255, 250, 31, # IAC SB NAWS
        width, height,
        255, 240) # IAC SE
t.get_socket().send(naws_command)

説明のいくつかの言葉。

まず第一に、telnetlibコマンドの直接送信をサポートしていません。それは単にそれらをエスケープします。したがって、コマンドを送信するには、基になるソケットを直接使用する必要があります。これは、オブジェクト インスタンスのget_socket()メソッドを使用して行います (ここ)。Telnett

ここNAWSで組み立てられたコマンドは、RFC 1073で定義されています。widthおよび変数は、height2 つの 16 ビット符号なし整数にパックされる通常の Python 整数です。

これは完全な解決策ではないことに注意してください。実際にうまくいくかどうかはわかりません。最も重要なことは、機能のネゴシエーション中にtelnetlibがサーバーに通知するWON'T NAWSため、特定のサーバーがコマンドを実際に無視する可能性があることです。

その場合は、おそらくset_option_negotiation_callback()を使用する必要があります。悲しいことに、これは、通常はすべてのオプションを処理する必要があることを意味telnetlibします。そして、知る限り、そのための便利さはありません。

于 2012-07-30T20:19:58.277 に答える