借助Batch脚本与Plink实现双层SSH跳转后执行Netcat命令的自动化方案咨询
借助Batch脚本与Plink实现双层SSH跳转后执行Netcat命令的自动化方案咨询
看起来你已经找对了方向,用Plink配合Batch脚本实现这个双层SSH跳转的自动化完全可行,不过你当前的命令参数逻辑有点问题,咱们一步步来调整优化,确保能稳定运行:
核心思路梳理
你的场景是Windows本地 → SSH登录Server1 → 通过Server1的SSH客户端登录Server2 → 在Server2上执行nc命令检测目标连接状态,因为Server1和Server2都是Linux系统,自带SSH客户端,完全不需要额外安装软件,符合你不能改动服务器的要求。
修正后的Batch脚本方案
方案一:直接在脚本中嵌套执行命令
把所有参数配置好后,直接通过Plink连接Server1,再在Server1的会话里执行SSH跳转+nc命令:
@echo off :: 请替换成你的实际参数 set "server1=Server1的IP/主机名" set "user1=Server1的登录用户名" set "pass1=Server1的登录密码" set "server2=Server2的IP/主机名" set "user2=Server2的登录用户名" set "target_ip=10.xx.xx.xx" set "target_port=yyyy" :: 执行双层跳转并执行nc命令,输出结果到result.txt plink -ssh %user1%@%server1% -pw %pass1% -batch ^ "ssh %user2%@%server2% 'nc -zv %target_ip% %target_port%'" > result.txt 2>&1 :: 可选:自动判断连接状态 findstr /i "succeeded" result.txt >nul if %errorlevel% equ 0 ( echo 目标连接状态:成功 ) else ( echo 目标连接状态:失败 )
方案二:使用命令文件(commands.txt)执行
如果你习惯把要执行的命令单独放在文件里,可以先动态生成命令文件,再让Plink调用:
@echo off :: 请替换成你的实际参数 set "server1=Server1的IP/主机名" set "user1=Server1的登录用户名" set "pass1=Server1的登录密码" set "server2=Server2的IP/主机名" set "user2=Server2的登录用户名" set "target_ip=10.xx.xx.xx" set "target_port=yyyy" :: 动态生成要在Server1上执行的命令文件 echo ssh %user2%@%server2% 'nc -zv %target_ip% %target_port%' > commands.txt :: 执行双层跳转命令 plink -ssh %user1%@%server1% -pw %pass1% -batch -m commands.txt > result.txt 2>&1 :: 可选:清理临时命令文件 del commands.txt :: 可选:自动判断连接状态 findstr /i "succeeded" result.txt >nul if %errorlevel% equ 0 ( echo 目标连接状态:成功 ) else ( echo 目标连接状态:失败 )
关键参数说明
-batch:这个参数非常重要!它强制Plink以非交互模式运行,跳过首次连接时的主机密钥确认提示,避免脚本卡住,完全适配自动化场景。> result.txt 2>&1:把nc命令的标准输出和错误输出都写入result.txt,方便你后续查看或自动分析结果。- 外层Plink的作用是连接Server1,然后把
ssh Server2 "nc..."这个命令传递给Server1的shell执行,利用Server1自带的SSH客户端完成二次跳转,不需要在服务器上安装任何额外工具。
需要注意的坑点
- 首次连接的主机密钥问题:如果是第一次用Plink连接Server1或Server2,会弹出密钥确认提示导致脚本卡住。解决办法:
- 先手动打开Plink连接一次Server1,确认密钥后,Plink会把密钥缓存起来,后续脚本就不会再提示;
- 或者在Plink命令中添加
-hostkey "密钥指纹"参数(指纹可以从首次连接的提示中获取),实现无交互的密钥验证。
- 密码明文风险:用
-pw参数会把密码明文写在脚本里,存在安全隐患。如果条件允许,建议用PuTTY的密钥认证:生成PPK格式的密钥对,把公钥上传到Server1和Server2的~/.ssh/authorized_keys文件中,这样就可以去掉-pw参数,既安全又避免密码泄露。 - nc输出的判断逻辑:
nc -zv的成功输出包含succeeded关键词,失败则会出现Connection refused或超时提示,脚本里的findstr命令就是基于这个关键词自动判断连接状态的。
为什么你的原命令不行?
你原命令中用到的-proxycmd参数,是用来指定SOCKS/HTTP代理的,并不是用来实现双层SSH跳转的,所以逻辑不符合你的场景,调整成上面的方案就可以正常运行了。
备注:内容来源于stack exchange,提问作者ThEnGi
相关产品推荐
相关产品推荐

