以下を介してファイルを転送する必要がありますssh
が、残念ながら、私が接続しているホストは、コンピュータに接続されたプライベートスーパーコンピューティングネットワークでのみ利用可能な別のノードにリダイレクトする「ゲート」ノードにすぎないため、scp
これは不可能です。sftp
パスワードを2回入力する必要があります。)したがって、ゲートノードではどのコマンドも実行できません。
SSH接続の出力(ターミナル)ストリームを使用してファイルを転送するためのいくつかのツールが利用可能かどうか疑問に思います。
唯一のオプションは、ファイルを便利な形式(例:base64)で出力し、クリップボードにコピーしてローカルにデコードすることです(またはその逆)。
vimを遠隔で使うことにイライラを感じ始めました。私が実装したいのは、プログラムのソースコードをローカルで編集してからリモートでテストするrsyncのようなシステムですが、見てわかるようにそれほど簡単ではありません。
おそらく私だけがこの問題を経験しているのではないでしょう。したがって、この目的のためのツールが必要ですか? (FUSEを使用するソリューションが最善ですが、これがあまりにも多くを必要とする可能性があることを知っています。)
答え1
回答をしたくありませんが、コメントウィンドウがますます大きくなり、SEからチャットウィンドウをチャットウィンドウに移動するように通知されます。
したがって、enter
数回クリックして~?
スペースを入力しないでください。何もない。
次の(またはまさにこのような)コンテンツが表示されます。
Supported escape sequences:
~. - terminate connection (and any multiplexed sessions)
~B - send a BREAK to the remote system
~C - open a command line
~R - Request rekey (SSH protocol 2 only)
~^Z - suspend ssh
~# - list forwarded connections
~& - background ssh (when waiting for connections to terminate)
~? - this message
~~ - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
今すぐ入力するとプロンプトが~C
表示されます。ssh>
この時点で入場してください
ssh> !scp /path/to/some/file/on/your/local/machine user@remoteserver
すでに認証されているため、既存の接続を介してファイルを転送する必要があります。
答え2
タスクをどのように自動化したいかによって、expect
人間のようにSSHセッションにデータを「供給」することで、Bascheonホストを介して内部システムにデータを渡すことを選択できますが、はるかに高速です。
#!/usr/bin/env expect
if {[llength $argv] == 0} {
puts stderr "Usage: $argv0 bastion internalhost localfile"
exit 1
}
set basthost [lindex $argv 0]
set desthost [lindex $argv 1]
set fileup [lindex $argv 2]
spawn ssh -a -e none -o ClearAllForwardings=yes -x $basthost
# TODO login foo here for bastion host, e.g. send the password
# if see that prompt
expect {
# TODO handle timeout, eof, etc.
# TODO I have no idea what your ncurses interface looks
# like, though there's doubtless something that could
# be matched and the appropriate input sent to it...
-ex "$ " {
send -- "ssh $desthost\r"
# TODO handle subsequent login to the internal host here
}
}
その後、(適切なステートメントを介して)ターゲットホストにエディタまたは他のエントリが開いている場合は、次のようにsend
データを提供できます。
set upfd [open $fileup]
while {[gets $upfd line] >= 0} {
send -- "$line\r"
}
次に、より多くのsend
呼び出しを使用してファイルの保存、終了などを実行します。エラー処理などもあります。
答え3
1つ目は、「ドア」またはボックスジャンプを通過するようにコンソールを設定する構成です。あなたは~/.ssh/config
次のようになります:
Host door
Hostname door.example.com
User username_on_door
# ...
Host target
Hostname tagret.example.com
User user_on_target
# ...
ProxyCommand ssh -W %h:%p door
その後、次のいずれかのコマンドを使用してターゲットシステムに直接接続できます。ssh target
その後、単一のコマンドを使用してファイルを前後に転送することもできます。
ssh taget "tar czpf - /some/important/data" | tar xzpf - -C /new/root/directory
tar cpf - /some/important/data | ssh target "tar xpf - -C /some/directory/"
sshfs
ホストを起動できます。
sshfs target:/dir/ /mnt/target
複雑すぎませんか?
答え4
SCP2はローカルコンピュータからリモートコンピュータに移動する方法のようです。しかし、私は簡単に別の道に行くことができました。
- プルしたいフォルダをリモコンに保管しておきました。
そしてそうだったtar cvf folder folder.tar
base64 folder.tar
- テキスト出力をコピーしてローカルコンピュータのファイルに貼り付けます
folder.tar.txt
。 - デコード用
次に、次のコマンドを使用してtarを抽出します。base64 -d folder.tar.txt > folder.tar
tar xvf folder.tar