SSH 后 scp 到本地计算机

SSH 后 scp 到本地计算机

在我的本地计算机上,我可以从远程计算机复制文件

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

  1. 连接$remote建立远程端口转发:

    client:~> ssh -R 8888:localhost:8888 $remote
    

    这会建立与 的正常连接$remote,但另外还会告诉您侦听远程端的ssh端口。8888如果有东西连接到8888远程端的端口,将打开到客户端(因此,客户端)端口ssh的连接,并将发送到远程端端口的任何内容转发到此端口。localhost88888888

  2. 使用监听客户端的端口8888(因此ssh有要连接的东西)nc。我们将输出(客户端)接收nc到管道中,因为我们稍后将向其tar发送一个流:tar

    client:~> nc --recv-only -l -p 8888 | tar xvf -
    
  3. 在远程端,将当前工作目录更改为您想要的任何位置。

  4. 如果您在正确的位置,请使用tar收集您想要复制的文件并将它们传输到(远程端)nc,连接到远程端打开的端口:

    server:~> cd /path/with/those/files
    server:files> tar cvf - ./some/files | nc --send-only 127.0.0.1 8888
    
  5. 魔法™发生了。

笔记:至少有三种不同的实现nc,它们的语法都略有不同;--send-onlyAFAIK--recv-only仅支持网猫6。如果您的实现不支持这些(或类似)选项,则必须查看发送方 是否tar退出并点击Ctrl- 。通常会永远等待并且不处理(告诉它处理并自动关闭连接)。CncEOF--send-only

另一个注意事项:您也可以nc直接使用,但通过使用ssh的端口转发,您的数据将通过 SSH 连接,避免两个问题:第一,您的数据仍然以加密方式发送,第二,如果您的客户端位于 NAT 之后,这也适用防火墙或其他无法直接从您的$remote.

相关内容