假设我在 Mac(或任何 unix-ish box)上打开了一个终端
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的parent shell(有这个概念吗??)确实是问题中的Mac。我什至在 Mac 上的正确目录中。
事实上,有什么方法可以告诉 scp - 或其他命令吗?- 复制自
您所在的 shell(即示例中的 aws 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"
... 如果你明白我的意思?
有没有办法到达“父”外壳?
(我猜,你可能会矫枉过正 usingnc
但你必须先设置本地端!)
这样做通常会很方便。
是和不是。Shell(包括本地连接和 SSH 连接)执行堆栈操作,但通过 SSH 启动的远程 Shell无法访问本地运行的客户端。没有用于文件传输的反向隧道(有一个用于 ssh-agent,但仅此而已)。
您可能能够从远程服务器通过 scp/sftp 返回到本地计算机,但它会作为一个完全独立的连接(堆栈中的另一个新层)——它对您所在的“当前文件夹”一无所知.
因此,因为唯一的方法是建立新的 SSH 连接,显然这需要您的本地计算机首先运行 SSH 服务器 (sshd)。(幸运的是,与 nc 不同,sshd 只需要设置一次并永远运行。)
如果您的计算机有公共 IP 地址,下一步就是从 Ubuntu 系统通过 SSH 返回您自己的 IP 地址(可以在 $SSH_CONNECTION 中找到)。如果客户端和服务器都有 IPv6,则可以使用。
大多数 PC 没有公共 IP 地址,因此替代方法是使用 SSH 的
-R
“远程 TCP 转发”功能来建立反向通道——请注意,在这种情况下,它仍然是一个全新的 SSH 登录到您的计算机,它仍然没有对“父”外壳一无所知:在此示例中,12345 是一个随机端口号,它将开始接受服务器上的连接,该连接将传送到本地计算机端口 22 上的 sshd。
注意:在此示例中,-R 选项是在连接之前指定的,但如果您碰巧需要追溯它,您可以只打开第二个连接(这次使用 -R),隧道将在全球范围内可用。它不限于特定的外壳/连接。
(或者,按键
Enter
~
C
应该弹出一个交互式提示,接受“-R 123 ...”作为输入并建立转发。)就个人而言,我建议直接通过 SFTP 连接到远程机器。然后您可以使用比较常规的“cd”和“ls”导航到该文件,然后使用“get”检索文件。
默认的 OpenSSH
sftp
客户端不是很好,但工作正常;lftp是更好的选择之一。是的,一些终端支持这个——它实际上是拨号系统和 BBS 时代的一个特性,被称为ZMODEM或XMODEM。
要通过 ZMODEM 接收文件,首先要确保本地终端启用了文件传输功能(我认为它至少存在于 GNU 屏幕多路复用器中,尽管在现代终端中很少见),然后
sz <file>
在远程服务器上运行,你应该查看本地弹出的文件。似乎也有人在 iTerm2 中为 Zmodem编写了集成脚本。
@grawity 对于所述问题是正确的(并且赞成)。
但是,如果您愿意在本地计算机上创建 SSH 服务器实例,并且本地计算机的 SSH 服务器可从主机访问,则
blah
可以使用此命令,即使不知道本地计算机的主机名或 IP 是什么,该命令也能正常工作。但是,如果您在非标准端口上运行 SSH,则您必须知道用户名,可能还需要知道端口号:fattie
您在本地 Mac 上的用户名在哪里。该命令行还假定您bash
在blah
.但同样,正如 grawity 指出的那样,您需要在 Mac 上运行 SSH,并且如果您的 Mac 在防火墙后面的专用 LAN 上,则必须将防火墙配置为将传入的 TCP 端口 22 传递给您的苹果电脑。此命令只是执行复制的快捷方式,您无需知道您的公共 IP 是什么,也无需使用某种动态 DNS。