SSH执行远程命令时误将命令识别为主机名的问题求助
问题分析与解决建议
核心错误原因
你遇到的ssh: Could not resolve hostname pkill python错误,本质是ssh参数解析顺序错误:当尝试添加-n/-t参数时,若将选项放在主机名之后,ssh会误把后续命令字符串当成主机名解析。另外,原始脚本中移除< /dev/null导致while循环崩溃,是因为ssh默认会读取stdin,提前耗尽了hostfile的输入流。
修正后的脚本方案
推荐用最简洁的方式直接拆分hostfile行,同时正确使用ssh的-n选项(必须放在主机名前):
# 直接读取每行第一个字段作为目标主机,忽略后续内容 while read -r ssh_target _; do echo "$ssh_target" # -n选项:让ssh从/dev/null读取stdin,避免占用while循环的输入流 ssh -n "$ssh_target" "pkill python" done < hostfile
其他可行方案
如果需要保留数组拆分逻辑,确保变量引用加引号避免意外拆分:
while read -r p; do arrP=($p) ssh_target="${arrP[0]}" echo "$ssh_target" ssh -n "$ssh_target" "pkill python" done < hostfile
关键注意事项
- ssh选项位置:所有ssh选项(如
-n)必须放在主机名参数之前,否则会被当作远程命令的一部分,导致解析错误。 -nvs< /dev/null:-n是ssh内置选项,效果等同于手动重定向< /dev/null,但更简洁且避免语法歧义。-t选项的误区:-t用于强制分配伪终端,仅适用于交互式场景,在脚本中使用会触发"stdin is not a terminal"警告,无需添加。read -r的必要性:避免read命令解析行内的转义字符(如反斜杠),确保主机名读取准确。
内容的提问来源于stack exchange,提问作者Qin Heyang
相关产品推荐
相关产品推荐

