我经常面临这样的情况:我进入一个远程服务器并运行一些程序,我想把它们的输出文件复制回本地机器.我要做的是记住远程机器上的文件路径,退出连接,然后返回scp user@remote:filepath .

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

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

推荐答案

考虑到本地机器上运行的是sshd,这是可能的,而且您不需要知道传出的IP地址.如果启用了SSH端口转发,即使您已经打开了SSH连接,也可以打开一个安全 tunel ,而无需终止它.

假设您有一个到某个服务器的ssh连接:

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

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

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,可能会有所帮助.

Linux相关问答推荐

排除最大FIFO大小故障

Ansible-删除两个注释之间的代码块(包括注释本身)

为什么 `std::this_thread::yield()` 比 `std::this_thread::sleep_for(0s)` 慢 10 倍?

如何使用正则表达式在 LINux 中查找具有不同结尾的多个文件?

更改 awk 中的上一个重复行

使用 sed 或 awk 在 linux 中将第一行中的一个单词替换为第二行中的另一个单词

如何在 Linux 中获取 C/C++ 中的用户名?

如何使用 GDB 和 QEMU 调试 Linux 内核?

如何在 Linux 命令行上解析 CSV 文件?

如何在 Linux/Unix 上递归复制以abc开头的目录?

为什么可执行文件操作系统依赖于?

Docker Bash 提示不显示 colored颜色 输出

如何在 shell 脚本中向文件中添加一行?

错误:ld.so:无法预加载对象 LD_PRELOAD:忽略

根据文件名模式和文件内容列出文件名?

在 Python 中删除 Root 权限

cat、grep 和 cut - 翻译成 python

grep 递归查找 Linux 上的特定文件类型

带有日期和时间的 Linux 命令历史记录

Linux 目录列表中只有问号