ProxyCommandでこれらのコマンドを使用できないのはなぜですか?

ProxyCommandでこれらのコマンドを使用できないのはなぜですか?

ProxyCommandどのように機能するのか理解しようとしています。

%> ssh -oProxyCommand='ls' root@ubuntu
ssh_exchange_identification: Connection closed by remote host

%> ssh -oProxyCommand='useradd' root@ubuntu
/bin/bash: line 0: exec: useradd: not found
ssh_exchange_identification: Connection closed by remote host

また、次の組み込みコマンドを試しましたが、env出力も提供されませんでした。

任意のコマンドを実行できない理由についてのアイデアはありますか?

編集する

同様のコマンドを実行できることを知っていますssh host $command。 ProxyCommandがコマンドを実行できない理由を特定しようとしています。実際に人々が反対する理由はわかりません。

答え1

このProxyCommandオプションは、リモートシステムで実行するための任意のコマンドではありません。いくつかのデータフロー。 ~からマニュアルページssh_config(強調する):

プロキシコマンド

使用するコマンドを指定します。サーバーに接続。コマンド文字列は行末まで拡張され、シェルプロセスの遅延を避けるために、ユーザーのシェル 'exec'コマンドを使用して実行されます。

コマンド文字列では、「%h」は接続するホスト名、「%p」はポート、「%r」はリモートユーザー名に置き換えられます。コマンドは基本的に何でも構いません。標準入力から読み取って標準出力に書き込む必要があります。 最後に、一部のシステムで実行されている sshd(8) サーバーに接続するか、どこかで sshd -i を実行する必要があります。

sshリモートシステムでのみコマンドを実行するには、次のようにコマンドラインの末尾に入力します。

ssh root@ubuntu ls

答え2

あなたがProxyCommand指定しましたいいえリモートホストで実行されます。リモートホスト(通常はポート22)へのTCP接続を開くための代替接続方法として、ローカル(クライアント)側で実行されます。実行中の実行可能ファイルはソケット自体のプロキシを介してProxyCommandローカルSSHクライアントと通信することが予想されますが、クライアントの観点からは、その動作は実際のSSHサーバーへのTCPセッションをバイト単位で置き換えることが期待されます。stdoutstdinrecv()send()

一般的な使用法ProxyCommandは、1つのサーバーを介してSSHトンネルを確立してセカンダリサーバーに接続することです。そうしないと、セカンダリサーバーは直接接続を確立できません。これは、ソケット側でnetcatto リンクと to リンクを処理する (nc) コマンドで ssh クライアントを使用することで実現できます。netcatstdoutsend()stdinrecv()

ProxyCommand設定されていないエントリを呼び出してstdoutstdinSSHプロトコルが正しいSSH転送をネゴシエートすると予想するものと一致する場合、クライアントは次のエラーで終了しますssh_exchange_identification: Connection closed by remote host

SSHセッションが確立され認証された後に実際にリモートホストでコマンドを実行したい場合は、sshコマンドラインの末尾に含めると、ProxyCommandSSHクライアントはリモートホストからコマンドを呼び出します。対話型シェルではなくリモートホスト。

試してssh root@ubuntu lsみてください。

関連情報