登录到另一台大学计算机,例如计算机B
(可以从我的家用计算机通过SSH访问此计算机B。)
使用B上的SSH连接到A。
有没有办法更快地做到这一点?仅使用一个ssh命令。
#1 楼
在您的SSH配置中使用ProxyCommand
。在主目录中创建SSH配置文件(除非您希望在整个系统范围内使用),
~/.ssh/config
:Host unibroker # Machine B definition (the broker)
Hostname 12.34.45.56 # Change this IP address to the address of the broker
User myusername # Change this default user accordingly
# (`user@unibroker` can overwrite it)
Host internalmachine # Machine A definition (the target host)
ProxyCommand ssh -q unibroker nc hostname.or.IP.address.internal.machine 22
现在您可以直接使用
ssh user@internalmachine
直接访问计算机A。另外请注意,现在您有了一个SSH主机目标名称,您可以在其中使用它其他应用程序也是如此。例如:
SCP复制文件。
scp somefile user@internalmachine:~/
在您的GUI应用程序中:
使用
sftp://user@internalmachine/
作为在计算机上浏览的位置。 /> 就像从
fish://user@internalmachine/
机器一样,将hostname.or.IP.address.internal.machine
和端口(22
)更改为您想到达的机器。必须省略。关于认证;您基本上是在工作站上建立两个SSH连接。这意味着unibroker主机和内部计算机主机都经过一个又一个的验证/认证(用于密钥对/密码和主机密钥验证)。解释
这种方法使用
unibroker
和'netcat'只是其中一种方法。我之所以这样,是因为我的SSH客户端直接与目标计算机对话,以便我可以从客户端验证主机密钥,并且可以使用公共密钥身份验证,而无需在代理上使用其他密钥。每个
-q0
定义新主机部分的开始。 ProxyCommand
是该主机的目标主机名或IP地址。您将在Host
中作为用户部件提供Hostname
。User
将用作通往目标计算机的管道。通过在第一台计算机上使用SSH并从那里直接设置一个简单的'netcat'(ssh user@hostname
)到目标,这基本上只是从中间代理到内部计算机的纯文本。 ProxyCommand
选项用于使任何输出静音(仅出于个人喜好)。确保在代理上安装了netcat(通常在Ubuntu上默认可用)-netcat-openbsd 或netcat-traditional 。
请注意,此处仍在使用SSH两次加密。当netcat通道为纯文本时,您PC上的SSH客户端将使用最终目标计算机设置另一个加密通道。
评论
我必须删除-q0选项,因为我使用的计算机不支持该选项。除此之外,一切都可行。这是一个奇妙的提示。非常感谢。 :)
–格里
2013年12月3日在2:43
我遇到了一个问题,您的答案从终端对我来说很好,但是我无法使用gui sftp进行操作,它说:未处理的错误消息,登录时超时。
– Vikash B
15年10月22日在18:52
@VikashB好吧,它确实应该工作。考虑创建一个新问题来处理您的特定情况。
– Gertvdijk
15年10月22日在19:32
我在这里做的是一个问题:askubuntu.com/questions/688567/…
– Vikash B
15年10月23日在10:03
为了补充@gertvdijk的明智词汇,有一本关于ssh代理和跳转主机的优秀Wikibook,可以作为宝贵的参考。
–特拉维斯·克拉克(Travis Clarke)
17年11月22日在8:48
#2 楼
随便跳一下我在其他答案中提供的ProxyCommand方法的一个明显替代方法是直接“跳到”目标计算机:
br />请注意第一个
-t
命令上的ssh
。如果没有它,它将失败:ssh -t user@machineB ssh user@machineA
它将强制分配一个真正的TTY。验证和身份验证在机器B上进行,出于安全原因,我真的不喜欢这种情况。我喜欢在自己的PC上使用密钥对,并通过自己的PC验证和验证最终目标计算机。此外,您只能将交互式外壳用于SSH,因此不会与其他工具(如SCP)或使用您的GUI文件管理器一起使用。
出于上述所有原因,我强烈建议您使用ProxyCommand方法,但为了快速连接,效果很好。
评论
为什么对“一次性”解决方案和永久解决方案都没有一个答案?
–娴静
2013年6月22日16:08
@demure这就是StackExchange网站的工作方式...请参阅:两次回答问题的正式礼节是什么?说:“发布两个不同的答案比将它们放入一个答案要好。”我不认为这是相同的解决方案。我认为,永久性/暂时性并不是使这种方法与众不同的原因。
– Gertvdijk
2013年6月22日16:10
其他指南还说,还使用-A开关,但表明这具有安全隐患。您是否知道转发或不发送身份验证代理连接是什么意思?
–对角线
18-10-16在15:09
@gertvdijk超级忍者在这里!您有两个最佳解决方案。我从未见过。超酷。比用N个解决方案创建一个百万长的解决方案要好得多(这是我通常看到的)。
–特雷弗·博伊德·史密斯
19年1月2日在19:51
这比设置将同时妨碍其他ssh的配置要方便得多。
– Nikhil Sahu
19 Mar 25 '19在9:51
#3 楼
您可以使用-J
命令行选项:ssh -J user@machineB user@machineA
来自
man ssh
:-J [user@]host[:port]
Connect to the target host by first making a ssh connection to
the jump host and then establishing a TCP forwarding to the
ultimate destination from there. Multiple jump hops may be
specified separated by comma characters. This is a shortcut to
specify a ProxyJump configuration directive.
它是在OpenSSH 7.3版(2016年8月发布)。它在Ubuntu 16.10和更高版本中可用。
评论
+1,因为即使您需要为machineA指定密钥文件,此操作也有效
–悲伤
18年2月21日在10:36
+1,如果您的所有主机最近都在运行OpenSSH版本,则与我的ProxyCommand答案相比,这是更好的版本。
– Gertvdijk
19年3月18日在16:48
在这种情况下,OpenSSH服务器应该同时安装在A和B机器上吗?我理解正确吗?
–米哈伊尔
19年5月8日在14:29
等效的配置文件是“ ProxyJump”
– Amiratak88
20年4月17日在21:56
#4 楼
尝试在〜/ .ssh / config中使用Host <visible hostname alias>
Controlmaster auto
User <user>
hostname <visible hostname>
port <port>
IdentityFile ~/.ssh/<id file>
Host <private LAN hostname alias>
ProxyCommand ssh -q -W <private LAN hostname>:<private LAN port> <visible hostname alias>
,仅使用计算机上的键一次完成所有操作。
评论
这比将netcat引入组合更干净。同样,B机上也不需要存在私有SSH密钥。
– danemacmillan
16年7月13日在21:47
我必须在“主机<专用LAN主机名别名>”下包括“用户”,才能正常工作。
–迈克尔
19/12/18在21:35
#5 楼
这是一个非常有用的建议。弄了几个小时后,我找到了这条纸条,并确认此条文件与记录完全相同。要将MachineA通过MachineA连接到MachineB,例如:[xuser @ machineC〜] ssh -t MachineA ssh MachineB“ -t”很关键,ssh如果不存在该密码,则失败。另外,请注意,这假设您在所有
三台计算机上都定义了用户“ xuser”。如果不是,则仅使用ssh语法:“ yuser @ MachineA ...”。另请注意,如果需要,您可以使用点分四元原始IP#。如果您要通过使用不公开给世界各地的IP(即IP)的私有本地网络进行链接,这将非常有用。不在您的本地主机文件或任何DNS中。要从MachineB到远程machineC获取文件,
,您可以从MachineB scp到MachineA,然后从MachineA到远程machineC。 (例如,
远程MachineC可以ping通MachineA,但不能ping通MachineB。)警告:我在Fedora和WindowsXP上进行了测试,MachineA是运行ICS(Internet连接共享)的XP-box,而MachineB和远程machineC是Fedora- Linux盒子。这个建议为我解决了一个关键问题-即。受限制的受监控的对我的远程站点局域网的远程访问。
还请注意,当您从MachineB“注销”时,应该看到两个“到xxx.xxx.xxx.xxx的连接已关闭”。消息。
评论
如果您设置并配置了公共密钥身份验证,则无需担心输入密码。但是-t仍然是必需的。
–Felipe Alvarez
15年2月19日在12:45
@FelipeAlvarez如果您不信任机器B以无密码登录到A,您仍然需要担心输入第二个密码!
–迈克尔
17年4月23日在21:59
#6 楼
对于在两个系统中都允许外壳程序访问的情况,ProxyCommand是一个干净的解决方案。我们希望为远程用户提供通过代理(B)访问内部计算机(A)的权限,但不允许用户通过Shell访问B来提高安全性。可行:用以下脚本(存储在文件中)替换登录外壳上的登录外壳(使用
chsh
)替换代理上的extuser
:#!/bin/sh # this is essential to avoid Exec format error
ssh internaluser@A
在远程用户的extuser @ B和extuser @ B的internaluser @ A中均未设置密码登录,然后执行以下命令将直接使用用户到A
ssh extuser@B
提示:在更改为自定义登录外壳之前,请在extuser @ B中创建必要的无密码登录授权密钥设置。更改后,由于任何人都无法通过外壳程序访问此帐户,因此只有sudoer @ B可以通过直接对其进行编辑来更改authorized_keys文件。
最后一行是禁止显示B的登录横幅,因此远程用户可以透明地访问A。
评论
非常有趣的方法。但是,这样做的主要缺点是:1)使用仅限于标准SSH使用(不支持SFTP / SCP)。 2)用户不能选择除单个主机之外的其他目标主机(因为在登录外壳中进行了硬编码)3)无法从工作站到最终目标主机进行主机密钥验证(因为使用了经纪人SSH二进制文件) 。 4)用户访问最终目标主机的私钥驻留在代理上,而不是用户。这允许管理员模仿用户(通常是不可能的)。
– Gertvdijk
16年8月5日在13:01
所有观点都是正确的,谢谢您的阐述。但是,主要目的是为受信任的用户提供对A的ssh访问,而无需登录到B。由于只有管理员才能在B上添加受信任用户的公钥(通过sudo,无需登录),这已经暗示该用户具有admin)访问extuser @ B(不是外部受信任用户)的私钥,并首先进行了设置!
– Sunthar
16-09-29在20:55
#7 楼
您的意思是您需要几个跳线:)最近,我遇到了关于jumper1 jumper2和我的最终机器的问题,至于我的溶胶br />
#!/bin/bash
sshpass -p jumper1Passwd ssh -t jumper1@jumper1IP ./Y00.sh
然后在第一个跳线(这是我的路由器)上,放置了一个名为Y00.sh的脚本:
ssh -tt jumper2@jumper2 -i ~/.ssh/id_rsa sshpass -p finalPassWord ssh -tt final@final
您可以用您的IP和密码替换这些,祝您好运!
#8 楼
machineA
是最终目标。machineB
是代理。我们希望通过ssh轻松实现home -- machineB -- machineA
。在OpenSSH 7.3版(2016年8月发布)或更高版本中,您可以执行以下一项以下内容:
.ssh/config
方法:将以下几行添加到您的
.ssh/config
中:Host machineB
Hostname 12.12.12.12 # IP of machineB (w.r.t. home)
User usernameB # username on machineB
Host machineA
Hostname 34.34.34.34 # IP of machineA (w.r.t. machineB)
ProxyJump usernameB@machineB # PROXY MAGIC!
User usernameA # username on machineA
然后输入
ssh machineA
。还与scp
兼容。您可以通过https://unix.stackexchange.com/a/494485增强上述配置以强制使用特定的密钥。 />只需输入
-J
即可。 1.
评论
相关:通过多个主机的SSH