特定のホストに直接sftpすることはできません。ホームマシンからホストにファイルを移動するには、ファイルを中間ホストにsftpする必要があります。中間ホストにSSH接続します。そして、ファイルを最終的な宛先にsftpします。そのような狂気を避けることは可能ですか?
ローカルマシンから、中間ホストから最終ホストまでのSSHトンネルを作成できます。
ssh user@intermediate -L 2000:final:22 -N
これにより、ローカルホストでポート2000が開き、中間ホストをトンネリングすることで、ポート22の最終サーバーに直接接続します。ここで、別のプロンプトで、ポート2000でsftpに接続して、最終サーバーにトンネリングします。ここで指定したユーザーは、最終ホスト用であることに注意してください。
sftp -P 2000 user@localhost
これは superuser.com または serverfault.com に属しているようです。
SFTPのProxyCommandオプションを使用して、SSH接続を介してSFTP接続を透過的にトンネリングできます(WhiteFang34の回答に少し似ていますが、転送されたローカルTCPポート)ではなく、SSH接続のstdin&stdoutを介して):
sftp -o "ProxyCommand=ssh -e none user@intermediatehost exec /usr/bin/nc %h %p 2>/dev/null" user@finalhost
(これは、中間ホストにnetcatが/ usr/bin/ncとしてインストールされていることを前提としています。そうでない場合は、stdin&stdoutをTCPセッションにゲートウェイする同等の方法を見つけてインストールする必要があります。)
このオプションの本当にすばらしい点は、〜/ .ssh/configファイルに追加できることです。これにより、次のように透過的になります。
Host finalhost
ProxyCommand ssh -e none user@intermediatehost exec nc %h %p 2>/dev/null
このエントリを使用すると、sftp、scp、およびsshを使用してfinalhostを実行でき、トンネルが自動的に呼び出されます。唯一の不透明な部分は、2つのパスワード(intermediatehostの後にfinalhostが続く)を要求することですが、必要に応じて、SSHキーペアを使用してそれを排除することもできます...
マシンで実行されているsshプロセスにデータをパイプしてから、中間マシンでコマンドを実行して、stdinを読み取り、必要に応じてsftpに送信することができます。
これはローカルマシンのワンライナーで実行できますが、sshへの引数の引用には注意が必要です。私は今電話をしているので、残念ながら詳細を入力することはできません。おそらく、他の誰かがこの答えを演習として完了することができます!
最終的なホストはファイアウォールで保護されていると想定しており、それを回避するために使用できる方法を推測することしかできません。
たとえば、ローカルマシンからsshを公開し、次に最初のホストにsshを公開し、次に2番目のホストにsshを公開し、最後のホストからマシンにsftpを公開します。
aとBが最初と2番目のホストであるとしましょう。そして、コピーされるファイルはfooです
Sftpの代わりに、次を使用できます
猫foo | ssh「猫-> foo」
これで、これらのうち2つをデイジーチェーン接続できます
猫foo | ssh A "cat- | ssh B \" cat-> foo\""