You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:00:00