マシン A からサーバー C にファイルをコピーしたいのですが、サーバー C にはサーバー B 経由でしかアクセスできません。
最初にサーバー B に転送し、ログインしてからサーバー C に転送するのではなく、SCP または同様のプログラムを使用してファイルを直接転送することは可能ですか?
(Emacs tramp-mode には、ファイルをリモートで編集するためのこの機能があります)。
答え1
の代わり-o
に にオプションを追加できます。scp
.ssh/config
scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path
$jump_host
この場合は「サーバー B」になります。
答え2
OpenSSHの場合、.ssh/configのSSH設定に追加します。
Host distant
ProxyCommand ssh near nc distant 22
これにより、SSH は near という名前のマシンをプロキシとして、distant という名前のマシンに「直接」接続できるようになります。その後、scp や sftp などのアプリケーションを遠隔マシンに対して使用できるようになります。
これを機能させるには、near という名前のマシンに 'nc' (別名 netcat) がインストールされている必要があります。ただし、最近のシステムの多くにはすでにインストールされています。
towo の tar ソリューションは、tar の構文と操作規則を記憶していれば、ワンショットの問題に対してより効果的です。
答え3
(B) マシンの近くのサーバー上のより新しいバージョンの ssh では、netcat なしで以下が機能します。
Host distant
ProxyCommand ssh near -W distant:22
ただし、近くの(B)マシンではAllowTcpForwardingがyes(デフォルト)になっている必要があります。
編集: B では OpenSSH 5.4 以上が必要です
答え4
認証に証明書を使用する必要がある場合でも (AWS 環境では一般的)、これは可能であり、比較的簡単です。
以下のコマンドは、 のファイルを のマシンに直接コピーしますremotePath
。server2
内部localPath
的には、 scp 要求は 経由でプロキシされますserver1
。
scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>
逆の方法も使えます (ファイルをアップロード):
scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>
代わりにパスワード認証を使用する場合は、
scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>
両方のサーバーで同じユーザー資格情報を使用する場合:
scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>
この-W
オプションは OpenSSH の新しいバージョンに組み込まれているため、最小バージョン (ディストリビューションが機能をバックポートしていない限り 5.4。たとえば、RHEL6 OpenSSH 5.3p1 にはこの機能が含まれています) を搭載したマシンでのみ機能します。リリース ノートによると、次のようになります。http://www.openssh.com/txt/リリース-5.4
ssh(1) に「netcat モード」を追加しました: "ssh -W host:port ..." これは、クライアントの stdio をサーバーの単一ポート転送に接続します。これにより、たとえば、ssh を ProxyCommand として使用して、中間サーバー経由で接続をルーティングできるようになります。
%h
%p
ホストとポートのプレースホルダーです。