SSH会话远程设备密码登录故障求助:原Telnet可用函数无法正常工作
解决SSH环境下远程设备登录卡住的问题
我来帮你梳理下这个问题——从Telnet切换到SSH时,核心的差异在于认证流程和命令交互逻辑,你遇到的卡在密码提示符的问题,大概率是sshpass的用法顺序不对,或者原有登录函数的逻辑没适配SSH的特性。下面是具体的排查和解决步骤:
1. 修正sshpass与ssh的调用顺序
sshpass的作用是通过管道或环境变量为ssh自动提供密码,所以必须先调用sshpass,再执行ssh命令,你之前的命令顺序可能搞反了。正确的命令格式应该是:
sshpass -p "$mypass" ssh -T -q -o "StrictHostKeyChecking no" -p $PORT $myuser@$IP
注意几个细节:
-p $PORT参数要放在$myuser@$IP前面(或者紧跟ssh命令,位置不对可能会被ssh解析为其他参数)- 确保
$mypass、$PORT、$myuser、$IP这些变量都正确赋值,包含特殊字符的变量要始终用双引号包裹
2. 适配原有LOGIN函数的命令逻辑
Telnet和SSH的认证流程完全不同:
Telnet:建立连接后,设备先返回密码提示符,你发送密码→进入命令行→执行后续命令
SSH(搭配sshpass):sshpass已经自动完成了密码认证,连接成功后直接进入设备的命令行,不需要再发送密码命令
如果你的LOGIN函数还是把密码作为第一条发送的命令,那在SSH环境下,相当于登录成功后又发了一次密码,设备会返回错误(比如“无效命令”),导致卡住。你需要添加环境判断,调整命令发送逻辑:
# 假设用CONN_TYPE变量区分Telnet/SSH环境 LOGIN() { if [ "$CONN_TYPE" = "SSH" ]; then # SSH已完成认证,直接发送后续业务命令 send_command "show interface status" send_command "exit" else # Telnet流程保持不变 send_command "$mypass" send_command "show interface status" send_command "exit" fi }
3. 排查其他潜在问题
如果调整后还是卡住,可以从以下方面排查:
- 检查设备SSH配置:确认设备是否开启了密码登录(有些设备默认禁用,需要在配置里设置
PasswordAuthentication yes并重启SSH服务) - 验证sshpass安装:运行
sshpass -V确认工具已正确安装,旧版本的sshpass可能存在兼容性问题,建议升级到最新版 - 开启SSH调试模式:去掉
-q参数,添加-v(verbose)查看连接细节,命令如下:
从输出里可以看到SSH连接的每一步,比如是否成功完成认证、是否收到设备的命令提示符等sshpass -p "$mypass" ssh -T -v -o "StrictHostKeyChecking no" -p $PORT $myuser@$IP - 适配提示符差异:有些设备的SSH命令行提示符和Telnet不同(比如Telnet是
>,SSH是#或者自定义字符串),如果你的LOGIN函数依赖特定提示符来判断何时发送下一条命令,需要调整等待逻辑匹配SSH的提示符。
内容的提问来源于stack exchange,提问作者Ibraheem
相关产品推荐
相关产品推荐

