繁体   English   中英

当我已经 sshed 到远程机器时如何 scp 回到本地?

[英]How to scp back to local when I've already sshed into remote machine?

我经常遇到这种情况:我连接到远程服务器并运行了一些程序,我想将它们的 output 文件复制回我的本地计算机。 我所做的是记住远程机器上的文件路径,退出连接,然后scp user@remote:filepath.

显然这不是最优的。 我正在寻找的是一种让我 scp 文件回到本地机器而不退出连接的方法。 我做了一些搜索,几乎所有结果都告诉我如何从我已经知道的本地机器上执行 scp。

这可能吗? 更好的是,是否有可能不需要知道我本地机器的 IP 地址?

鉴于您在本地计算机上运行了sshd ,这是可能的,您不需要知道您的传出IP地址。 如果启用了SSH端口转发,即使已经打开ssh连接并且没有终止它,也可以打开安全隧道。

假设您与某个服务器有ssh连接:

local $ ssh user@example.com
Password:
remote $ echo abc > abc.txt  # now we have a file here

好了,现在我们需要将该文件复制回本地服务器,由于某种原因我们不想打开新连接。 好的,让我们按Enter ~C (输入,然后是代字号,然后是大写C)来获取ssh命令行:

ssh> help
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KR[bind_address:]port                 Cancel remote forward

这就像常规的-L/R/D选项一样。 我们需要-R ,所以我们再次点击Enter ~C并输入:

ssh> -R 127.0.0.1:2222:127.0.0.1:22
Forwarding port.

在这里,我们将远程服务器的端口2222转发到本地机器的端口22(这里是您需要在端口22上启动本地SSH服务器的地方;如果它正在侦听其他端口,请使用它而不是22)。

现在只需在远程服务器上运行scp并将我们的文件复制到远程服务器的端口2222,该端口映射到我们本地计算机的端口22(我们的本地sshd正在运行)。

remote $ scp -P2222 abc.txt user@127.0.0.1:
user@127.0.0.1's password:
abc.txt                   100%    4     0.0KB/s   00:00

我们完了!

remote $ exit
logout
Connection to example.com closed.
local $ cat abc.txt
abc

棘手,但如果你真的不能从另一个终端运行scp ,可以提供帮助。

我发现SU上的这种单线解决方案要比接受的答案简单明了。 由于它使用环境变量作为本地IP地址,我认为它也满足OP的要求,不提前知道它。

基于此,这里有一个bash函数“DownLoad”一个文件(即从SSH会话推送到本地机器上的设置位置)

function dl(){
    scp "$1" ${CLIENT_IP%% *}:/home/<USER>/Downloads
}

现在我可以调用dl somefile.txt同时SSH进入远程, somefile.txt出现在我的本地Downloads文件夹中。

演员:

  • 我使用rsa键(ssh-copy-id)来解决密码提示
  • 我发现这个技巧可以阻止在scp调用中获取本地bashrc

注意:这需要从远程SSH访问本地计算机(对于任何人来说通常都是这种情况吗?)

其他答案非常好,大多数用户应该能够使用它们。 但是,我发现接受的答案有点麻烦,而其他答案不够灵活。 中间的 VPN 服务器也给我造成了麻烦,因为我无法确定 IP 地址。

因此,我使用的解决方法是在我的.bashrc文件中使用以下 function 在远程系统上生成所需的scp命令:

function getCopyCommand {
  echo "scp user@remote:$(pwd)/$1 ."
}

如果本地系统几乎是远程服务器的镜像(包括用户名)并且我还需要复制目录结构,我发现rsync会更有用。

function getCopyCommand {
  echo "rsync -rvPR user@remote:$(pwd)/$1 /"
}

然后将生成的 scp 或 rsync 命令简单地粘贴到我的本地终端上以检索文件。

您需要在您的计算机上运行本地ssh服务器,然后您可以:

    scp [-r] local_content your_local_user@your_local_machine_ip:

无论如何,您不需要关闭远程连接来制作远程复制,只需打开另一个终端并在那里运行scp。

在您的本地计算机上:

scp root @ remotemachine_name_or_IP:/ complete_path_to_file / local_path

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM