我需要通过 传输文件ssh
,但不幸的是scp
,这sftp
是不可行的,因为我连接的主机只是一个“门”节点,它将我重定向到仅在其所连接的私有超级计算网络上可用的另一台机器(因此它要求我输入密码两次)。因此,我无法在门节点上运行任何命令。
我想知道是否可以使用某种使用 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 会话中,而且速度更快:
#!/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
首先是配置,您可以在其中设置主机以通过“门”或更确切地说是跳箱。你~/.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
. - 解码用
然后用以下命令提取焦油base64 -d folder.tar.txt > folder.tar
tar xvf folder.tar