如何设置 ssh 每次不仅尝试端口 22,还尝试辅助端口?

Ril*_*ley 9 command-line ssh

为了减少日志中的噪音并略微降低可发现性(以及在 fail2ban 之上,仅允许公钥身份验证等),我经常更改设置为不同端口的服务器上的 sshd 端口,假设为 5492。目前我要么将 -p 5492 附加到我的 ssh 命令,要么将每个特定服务器的端口添加到我的ssh_config.

如果端口 22 不起作用,有没有办法配置 ssh 以尝试连接到端口 22 和端口 5492?

Ned*_*d64 11

您可以包装一个 shell 脚本,sshssh它本身不会这样做。

使用 bash 函数的一种方法是(放入~/.bashrc):

function ssh() { command ssh -p 22 "$@" || command ssh -p 5492 "$@"; }
Run Code Online (Sandbox Code Playgroud)

顺便说一句,建议将root-reserved 端口用于系统服务,例如ssh为了避免用户拥有侦听端口 5492 的进程。否则他们可能会在中间扮演人并可能捕获登录数据。因此,请使用 < 1024 的端口。

  • 请注意,如果 `ssh` 执行的命令返回非零值,即使第一个连接成功,第二个连接 _ 将被建立。一个简单的例子是`ssh user@server false`。 (5认同)

thr*_*rig 10

ssh虽然文档在示例上有些稀疏Matchssh_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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)