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

lai*_*e9m 24 linux ssh scp

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

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

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

afe*_*ter 28

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

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

local $ ssh user@example.com
Password:
remote $ echo abc > abc.txt  # now we have a file here
Run Code Online (Sandbox Code Playgroud)

好了,现在我们需要将该文件复制回本地服务器,由于某种原因我们不想打开新连接.好的,让我们通过按Enter ~C(Enter,然后是tilde,然后是大写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
Run Code Online (Sandbox Code Playgroud)

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

ssh> -R 127.0.0.1:2222:127.0.0.1:22
Forwarding port.
Run Code Online (Sandbox Code Playgroud)

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

现在只需scp在远程服务器上运行并将我们的文件复制到远程服务器的端口2222,该端口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
Run Code Online (Sandbox Code Playgroud)

我们完了!

remote $ exit
logout
Connection to example.com closed.
local $ cat abc.txt
abc
Run Code Online (Sandbox Code Playgroud)

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

  • 这太棒了。但作为一个来到这里的人,因为他正在寻找一种简单的方法来做某事,而无需打开另一个选项卡并进行新的 scp 连接,这个解决方案非常搞笑。 (4认同)
  • **启动** SSH 会话时可以发出标志 `-R 127.0.0.1:2222:127.0.0.1:22` 吗?因此,我可以在本地计算机上的`.bashrc`中添加别名`alias ssh="ssh -R 127.0.0.1:2222:127.0.0.1:22"`,然后在`.bashrc`中编写一个bash函数远程计算机的内容类似于“scp -P2222 $1 user@127.0.0.1:$2”?这将使远程计算机的 scp'ing 非常高效。OP 这样做的动机主要是本地计算机内的 scp'ing 意味着我无法在文件上使用制表符补全,并且必须提供整个路径名。 (3认同)
  • @LukeDavis 是的,您可以将此选项添加到 ssh 命令行中。我猜OP的问题与在建立联系之前没有做出特殊安排的情况有关。 (3认同)

bro*_*mes 7

我发现SU 上的这一行解决方案比公认的答案要简单得多。由于它使用本地IP地址的环境变量,我认为它也满足了OP预先不知道它的要求。

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

function dl(){
    scp "$1" ${SSH_CLIENT%% *}:/home/<USER>/Downloads
}
Run Code Online (Sandbox Code Playgroud)

dl somefile.txt现在,我可以在通过 SSH 连接到远程时进行调用,并somefile.txt显示在我的本地下载文件夹中。

额外:

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

注意:这需要从远程通过 SSH 访问本地计算机(任何人都经常遇到这种情况吗?)