Linux 当我';你已经进入远程机器了吗?
我经常遇到这种情况:我进入一个远程服务器并运行一些程序,我想把它们的输出文件复制回我的本地机器。我要做的是记住远程机器上的文件路径,退出连接,然后Linux 当我';你已经进入远程机器了吗?,linux,ssh,scp,Linux,Ssh,Scp,我经常遇到这种情况:我进入一个远程服务器并运行一些程序,我想把它们的输出文件复制回我的本地机器。我要做的是记住远程机器上的文件路径,退出连接,然后scpuser@remote:文件路径。 显然,这不是最优的。我要寻找的是一种方法,让我的scp文件回到本地机器,而不退出连接。我做了一些搜索,几乎所有的结果都告诉我如何从我的本地机器进行scp,我已经知道了 这可能吗?更好的是,不需要知道我的本地机器的IP地址就可以了吗?您需要在您的机器上运行一个本地ssh服务器,然后您可以: scp [-r
scpuser@remote:文件路径。
显然,这不是最优的。我要寻找的是一种方法,让我的scp文件回到本地机器,而不退出连接。我做了一些搜索,几乎所有的结果都告诉我如何从我的本地机器进行scp,我已经知道了
这可能吗?更好的是,不需要知道我的本地机器的IP地址就可以了吗?您需要在您的机器上运行一个本地ssh服务器,然后您可以:
scp [-r] local_content your_local_user@your_local_machine_ip:
无论如何,您不需要关闭远程连接来进行远程复制,只需打开另一个终端并在那里运行scp。鉴于您的本地计算机上运行了
sshd
,这是可能的,而且您不需要知道传出的IP地址。如果启用了SSH端口转发,即使您已经打开了SSH连接,也可以打开安全隧道,而无需终止它
假设您有到某个服务器的ssh连接:
local $ ssh user@example.com
Password:
remote $ echo abc > abc.txt # now we have a file here
好的,现在我们需要将该文件复制回本地服务器,出于某种原因,我们不想打开新连接。好的,让我们通过按Enter~C
(Enter,然后是tilde,然后是大写字母C)来获取ssh命令行:
这就像常规的-L/R/D
选项一样。我们需要-R
,因此我们再次点击输入~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 $ exit
logout
Connection to example.com closed.
local $ cat abc.txt
abc
这很棘手,但如果您真的不能从另一个终端运行
scp
,可能会有所帮助。在您的本地计算机上:
scproot@remotemachine_name_or_IP:/complete_path_to_file/local_path我发现在SU上比公认的答案简单得多。因为它对本地IP地址使用了一个环境变量,所以我认为它也满足了OP的要求,即事先不知道它
基于此,这里有一个bash函数“下载”一个文件(即从SSH会话推送到本地机器上的一个设置位置)
函数dl(){
scp“$1”${CLIENT_IP%%*}:/home//下载
}
现在我可以调用dl-somefile.txt
,而SSH已经进入远程,并且somefile.txt
出现在我的本地下载文件夹中
额外费用:
- 我使用rsa密钥(ssh副本id)绕过密码提示
- 我发现有一种方法可以防止本地bashrc在scp调用中被来源
注意:这需要通过SSH从远程访问本地计算机(对任何人来说都是这样吗?为什么不打开另一个终端,在另一个终端中仍然打开您的
SSH
连接时,从该终端启动scp
命令?您可以通过ssh打开任意多个到同一远程计算机的连接。您可以:echo$(pwd)/*something
,以获得要复制的文件的完整路径列表。然后使用[ctrl]+[z]
暂停ssh连接,返回原始提示,在那里键入scp
,然后使用fg
恢复ssh会话,使其恢复在前台运行启动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$1user@127.0.0.1:$2
?这将使远程机器的scp非常高效。OP这样做的动机主要是,在本地计算机中使用scp意味着我不能对文件使用制表符补全,必须提供整个路径名。@LukeDavis是的,您可以将此选项添加到ssh命令行。我猜OP的问题与在建立连接之前没有做出特殊安排的情况有关。还有一个问题:2222
和22
的例子是否正确?例如,我可以将远程/本地端口号设置为999
?@LukeDavis,当然可以。22是sshd的默认端口,但您的服务可以配置为侦听任何端口。这太棒了。但是,作为一个来到这里的人,因为他正在寻找一种简单的方法来做一些事情,而不必打开另一个选项卡并进行新的scp连接,这个解决方案非常有趣。
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
function dl(){
scp "$1" ${CLIENT_IP%% *}:/home/<USER>/Downloads
}