我有一台运行多个“SSH 守护进程”(实际上是 Stash 和 OpenSSH)的服务器,每个守护进程都需要不同的 SSH 密钥。这些守护进程正在监听 2 个不同的端口。
在客户端 (特别是 ) 上的 SSH 配置中~/.ssh/config
,是否可以在Host
/Match
指令中指定端口 (或其他方式),以便我可以覆盖IdentityFile
基于端口?这样ssh myserver -p 22
,和ssh myserver -p 23
都将使用正确的密钥登录,而无需进行其他配置。
答案1
如果你的ssh客户端足够新,你可以使用配置文件Match
关键字根据目标端口进行条件配置。
Match host somehost exec "test %p = 42"
IdentityFile ...
如果目标主机是“somehost”且目标端口是 42,则上述示例将仅应用“IdentityFile”行。Match
其工作原理是Host
,它后面的行(直到下一个 Match 或 Host 行)仅适用于符合条件的会话。在示例中,Match 行检查主机是否为“somehost”,并且它还运行一个外部命令,如果该命令以状态 0 退出,则视为匹配。
此处运行的命令是test %p = 42
。“%p”将被 ssh 到那时为止将使用的端口值(默认值 22 或来自命令行的值)替换。test
也称为[
;它是一个命令行实用程序,主要用作 shell 脚本中的语句的一部分if
。此处,test
用于测试端口号是否为 42。
ssh_config关键字Match
已添加到 OpenSSH 6.5 或 6.6 版本中。检查ssh_config
手册页以查看系统上是否可用。
答案2
您可以在文件中创建各种主机“别名” ~/.ssh/config
,以引用同一服务器不同端口上的 SSH 守护程序。例如:
Host daemon1
HostName host.domain.com
Port 22
IdentityFile ~/.ssh/id_rsa_daemon1
Host daemon2
HostName host.domain.com
Port 23
IdentityFile ~/.ssh/id_rsa_daemon2
然后您可以运行ssh daemon1
或ssh daemon2
登录到特定的 SSH 守护程序。