有没有办法将 scp 到“这台”机器?(“父”机器?)

有没有办法将 scp 到“这台”机器?(“父”机器?)

假设我在 Mac(或任何 unix-ish 机器)上打开了一个终端

fattie$

我当然可以这样做:

fattie$ scp -i key.pem [email protected]:file.js .

它会将 file.js 从我的 AWS 服务器复制到 Mac。到目前为止一切顺利。

另一天,我这样做

fattie$ ssh -i key.pem [email protected]

我现在在 Mac 上的 shell 中,但是,我已登录到 aws 机器上的 shell

ubuntu@ip-111-22-3-444:~$ 

都好。

如果我想将文件 file.js 传回 Mac,当然可以按照以下方式进行:

ubuntu@ip-111-22-3-444:~$ scp file.js [email protected]

没问题。

但。

我已经“进入” Mac 了,如果你明白我的意思的话。

ubuntu shell 的父 shell(有这样的概念吗??)确实是有问题的 Mac。我甚至在 Mac 上处于我想要的正确目录中。

事实上,有没有什么方法可以告诉 scp - 或者其他命令? - 从

  • 你所在的 shell(即示例中的 aws shell)

  • “您本地在哪里”,“父”shell,例子中的 Mac?

也许是这样的......

ubuntu@ip-111-22-3-444:~$ cat file.js > "the parent machine"/done.js

或者甚至只是

ubuntu@ip-111-22-3-444:~$ cp file.js "the parent machine"

...你明白我的意思吗?

有没有办法可以进入“父”shell?

(我想,你可以过度使用,nc但你必须先设置本地端!)

这样做通常非常方便。

答案1

是也不是。Shell(本地和 SSH 连接)都可以,但远程 shell 通过 SSH 启动无权访问到本地运行的客户端。没有用于文件传输的后隧道(有一个用于 ssh-agent 的后隧道,但仅此而已)。

可能能够从远程服务器通过 scp/sftp 返回到本地计算机,但它将充当完全独立的连接(堆栈中的另一个新层) - 它对您所在的“当前文件夹”一无所知。

因为唯一的方法是建立新的 SSH 连接,所以显然这需要您的本地计算机首先运行 SSH 服务器 (sshd)。(幸运的是,与 nc 不同,sshd 只需设置一次即可永远运行。)

如果您的计算机有公共 IP 地址,下一步就是从 Ubuntu 系统通过 SSH 返回您自己的 IP 地址(可在 $SSH_CONNECTION 中找到)。如果客户端和服务器都有 IPv6,则可以使用它。

大多数 PC 没有公共 IP 地址,因此另一种方法是使用 SSH 的-R“远程 TCP 转发”功能来建立反向通道 - 请注意,在这种情况下仍然一个全新的 SSH 登录到你的计算机,它仍然对“父”shell 一无所知:

MyMac$  pwd
/Users/Fred/Documents/This/That
MyMac$  ssh -R 12345:localhost:22 ubuntu.example.com
  ubuntu$  ssh -p 12345 localhost
    MyMac$  pwd
    /Users/Fred
    MyMac$  exit
  ubuntu$  scp -o Port=12345 file.json localhost:Documents/

在这个例子中,12345 是一个随机端口号,它将开始接受服务器上的连接,该连接将被传送到本地计算机端口 22 上的 sshd。

注意:在此示例中,-R 选项是在连接之前指定的,但如果您碰巧需要它,您可以打开一个第二连接(这次使用 -R),隧道将在全球范围内可用。它不限于特定的 shell/连接。

(或者,这些键Enter ~ C应该弹出一个交互式提示,接受“-R 123...”作为输入并建立转发。)


就我个人而言,我建议直接通过 SFTP 连接到远程机器。然后,您可以使用常规的“cd”和“ls”导航到文件,然后使用“get”检索文件。

默认的 OpenSSHsftp客户端不是很好但是运行良好;lftp是更好的选择之一。


按照我说的做,最蹩脚的方法是,直接在屏幕上 cat 文件。然后,您就可以在本地计算机上有效地使用它:复制并粘贴到文件中 :)(我想到,可以编写一个具有此功能的终端应用程序的自定义版本:它会理解当您输入 cat f.txt > LOCAL/f.tx 时,它实际上只会捕获结果并将其保存到文本文件中!!!呵呵!)– Fattie 6 小时前

是的,有些终端支持此功能——它实际上是拨号系统和 BBS 时代的一项功能,称为调制解调器或者调制解调器

要通过 ZMODEM 接收文件,首先要确保本地终端已启用文件传输功能(我认为它至少存在于 GNU Screen 多路复用器中,尽管在现代终端中很少见),然后sz <file>在远程服务器上运行,您应该会看到文件在本地弹出。

似乎有人已编写集成脚本也适用于 iTerm2 中的 Zmodem。

答案2

@grawity 对于所述问题的看法是正确的(并且得到了赞同)。

但是,如果你愿意在本地机器上创建一个 SSH 服务器实例,如果你的本地计算机的 SSH 服务器可以从主机访问blah,你可以使用此命令,即使不知道本地计算机的主机名或 IP 是什么,它也能正常工作。你但是,如果您在非标准端口上运行 SSH,则必须知道用户名,并且可能还必须知道端口号:

$ scp file.js fattie@${SSH_CLIENT%% *}:done.js

fattie您在本地 Mac 上的用户名在哪里。该命令行还假定您正在bash为 shell运行blah

但同样,正如 Grawity 指出的那样,您需要在 Mac 上运行 SSH,如果您的 Mac 位于防火墙后面的专用 LAN 上,则必须将防火墙配置为将传入的 TCP 端口 22 传递到您的 Mac。此命令只是执行复制的快捷方式,您无需知道您的公共 IP 是什么,也无需设置某种动态 DNS。

相关内容