shell脚本while循环读取两列数据执行ssh提前跳出如何解决
问题根因
- while循环通过管道读取文件内容时,整个循环体的标准输入绑定到了管道数据流。
ssh命令默认会从标准输入读取所有剩余数据,第一次执行ssh就会把管道内剩余的文件内容全部吞掉,导致后续read拿不到数据,循环直接提前终止。 - 原脚本存在两处语法问题:
ssh参数ConnectTimeout前缺少-o前缀、exit 2.多了无效小数点,也会引发异常退出。
修复方案
给ssh命令添加-n参数,将ssh的标准输入重定向到/dev/null,避免它占用循环的输入流。如果需要循环执行到文件末尾,还要删除原来else分支里的exit语句,避免遇到JOBID为HLC02648时直接终止脚本。另外建议直接用文件重定向的方式给while传数据,比cat管道的写法效率更高,还能避免子进程变量无法传递到外部的问题。
修正后完整脚本
#!/bin/bash while read -r JOBID SFTPHOST do if [[ ${JOBID} != "HLC02648" ]]; then # 加-n参数避免ssh读取标准输入,补全-o ConnectTimeout参数 ssh -n -q -o BatchMode=yes -o StrictHostkeyChecking=no -o ConnectTimeout=5 -i xxxx.pub "$SFTPHOST" 'exit 0' if [[ $? == 0 ]] ; then echo "Connect to $SFTPHOST in $JOBID in new pubkey successfully." else echo "Failed to connect to $SFTPHOST in $JOBID in new pubkey " fi else echo "Find JOBID HLC02648, skip check" # 若确实需要遇到HLC02648就终止脚本,可保留exit 2(注意删除原写法的小数点) fi done < JOBID_LIST.txt echo "Verify Completely"
内容的提问来源于stack exchange,提问作者L.Albert
相关产品推荐
相关产品推荐

