![有没有办法将 scp 到“这台”机器?(“父”机器?)](https://linux22.com/image/1590527/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E5%B0%86%20scp%20%E5%88%B0%E2%80%9C%E8%BF%99%E5%8F%B0%E2%80%9D%E6%9C%BA%E5%99%A8%EF%BC%9F%EF%BC%88%E2%80%9C%E7%88%B6%E2%80%9D%E6%9C%BA%E5%99%A8%EF%BC%9F%EF%BC%89.png)
假设我在 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。