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セッションをバイト単位で置き換えることが期待されます。stdout
stdin
recv()
send()
一般的な使用法ProxyCommand
は、1つのサーバーを介してSSHトンネルを確立してセカンダリサーバーに接続することです。そうしないと、セカンダリサーバーは直接接続を確立できません。これは、ソケット側でnetcat
to リンクと to リンクを処理する (nc) コマンドで ssh クライアントを使用することで実現できます。netcat
stdout
send()
stdin
recv()
ProxyCommand
設定されていないエントリを呼び出してstdout
、stdin
SSHプロトコルが正しいSSH転送をネゴシエートすると予想するものと一致する場合、クライアントは次のエラーで終了しますssh_exchange_identification: Connection closed by remote host
。
SSHセッションが確立され認証された後に実際にリモートホストでコマンドを実行したい場合は、sshコマンドラインの末尾に含めると、ProxyCommand
SSHクライアントはリモートホストからコマンドを呼び出します。対話型シェルではなくリモートホスト。
試してssh root@ubuntu ls
みてください。