跳板机Shell脚本读取CSV执行SSH拉取远端JSON文件问题求助
问题修复方案
SSH参数配置修正
-q参数本身可以屏蔽大部分ssh输出,要彻底屏蔽登录banner、motd等无关内容,额外添加-o LogLevel=ERROR参数即可- 你添加的
-tt参数是多余的,该参数用于强制分配伪终端,仅在需要执行交互命令时使用,非交互场景下无需添加。之前终端卡住的原因是ssh默认会读取标准输入,在while循环中会把CSV文件的剩余内容吃掉,添加-n参数将ssh的标准输入重定向到/dev/null即可解决卡顿问题。
脚本逻辑错误修复
你无法读取远端文件内容、输出异常的原因有四个:
- 变量引用错误:你用单引号包裹了
cat $field2命令,单引号在bash中不会解析本地变量,发送到远端服务器的命令是字面量cat $field2,远端不存在该变量自然无法读取到对应文件,需要替换为双引号。 - 未跳过CSV表头:你当前的脚本会把CSV第一行的表头
ServerName,Filename也作为有效记录处理,属于无效操作。 - 多余的for循环:你写的
for HOSTNAME in field1逻辑完全多余,且未加$引用变量,不仅没有实际作用还会引入异常。 - 未处理字段空白:你提供的CSV示例中字段存在首尾空格,直接读取使用会导致ssh连接失败、路径识别错误。
修复后的完整脚本
#!/bin/bash # 跳过表头,从CSV第二行开始读取记录 tail -n +2 INC-State.csv | while IFS=, read -r field1 field2 do # 去除字段首尾的空白字符 field1=$(echo "$field1" | xargs) field2=$(echo "$field2" | xargs) # 执行远端文件读取命令 ssh -q -n -o LogLevel=ERROR "$field1" "cat $field2" done
内容的提问来源于stack exchange,提问作者Vadiraj
相关产品推荐
相关产品推荐

