通过SSH经中间跳转设备执行自动化目录检测命令
跳板机场景下的远程目录检测脚本实现
问题背景
原本使用以下脚本检测单跳场景下目标设备的指定目录是否存在,并获取用户确认:
sshpass -p "$PASS" ssh -t $USER@$IP 'echo '$PASS' | sudo -S [ -d /myFile ]' && echo "INFO: already exists /myFile, continue? [Y/n]" && read RESULT
现在需要适配**本地机器 -> Device_1(跳板机)-> Device_2(目标设备)**的双跳场景,其中:
- Device_1:
IP_1、USER_1、PASS_1 - Device_2:
IP_2、USER_2、PASS_2
要求全程自动登录无需手动输入密码,且能直接对Device_2执行目录检测并触发用户确认流程。已知现有连接命令仅能实现跳转登录,无法直接执行命令:
env SSHPASS="$PASS_2" \ sshpass -d 123 ssh \ -o ProxyCommand="sshpass -e ssh -W %h:%p $USER_2@$IP_2" \ $USER_1@$IP_1 \ 123<<<$PASS_1
解决方案
通过嵌套sshpass和ProxyCommand,将目标命令直接传递到Device_2执行,同时处理两层登录和sudo的密码验证,脚本如下:
# 双跳执行Device_2的目录检测命令 env SSHPASS="$PASS_2" \ sshpass -d 123 ssh -t $USER_1@$IP_1 \ -o ProxyCommand="sshpass -e ssh -W %h:%p $USER_2@$IP_2" \ 'echo '$PASS_2' | sudo -S [ -d /myFile ]' \ 123<<<$PASS_1 # 根据远程命令退出码判断目录是否存在,提示用户确认 if [ $? -eq 0 ]; then echo "INFO: /myFile 已存在,是否继续?[Y/n]" read RESULT fi
关键说明
- 外层
sshpass -d 123通过文件描述符123读取PASS_1,自动完成Device_1的登录验证 env SSHPASS="$PASS_2"将Device_2的密码注入环境变量,供内层sshpass -e读取,完成Device_2的登录-t参数强制分配伪终端,确保sudo可以正常接收密码输入(避免sudo因无终端报错)- 远程命令
echo '$PASS_2' | sudo -S [ -d /myFile ]直接在Device_2上执行,检测目录是否存在 - 通过
$?获取远程命令的退出状态:返回0表示目录存在,此时触发用户确认流程
内容的提问来源于stack exchange,提问作者Baffer
相关产品推荐
相关产品推荐

