我有两台服务器server1
和server2
,我可以server2
通过以下方式连接到server1
:
localUser@localMachine $ ssh user1@server1
user1@server1 $ ssh user2@server2
user2@server2 $
我可以使用以下方法一步完成此操作:
localUser@localMachine $ ssh -t user1@server1 ssh user2@server2
user2@server2 $
我希望能够简单地ssh server2
从本地计算机运行并直接连接。我可以将上面的命令设置为别名,但我更喜欢通过~/.ssh/config
.问题是,在连接到 server2 时,我需要使用 server1 上存在的 ssh 凭据,并且我不想将它们复制到本地计算机。这意味着我设置此功能的“正常”方式(通过将以下内容添加到本地~/.ssh/config
)会失败:
Host server1
Hostname server1.example.com
User user1
Host server2
Hostname server2.example.com
User user2
ProxyJump server1
如果我现在尝试连接,我会得到:
$ ssh server2
[email protected]: Permission denied (publickey).
这是因为我需要使用本地计算机~/.ssh/id_rsa_pub
上的密钥server1
,而不是本地计算机上的密钥。那么,我如何设置我的本地设备,~/.ssh/config
以便它server2
通过server1
并使用 中存在的凭据连接到server1
?
所有机器都是 Linux 机器,远程机器运行 Ubuntu Server 18.04.4,我的本地机器运行 Arch Linux。
我尝试了 Hauke 的答案中给出的解决方案,并将以下内容添加到我的~/.ssh/config
:
Host server1server2
Hostname server1
User user1
RemoteCommand ssh [email protected]
这几乎作品!我现在可以连接到server2
using ssh server1server2
,但没有收到提示:
localUser@localMachine $ ssh server1server2
Pseudo-terminal will not be allocated because stdin is not a terminal.
hostname
server2
正如您在上面看到的,我已连接到那里server2
,甚至可以在那里运行命令,但我没有收到提示。然后我尝试添加-t -t
到ssh
配置文件中的命令:
Host server1server2
Hostname server1
User user1
RemoteCommand ssh -t -t [email protected]
这给了我一个提示,但是我的 shell 的初始化文件没有被读取,并且按Ctrl+C会终止ssh
连接。我需要它的行为方式与我ssh user2@server1
从 server1所做的完全相同ssh user2@server2
。这意味着应该读取我的正常 shell 初始化文件,并且 Ctrl+C 不应终止会话。
答案1
通过 SSH 配置在目标上执行命令至少有两种可能性:
- 远程命令
- 一个单独的公钥
command="command"
所以
Host server1server2
Hostname server1
RemoteCommand ssh user2@server2
或者
Host server1server2
Hostname server1
IdentityFile ~/.ssh/id_ecdsa_force_command
进而ssh server1server2
答案2
@αГsнιη 给我指出了https://serverfault.com/q/337274/155817在评论中,基于此,我设法使用本地文件中的以下行使其正常工作~/.ssh/config
:
Host server2
Hostname server2.example.com
User user2
ProxyCommand ssh -o 'ForwardAgent yes' server1 'ssh-add && nc %h %p'
我现在可以直接连接:
$ ssh server2
Identity added: /home/user1/.ssh/id_rsa (/home/user1/.ssh/id_rsa)
上面的消息是由于ssh-add
将我的身份从 server1 添加到在 server2 上运行的身份验证代理而引起的。然而,这不应该是一个问题。