在不知道本地IP地址的情况下,是否可以将SCP从远程迁移到本地?


31

我经常发现自己想将文件从远程终端会话复制到本地计算机。通常,我注销远程会话,然后从本地调用scp传输,以将文件从远程复制到本地。但这感觉有些漫长。我想在通过SSH登录到远程服务器的同时传输文件,以节省时间。我的本地计算机是从动态IP范围连接到Internet的,所以我不确定如何远程连接它。但是可以肯定的是,由于远程会话源自我的笔记本电脑,因此scp中必须有一个快捷方式才能返回到我的笔记本电脑...对吗?

Answers:


20

您可以为此使用SSH隧道

使用隧道,您可以将TCP端口从本地计算机转发到远程计算机,或者从远程计算机转发到本地计算机。我经常使用它来将SMTP或IMAP端口从防火墙后面的远程计算机转发到本地计算机(然后在本地访问服务,就像它们在本地运行一样)。

要将端口22(SSH)从本地计算机转发到远程计算机,请尝试以下操作:

ssh -R12345:localhost:22 yourremoteuser@remotemachine

(请注意,localhost是指远程计算机的本地名称)

运行此命令后,您应该可以使用以下命令将其返回ssh:

ssh -p12345 yourlocaluser@127.0.0.1

使用scp时,您将执行以下操作(scp具有用于端口转发的大写字母P):

scp -P12345 filename 127.0.0.1:/tmp/filename

在另一个方向(从远程到本地)的端口转发使用-L而不是-R。

以上命令假定您正在使用终端ssh客户端。图形客户端(如Windows的PuTTY)也支持隧道


不回答OP的IP不是静态的问题。

2
除非我错过了什么,否则OP可以从当前的远程计算机连接回本地。隧道将通过SSH会话完成。在从动态本地计算机到远程服务器之间建立SSH连接后,它将成功执行,因此将能够在远程计算机上设置侦听端口,该侦听端口通过隧道返回其来源。

这将要求OP在其本地计算机上设置SSH服务器并进行身份验证。因此,这可能比在某些用例中要麻烦的多。
Septagram

这不仅适用于动态IP,而且还适用于禁止从远程到本地的SSH连接的防火墙。非常有用的答案!

3
通过使用~C转义符设置远程端口转发,可以更加方便。只需输入<Enter>~C-R 12345:localhost:22<Enter>,即可拥有隧道,而无需离开已经建立的SSH会话。

6

在远程计算机上的命令行中尝试以下操作,您可能需要在路由器上启用端口转发。

scp <file on remote machine> ${SSH_CLIENT%% *}:<directory on local machine>

来源:轻松将文件解析回您要从其连接的主机(commandlinefu.com)


1
为了解释这对人们遇到的影响,请${SSH_CLIENT%% *}输出本地计算机的IP。因此,整个命令打开了从远程计算机到本地计算机的scp会话以进行文件传输。仅当您可以从远程计算机SSH到本地计算机时才能执行此操作。
bizi

2
可以通过export ME="${SSH_CLIENT%% *}"在shell rc文件中添加类似内容来进一步改进 。然后,您可以简单地使用scp <file> $ME:<local path>
kralyk,

很好,这很有效,但是请注意:如果您通过VPN登录,文件将不会在您的计算机上,而是在其他地方。
kap

1

也许zssh

zssh(Zmodem SSH)是一个程序,用于在使用安全外壳(ssh)时以交互方式将文件传输到远程计算机。它旨在作为scp的便捷替代方法,允许您无需打开另一个会话并重新进行身份验证即可传输文件。

zssh是ssh的交互式包装器

它使用zmodem文件传输的古老的rz,sz实现。


1

提出了这个问题,这也是我想轻松实现的。

这里是相关的答案:当我不在家庭网络之外时,如何从远程计算机到本地计算机进行SCP?

您需要允许从网络外部访问ssh。这是通过将宽带路由器上的端口转发到服务器的局域网来完成的。但是,从外部允许ssh访问存在一些安全问题,因此您可能还想研究保护ssh(尤其是基于密钥的身份验证)和完全禁用密码身份验证的方法。


0

一种解决方案是挂起本地计算机上的ssh会话,在本地计算机上执行复制,然后在上次中断的地方恢复ssh会话。

例如,假设我已连接到myuser @ remote,并且要将文件lol.txt复制到本地计算机。首先,我想在本地计算机上挂起ssh。通常,您将使用Ctrl- Z挂起,但这在ssh中将不起作用,因为它将被发送到远程shell。相反,您必须使用ssh转义序列Enter~。因此要暂停ssh,请按Enter~ Ctrl- Z。现在您可以在本地计算机上运行命令,并且可以执行

user@localmachine:~$ scp user@remote:/path-to-file/lol.txt /dest-path/lol.txt

复制文件,然后完全返回到ssh所在的位置

user@localmachine:~$ fg


但问题不是从远程复制,而是复制到远程,我看不到暂停shell如何解决该问题……
Alex

好吧,它也有其他作用。其想法只是暂停会话而不是退出会话,这至少使它更容易一些。
SteenSchütt'2

0

如果您想要一个更简单的解决方案,只需打开Dropbox帐户,转到远程计算机并执行wget(来自此处的修改版本): wget --no-check-certificate https://www.dropbox.com/s/2123jshf/ABC.pdf?dl=1 -O abc.pdf

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.