从node.txt读取SSH命令执行失败,硬编码却正常的问题排查
问题原因与解决方法
问题根源
你用cut -f3提取命令时,cut默认以制表符(\t)作为字段分隔符,但你的node.txt文件是用多个连续空格分隔列的,导致cut无法正确识别字段边界。最终提取到的comm变量内容并非完整的SSH命令,执行时shell错误解析参数,才会出现/path/script.sh not found的报错。
而硬编码命令时,你直接提供了完整的命令字符串,shell能正确拆分每个参数,因此执行正常。
解决方法
方法1:用awk提取(推荐)
awk默认会将任意数量的空格作为字段分隔符,能精准提取从第3个字段开始的完整命令:
comm=$(awk '/0.0.0.2/ && /c/ { $1=$2=""; print substr($0, 3) }' node.txt) status=$($comm)
这个命令会清空匹配行的前两个字段,输出剩下的完整SSH命令。
方法2:用sed删除前两个字段
通过sed正则删除行开头的两个空格分隔字段,直接获取后续命令:
comm=$(grep 0.0.0.2 node.txt | grep c | sed 's/^[^ ]* [^ ]* //') status=$($comm)
方法3:转换分隔符后用cut提取
先将连续空格压缩为单个制表符,再用cut提取从第3个字段到结尾的内容:
comm=$(grep 0.0.0.2 node.txt | grep c | tr -s ' ' '\t' | cut -f3-) status=$($comm)
更安全的执行方式(用数组存储命令)
如果命令参数可能包含特殊字符,建议将命令存储为数组,避免分词错误:
read -ra comm_arr <<< "$(awk '/0.0.0.2/ && /c/ { $1=$2=""; print substr($0, 3) }' node.txt)" status=$("${comm_arr[@]}")
内容的提问来源于stack exchange,提问作者Karim Ater
相关产品推荐
相关产品推荐

