sshクライアントの引数の後にインタラクティブプログラムが続くときにsshdが疑似端末を使用しないのはなぜですか?

sshクライアントの引数の後にインタラクティブプログラムが続くときにsshdが疑似端末を使用しないのはなぜですか?

SSHサーバーに接続する一般的な方法はですssh username@ip_address。ただし、ユーザーはリモートコンピュータでのみプログラムを実行したい場合があります。したがって、プログラム名は一般的なパラメータに従います(ssh username@ip_address <program_name>例:)ssh username@ip_address ls。この主張は、(ユーザー入力を受け入れて出力も提供する)対話型プログラムを除外することをお勧めしますtop。出力は次のとおりです

TERM 環境変数が設定されていません。

これは、sshdと最上位プログラムの間に接続された(類似)端末がないことを意味します。解決策は、-tコマンド全体になるパラメータを追加することですssh -t username@ip_address top

私の質問は、基本的にsshdが非対話型プログラムと通信するために疑似端末を使用せず、対話型プログラム-tにパラメータを追加する必要がない理由です。

答え1

はい、他の人が言ったように、PTYには少しオーバーヘッドがあります。ただし、リモートコマンドを実行するときにPTYを使用しない最大の理由は、情報が失われるためです。

通常、sshを介してリモートでコマンドを実行すると、コマンドstdoutstderrストリームがlocalhostに送信されますstdoutstderrつまり、個別にリダイレクト/パイプできます。たとえば、次のようになります。

$ ssh server ls foo bar
ls: cannot access bar: No such file or directory
foo
$ ssh server ls foo bar > stdout 2> stderr
$ cat stdout
foo
$ cat stderr
ls: cannot access bar: No such file or directory

stdoutただし、PTYを使用している場合、PTYには別々の出力/エラーストリームがないため、すべての出力がPTYに移動します。

$ ssh -t server ls foo bar > stdout 2> stderr
$ cat stdout
ls: cannot access bar: No such file or directory
foo
$ cat stderr
$

答え2

マニュアルページでは、ssh次のように説明します。

サーバーがユーザーの身元を承認すると、サーバーは次のいずれかを実行します。非対話型セッションで指定されたコマンドを実行します。または、コマンドが指定されていない場合は、システムにログインし、対話型セッションとして一般的なシェルをユーザーに提供します。。リモートコマンドまたはシェルとのすべての通信は自動的に暗号化されます。

これは特性であり、行動の歴史的原因によって引き起こされる可能性がありますrsh。これは非常に合理的です。ほとんどのコマンドは実際にはインタラクティブではなく、PTY割り当ては無料作業ではありません(20年前はこれがより重要でした)。

答え3

ssh呼び出すコマンドがインタラクティブかどうかはどうすればわかりますか?

UNIX以外のオペレーティングシステムを実行しているコンピュータにログインしている可能性があることがわかると、これらの悪夢はさらに悪化します。

簡単な解決策はなく、1つの状況をデフォルトとして採用する必要があります。

関連情報