【问题标题】:Shell script not able to parse host list and host unknownShell 脚本无法解析主机列表和主机未知
【发布时间】:2020-02-04 23:25:48
【问题描述】:

我有一个要运行的脚本。此脚本的目的是在服务器列表上运行单个或多个命令。运行时脚本无法解析hosts文件并报错:

ssh: 无法解析提供的主机名 nodename 或 servname,或未知

while read host;
do
echo server: $host
sshpass -p 'password'   ssh -o "StrictHostKeyChecking no" admin@$host  'command'
done < /path/to/hosts.txt

hosts.txt包含需要连接的主机的IP地址列表,格式如下:

server 1
server 2
server 3

我尝试将服务器 IP 放入 ""'';,,但它们都给出了相同的错误。

有人可以解释我在这里做错了什么吗?

【问题讨论】:

  • 确保您的系统可以解析主机名。没有ssh问题。对于您的下一个问题:将选项 -n 添加到您的 ssh 命令。
  • 我可以通过 ssh 从我的系统登录到每个主机,并且可以很好地解析为主机名,但是当我输入服务器 IP 列表时,脚本只能执行第一个 ip 并运行命令在列表中的第一个 IP 上,但不解析列表的其余部分。
  • 您似乎已经发布了您的脚本的编辑伪代码版本以及虚拟数据和审查输出。这使得调试变得困难。您能否创建一个不需要隐藏任何代码或数据的新脚本,然后运行它并发布完整的、未修改的脚本及其所有输出?
  • 检查 hosts.txt 中的特殊字符(DOS/Windows 换行符):cat -A hosts.txt
  • @Cyrus 在 hosts 文件中没有特殊字符。由于某种原因,它读取第一台主机并在第一台主机上执行命令,然后停止读取其余主机。

标签: linux bash shell ssh


【解决方案1】:

请检查 $host 变量是否被正确解析。此外,在您的 hosts.txt 中,每行有两个条目。这意味着什么?

我创建了一个示例脚本来解析空格分隔的参数

输入文件:hosts.txt

脚本输出:

#!bin/sh
while IFS=' ', read hostname ipaddress;
do
echo server: $ipaddress
done < hosts.txt

【讨论】:

  • 我尝试了您的脚本,它可以回显结果,然后我添加了我真正想要对脚本执行的操作,该命令用于多个服务器,出于某种原因,它读取了第一个主机并执行第一台主机上的命令,然后停止读取其余主机。
  • 我试过这样做并且它的工作,但当我告诉它解析列表时却没有hosts="ip1 ip2 ip3 ip4" for HOSTNAME in ${hosts}; do
【解决方案2】:

@Cyrus 和 @Gordon Davisson 谢谢 -n 解决了这个问题。如此简单的修复令我很惊讶,尽管进行了大量搜索,但我之前没有在这里看到该帖子。我猜我的措辞不正确。感谢大家的意见。

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 2018-07-14
    • 2013-09-21
    • 1970-01-01
    • 2015-08-10
    • 2019-05-04
    • 1970-01-01
    • 2011-04-30
    • 2016-09-12
    相关资源
    最近更新 更多