Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 当我';你已经进入远程机器了吗?_Linux_Ssh_Scp - Fatal编程技术网

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
}