sshクライアントの引数の後に対話型プログラムが続く場合、sshdは疑似端末を使用しないのはなぜですか?


11

SSHサーバーに接続する通常の方法はssh username@ip_addressです。しかし、ユーザーはリモートマシンでプログラムを実行したいだけかもしれません。したがって、プログラム名は、通常の引数の後に続きますssh username@ip_address <program_name>。たとえば、ssh username@ip_address ls。対話型プログラム(ユーザー入力も受け入れ、出力も提供する)を除いて、その引数は問題ありませんtop。出力は

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

つまり、sshdとtopプログラムの間に(疑似)端末が接続されていません。解決策は-t、コマンド全体がになる引数を追加することssh -t username@ip_address topです。

私の質問は、なぜデフォルトではsshdも疑似端末を使用して非対話型プログラムと通信できない-tため、対話型プログラムの引数を追加する必要がないのですか?


3
短い答えは「それは通常あなたが望むものではないから」です。
Celada 2016年

私はあなたの質問が本質的に意見を懇​​願する/不満を作るために緩和されると予測します。しかし、問題をひっくり返してみましょう。大多数のケースでttyリソースが必要ないのに、なぜsshがttyリソースを割り当てる必要があるのでしょうか。本当の質問は、なぜそれをデフォルトまたはホスト固有のデフォルトにすることができるように、強制-tty割り当てが構成オプションではないのですか?
Otheus 2016年

@Otheusこれは、ある設定オプション。設定でRequestTTY yes(またはforce)設定できます。
Jakuje 2016年

ええ、確かに。6で導入されたようですが、すぐ後までバグがあります。私は非常に古いディストリビューションのみを使用しています。:)
Otheus 2016年

6
SSHは、プログラムがインタラクティブであることをどのように確実に知ることができますか?topバッチモードでも実行できます。
muru、2013年

回答:


18

他の人が言ったように、PTYにはある程度のオーバーヘッドがあることは事実ですが、リモートコマンドの実行時にPTYを使用しない大きな理由は、情報を失うことです。

通常、sshを介してリモートでコマンドを実行すると、コマンドstdoutstderrストリームはローカルstdoutとに送信されます。つまり、次のように、stderrそれらを個別にリダイレクト/パイプできます。

$ 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

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

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

これは私が知らなかった良い点です。
Jakuje 2016年

1
@ThomasDickey:ほとんど...問題は、「開発者がこのデフォルトを選択した背後にある歴史的な理由は何か」ではなく、「なぜデフォルトで疑似端末をsshdで使用できないのか」です(強調は私のものですが、言い回しは多かれ少なかれ質問から直接です)。したがって、(多くのスクリプトイディオムを壊す)動作の違いは、開発者がどのように選択したかに関係なく関連性があります:-)
psmears

2
@ThomasDickey:あなたも質問を読んだことがありますか?開発者の意見はどこに記載されていますか?
psmears 2016年

1
+1は、ptyを使用しない(パフォーマンス以外の)特定の利点を示します。それ-tがデフォルトであり、それをオフにするために必要なオプションであるとまだ主張することができるので、実際には、重要でない場合にパフォーマンスのマイナーなメリットが最も理にかなっています。
Peter Cordes

7

sshこれを説明するマニュアルページ:

ユーザーのIDがサーバーに受け入れられると、サーバーは非対話型セッションで特定のコマンドを実行するか、コマンドが指定されていない場合はマシンにログインして、ユーザーに対話型セッションとして通常のシェルを提供します。リモートコマンドまたはシェルとのすべての通信は自動的に暗号化されます。

それは機能であり、おそらくrsh行動の歴史的な理由によって引き起こされます。それはかなり合理的です。ほとんどのコマンドは実際にはインタラクティブではなく、PTYを割り当てるのは自由な操作ではありません(20年前に重要でした)。


リソースの問題はもっともらしいですが、rshそのプログラムには対応するオプションがないため、コメントは曖昧です。
トーマスディッキー2016年

@ThomasDickey私が使用rshしたことはありませんが、オプションではなく、rshandの動作rlogin(コマンドがある場合とない場合)には確かに影響があります。rshを使用して対話型コマンド(rogue(6)やvi(1)など)を実行することはできません。代わりにrlogin(1)を使用してください。
Jakuje 2016年

1

ssh呼び出すコマンドがインタラクティブかどうかを判断するにはどうすればよいですか?

この悪夢は、UNIX以外のOSを実行しているマシンにログインしている可能性があることに気づくとさらに悪化します。

簡単な解決策はなく、1つのケースをデフォルトにする必要がありました。


知りません。わかりません。したがって、これらの状況での動作を説明するマニュアルページがあります。
Jakuje 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.