在我的本地计算机上,我可以从远程计算机复制文件
scp remote:/some/file/path ~
但是如果我已经通过 SSH 连接到远程计算机怎么办?我可以做这样的事情吗
ssh remote
cd /some/file
scp path local:~
以local
某种方式解析到我通过 SSH 连接的机器从。如果本地计算机正在运行 SSH 服务器并且远程计算机配置为连接到它,这当然是可能的,但这并不总是一个选项。
这样的事情可能吗?
答案1
正如评论中提到的,我建议使用sftp
:
$ sftp remote
user@remote's password:
Connected to remote.
sftp> pwd
Remote working directory: /home/user
sftp> cd /etc
sftp> get fstab
Fetching /etc/fstab to fstab
/etc/fstab 100% 435 0.4KB/s 00:00
sftp>
另一种相当……hacky 的方法是滥用 SSH 的端口转发功能,并结合nc
(又名netcat
)。 nc
是“网络瑞士军刀”(较小的……还有socat
,更像是 MultiTool®;)——一种cat
具有网络功能的工具。
想法:告诉ssh
将远程计算机的远程端口转发到客户端的本地端口,并使用此连接通过管道传输数据nc
:
连接
$remote
建立远程端口转发:client:~> ssh -R 8888:localhost:8888 $remote
这会建立与 的正常连接
$remote
,但另外还会告诉您侦听远程端的ssh
端口。8888
如果有东西连接到8888
远程端的端口,将打开到客户端(因此,客户端)端口ssh
的连接,并将发送到远程端端口的任何内容转发到此端口。localhost
8888
8888
使用监听客户端的端口
8888
(因此ssh
有要连接的东西)nc
。我们将输出(客户端)接收nc
到管道中,因为我们稍后将向其tar
发送一个流:tar
client:~> nc --recv-only -l -p 8888 | tar xvf -
在远程端,将当前工作目录更改为您想要的任何位置。
如果您在正确的位置,请使用
tar
收集您想要复制的文件并将它们传输到(远程端)nc
,连接到远程端打开的端口:server:~> cd /path/with/those/files server:files> tar cvf - ./some/files | nc --send-only 127.0.0.1 8888
魔法™发生了。
笔记:至少有三种不同的实现nc
,它们的语法都略有不同;--send-only
AFAIK--recv-only
仅支持网猫6。如果您的实现不支持这些(或类似)选项,则必须查看发送方 是否tar
退出并点击Ctrl- 。通常会永远等待并且不处理(告诉它处理并自动关闭连接)。Cnc
EOF
--send-only
另一个注意事项:您也可以nc
直接使用,但通过使用ssh
的端口转发,您的数据将通过 SSH 连接,避免两个问题:第一,您的数据仍然以加密方式发送,第二,如果您的客户端位于 NAT 之后,这也适用防火墙或其他无法直接从您的$remote
.