gpt4 book ai didi

bash - 带有ProxyCommand和BASH脚本的SSH配置动态端口

转载 作者:行者123 更新时间:2023-12-02 14:29:05 25 4
gpt4 key购买 nike

我有一个服务器设置,可以在一定时间后将它的SSH端口随机化,并将端口发布到Web服务器上可用的.txt文件中。然后,我在客户端上编写了一个简单的脚本,该脚本从Web服务器.txt文件中获取新端口并更新〜/ .ssh / config中的特定主机端口号。

因为〜/ .ssh / config无法解析Bash变量,所以我使用ProxyCommand调用了脚本(我使用的是JumpHost,而JH端口是动态端口)。

我的〜/ .ssh / config如下:

Host jumphost
HostName jumphost.example.com
Port 51638
User bob
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null

Host myserver
HostName myserver.com
Port 2222
User bob
ProxyCommand ~/.ssh/get_dynamic_port.sh ssh -W %h:%p jumphost

Bash脚本如下(get_dynamic_port.sh):
#!/bin/sh
PORT=$(curl -s http://jumphost.example.com/port.txt)
OLDIP=`grep -w "jumphost.example.com" -A 1 ~/.ssh/config | awk '/Port/ {print $2}'`
LINE_NUMBER=`grep -n "jumphost.example.com" -A 1 ~/.ssh/config | grep -v "jumphost.example.com" | awk '{print $1}' FS="-"`
sed -i'.bak' -e "${LINE_NUMBER}s/$OLDIP/$PORT/" ~/.ssh/config

该脚本可以正常工作,并为jumphost.example.com更新端口,但是很遗憾,我无法连接,SSH在以下调试输出中运行:
macosx:$ ssh -vvv myserver
OpenSSH_7.9p1, LibreSSL 2.7.3
debug1: Reading configuration data ~/.ssh/config
debug1: ~/.ssh/config line 54: Applying options for myserver
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 48: Applying options for *
debug1: Executing proxy command: exec ~/.ssh/get_dynamic_port.sh ssh -W myserver:2222 jumphost
debug1: identity file ~/.ssh/id_rsa type -1
debug1: identity file ~/.ssh/id_rsa-cert type -1
debug1: identity file ~/.ssh/id_dsa type -1
debug1: identity file ~/.ssh/id_dsa-cert type -1
debug1: identity file ~/.ssh/id_ecdsa type -1
debug1: identity file ~/.ssh/id_ecdsa-cert type -1
debug1: identity file ~/.ssh/id_ed25519 type -1
debug1: identity file ~/.ssh/id_ed25519-cert type -1
debug1: identity file ~/.ssh/id_xmss type -1
debug1: identity file ~/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_7.9
ssh_exchange_identification: Connection closed by remote host

应该注意的是,将安全日志文件拖到Jumphost服务器上不会显示任何连接尝试,这可能是错误提示。

在没有动态端口脚本的情况下,jumphost配置可以正常工作,并且如上所述,该脚本实际上在正确更改Jumphost的端口,但之后ssh只会失败。

任何关于如何实现这一目标或我可能做错事情的想法都将受到赞赏。我可以只使用crontab条目每隔一段时间运行一次脚本来更新Jumphost端口,但是我宁愿只在建立连接时才更新Jumphost端口,这样看起来有点干净。

谢谢 :)

最佳答案

使用“jumphosts”的现代方法是使用-J选项(ProxyJump)。

仍然可以使用ProxyCommand选项,并且可以通过调用脚本灵活地运行任意设置代码,如下所示。但是,您的代码最终必须运行适当的ssh命令来执行“跳转”。

典型的config选项如下所示:

Host jump
Hostname jumphost.fqdn
User juser

Host final
Hostname final.fqdn
User fuser
ProxyCommand ssh -W %h:%p jump

您运行 ssh final会打开一个从localhost到 jump的连接,然后打开另一个从 jumpfinal的连接,并启用了必要的转发。

在您的配置中,您已用执行某些设置的Shell脚本替换了 ProxyCommand。之后,您仍然需要运行类似普通ssh命令的命令。

给定像您这样的配置行:
ProxyCommand ~/.ssh/get_dynamic_port.sh ssh -W %h:%p jumphost

调用普通ssh命令(作为参数传递给shell脚本)的最简单方法是在末尾调用它:
#!/bin/sh

# ... custom stuff ...

# new final line:
eval "$@"

关于bash - 带有ProxyCommand和BASH脚本的SSH配置动态端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54873290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com