现在我是这样做的:
登录到另一台大学电脑,比如说机器B
(这台机器B可以通过SSH从我的家用电脑访问)
使用B上的SSH连接到A。
登录到另一台大学电脑,比如说机器B
(这台机器B可以通过SSH从我的家用电脑访问)
使用B上的SSH连接到A。
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
使用SCP复制文件。
scp somefile user@internalmachine:~/
在您的GUI应用程序中:
使用sftp://user@internalmachine/
作为浏览机器上的位置。
KDE-based (Dolphin):使用fish://user@internalmachine/
将hostname.or.IP.address.internal.machine
和端口(22
)更改为您想要从unibroker
机器访问的机器。
根据unibroker主机上的netcat版本,可能需要省略-q0
选项。关于身份验证;基本上是从您的工作站设置了两个SSH连接。这意味着unibroker主机和internalmachine主机都经过一个接一个的验证/身份验证(对于密钥对/密码和主机密钥验证)。
这种使用ProxyCommand
和'netcat'的方法只是其中一种方式。我喜欢这样做,因为我的SSH客户端直接与目标机器通信,这样我就可以从客户端验证主机密钥,并且我可以在不在代理服务器上使用另一个密钥的情况下使用我的公钥身份验证。
每个Host
定义了一个新主机部分的开始。Hostname
是该主机的目标主机名或IP地址。User
是您在ssh user@hostname
中提供的用户部分。
ProxyCommand
将被用作到目标机器的管道。通过使用SSH连接到第一台机器,并直接在那里设置一个简单的'netcat' (nc
)到目标机器,这基本上只是一个从代理人到内部机器的明文转发。 -q
选项是为了消除任何输出(只是个人偏好)。
确保在代理人上安装了netcat(通常在Ubuntu上默认可用)- 可以选择安装netcat-openbsd 或者netcat-traditional
。
请注意,在这里您仍然使用了两次加密的SSH。虽然netcat通道是明文的,但您PC上的SSH客户端将与最终目标机器建立另一个加密通道。
Host *.some.domain.tld
的条目,那么你几乎肯定希望在ProxyCommand中使用%h
,而不是为每个特定的主机都添加一个条目,例如ProxyCommand ssh -q unibroker nc %h 22
。 - geronime-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.
Realm\mytargetuser
),并且已经习惯在shell提示符上转义反斜杠(ssh Realm\\mytargetuser@target.intra
)的人:由于某种原因,跳转代理用户名现在需要双重转义:ssh -J Realm\\\\myjumpuser@jump.intra Realm\\mytargetuser@target.intra
或ssh -J 'Realm\\myjumpuser@jump.intra' Realm\\mytargetuser@target.intra
。 - Abdull显而易见的替代方案是直接“一次跳转”到目标机器,而不是使用我在我的其他答案中提供的ProxyCommand方法:
ssh -t user@machineB ssh user@machineA
Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied, please try again.
[...]
它将强制分配一个真正的TTY
这样做的缺点是,现在所有的配置、验证和认证都在B机器上进行,出于安全原因,我不喜欢这种情况。我喜欢我的密钥对在自己的电脑上,并且从自己的电脑上进行身份验证和验证最终目标机器。此外,你只能使用SSH的交互式shell,所以这不能处理其他工具,如SCP或使用你的GUI文件管理器。
基于以上所有原因,我强烈推荐ProxyCommand方法,但对于快速连接,这个方法也可以。
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>
B
机器上也不需要存在私有SSH密钥。 - danemacmillanUser
在 Host <私有局域网主机名别名>
下才能让它工作。 - MichaelmachineA
是最终目标。
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
标志选项:只需输入ssh -J usernameB@machineB usernameA@machineA
。
这个答案结合了gertvdijk和Erik Sjölund的答案,并参考了https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#cite_note-ProxyJump-1中的指南。
-t
仍然是必需的。 - Felipe Alvarez#!/bin/bash
sshpass -p jumper1Passwd ssh -t jumper1@jumper1IP ./Y00.sh
ssh -tt jumper2@jumper2 -i ~/.ssh/id_rsa sshpass -p finalPassWord ssh -tt final@final
使用chsh
命令,将代理服务器上的extuser
的登录shell替换为以下脚本(存储在文件中):
#!/bin/sh # this is essential to avoid Exec format error
ssh internaluser@A
ssh extuser@B
sudo vi ~extuser/.ssh/authorized_keys
sudo touch ~extuser/.hushlogin