通过本地计算机上的一个命令通过代理进行Scp?


54

我有我的local.machine,proxy.machine和target.machine。local.machine与target.machine没有直接联系,但是需要通过proxy.machine。

我想将文件从target.machine转换为local.machine。仅使用local.machine的一个命令就能做到吗?

Answers:


64

我知道这是一个较晚的答案,但我只是发现了一种很酷的方法。这基本上是Holger Just的答案,但是在保存的配置文件中:

您需要将此~/.ssh/config文件放在local.machine上的文件中(如果不存在则创建文件)

Host target.machine
  User          targetuser
  HostName      target.machine
  ProxyCommand  ssh proxyuser@proxy.machine nc %h %p 2> /dev/null

保存文件后,您可以使用

ssh target.machine

您想随时连接。Scp也将起作用,因为它也尊重ssh配置文件。如果您使用的是GNOME并想使用GUI,那么Nautilus也会如此。


5
只是一个简短的说明。如果通过ssh的-i命令行选项使用备用身份文件,则需要同时为ProxyCommand配置和ssh命令行指定该选项。
BillMan

7
3件事可能会有所帮助,1)如果您还显示了Host proxy.machine同一~/.ssh/config文件中的行,那将有所帮助; 2)提及是否可以嵌套这些命令(即,客户端连接到代理主机1,而代理主机1连接到代理主机2,代理主机2连接到该主机)。 ..target)和3)是什么nc %h %p意思
puk 2013年

我们如何使用代理从本地计算机复制到目标计算机?
穆拉加拉

19

您可以使用一个命令来执行此操作,但是您需要在代理计算机上安装netcat(nc):

ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine

[编辑:混淆了机器的顺序...]


不错的尝试,但是我应该在哪里添加用于代理和登录的用户名?
grm

机器名称前的Jzst,带@。我修改了答案以反映这一点。
Holger

19

现在,您可以*单线执行此操作,而无需 nc任何地方:

scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .

说明

pcredstcreds代表你的代理,如果需要的目标凭据(usernameusername:password,等)。

这是有可能的,因为它具有类似netcat的内置功能,从而消除了nc对中间主机的要求。使用ssh -W host:port设置到指定主机和端口的隧道,并将其连接到stdin / stdout,然后scp在该隧道上运行。

%h%pProxyCommand被替换为您指定的目标主机和端口。

为了更加方便,您可以在ssh配置中配置代理:

Host target.machine
    ProxyCommand ssh pcreds@proxy.machine -W %h:%p

然后从那开始

scp tcreds@target.machine:file .

* 自OpenSSH 5.4- 2010年3月发布


1
验证此方法确实有效,并且不会在代理计算机上留下陈旧的NC流程。
LaXDragon

1
在哪里可以指定代理的端口?
Marged,

1
@Marged我不是在一个位置,在这里尝试的时刻,但我认为你应该能够包括-p <portnum>之前的-W任一方法来指定代理服务器的端口
CupawnTae

1
我花了一段时间才弄清楚-i选项(如果需要)位于引号内。缺省情况下,代理ssh不使用由直接提供给scp的任何-i选项指定的相同私钥。我想这是显而易见的。
Keeely

18

如果您不介意使用rsync而不是scp,则可以使用以下单行代码:

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(您将需要无密码访问代理服务器)


8
$ ssh -f -N -L <localport>:<target.machine:port> user@proxy.machine
$ scp target-user@local.machine:/remote/file -P <localport> .

好的,实际上是两个命令...


1
如何指定代理的端口?就我而言8080
Marged,

@Marged添加-p <portnumber>到您的ssh命令中
weeheavy

6

一线?不能离开我的头顶。您需要先建立一个代理,而不能单独使用scp来实现。

手动进行操作时,我为隧道打开了一个屏幕会话:

screen -S tunnel

屏幕用于将隧道保持在背景外壳中。使用任何您想使隧道在后台保持打开状态的技术(@weeheavy的答案可能是最简单的)。在屏幕会话中,我像这样开始隧道

ssh -L 2222:target.machine:22 [user@]proxy.machine

为了解决这个问题,基本上是说:“在我的本地计算机上,打开端口2222,并且通过proxy.machine将连接到localhost:2222的任何连接代理到target.machine:22”。

建立ssh连接和隧道后,请使用“ Ca d”从屏幕会话中分离。要返回该屏幕会话,请输入screen -raAd tunnel

回到原始外壳后,scp命令将如下所示:

scp -P 2222 localhost:your/file/on/target.machine local/path

请记住,本地主机端口2222实际上只是通向target.machine的隧道。



2

怎么样:

scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location

还是这里的用户名:password?
rogerdpack 2015年

1

您可以尝试类似:

ssh user@proxy.machine "ssh user@target.machine 'cat > file'" < file

但是,如果您的proxy.machine需要询问您的密码(SSH不在TTY中,那么askpass将会失败)将不起作用。

如果您有多个文件,则可以这样使用tar(未经测试,我通常以这种方式使用netcat):

tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"

1

另一种简单的解决方案来传输SOURCE_FILEsource_hostdestination_host经由proxy_host使用

登录proxy_server

ssh login@proxy_host

在代理服务器上,将source_filesource_host传输destination_host(您可以将其键入为一行,省略\,或两行,如下所示):

scp login@source_host:/path_to_source_file \
  login@destination_host:/path_to_destination_directory

这要求从source_host到proxy_host的登录使用rsa_key。


0

万一您需要使用公共密钥,您将需要类似这样的东西。

Host target-machine
  User          target-user
  HostName      target.example.com
  IdentityFile  /path/to/file.pem
  ProxyCommand  ssh bastion -W %h:%p

Host bastion
  User         bastion-user
  HostName     bastion.example.com
  IdentityFile /path/to/file.pem

0

我关注了这篇文章,找到了一个对我有用的答案。(因为上面的答案对我不起作用)。

如何scp通过中间主机(也称为跳转主机)来归档文件 http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html

我的答案如下:

scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
        {source_file} {remote_username}@{remote_IP}:{remote_file_path}

例:

scp -oProxyCommand="ssh -W %h:%p ubuntu@10.60.10.145" \
        archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz

我希望这个答案可以对您有所帮助。

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.