![如何设置 ssh 每次不仅尝试端口 22,而且尝试辅助端口?](https://linux22.com/image/127832/%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%20ssh%20%E6%AF%8F%E6%AC%A1%E4%B8%8D%E4%BB%85%E5%B0%9D%E8%AF%95%E7%AB%AF%E5%8F%A3%2022%EF%BC%8C%E8%80%8C%E4%B8%94%E5%B0%9D%E8%AF%95%E8%BE%85%E5%8A%A9%E7%AB%AF%E5%8F%A3%EF%BC%9F.png)
作为减少日志中的噪音并稍微降低可发现性(以及在fail2ban之上,仅允许公钥身份验证等)的努力的一部分,我经常将我设置的服务器上的sshd端口更改为不同的端口,比方说5492。目前我要么将 -p 5492 附加到我的 ssh 命令中,要么将每个特定服务器的端口添加到我的ssh_config
.
如果端口 22 不起作用,是否可以配置 ssh 尝试连接到端口 22 和端口 5492?
答案1
您可以包装 shell 脚本,ssh
但ssh
它本身不会这样做。
使用 bash 函数的一种方法是(放入~/.bashrc
):
function ssh() { command ssh -p 22 "$@" || command ssh -p 5492 "$@"; }
顺便说一下,建议使用root
- 保留端口对于系统服务,例如ssh
为了避免用户拥有监听端口 5492 的进程。否则,他们可能会充当中间人并可能捕获登录数据。因此,请使用小于 1024 的端口。
答案2
ssh
Match
本身可以通过记录来做到这一点ssh_config(5)
尽管文档中的示例有些稀疏。如果您想要将复杂性推入 SSH 配置中,那么这种形式可能是合适的,尽管受到语法限制,ssh_config(5)
并且可能需要进行一些调整才能获得所需的结果。值得注意的是,自定义端口要么无法设置,要么可能在之前的尝试中设置错误Match
。这就是为什么在下面测试时设置两次,或者默认设置一次,而在建立规范默认值时不设置的原因。
# here we set the defaults for the host (no port!)
Match !canonical host testhost
CanonicalizeHostname yes
Hostname 192.0.2.42
IdentityFile ~/.ssh/id_blahblah
...
# port available?
Match canonical host 192.0.2.42 exec "is-ssh-up %h 2222"
Port 2222
# or the default port
Match canonical host 192.0.2.42
Port 22
is-ssh-up
仅检查给定端口上是否有响应,并且可能看起来像
#!/usr/bin/env expect
package require Tcl 8.5
if {[llength $argv] < 2} {
puts stderr "Usage: is-ssh-up host port"
exit 1
}
puts stderr "is-ssh-up: DEBUG trying $argv"
set socket [socket -async [lindex $argv 0] [lindex $argv 1]]
chan event $socket readable [list exit 0]
after 3000 [list exit 1]
vwait godot
答案3
您可以使用 的通配符功能~.ssh/config
,将此条目放入列表中:
Host *
Port 5492
但这本身不会回落到 22。
如果您将其放在最后,如果您需要 22,您仍然可以通过在其上方放置不同的值来覆盖这些主机。 (并且您始终可以在命令行上覆盖它。)