首先我要说的是,我不是程序员,但我需要做一些基于编程的事情……我的问题是,我需要修改近 1000 个纳米站设备中的 DNS 服务器。我可以通过 ssh 访问它们,我想编写一个脚本来完成这项任务。我已经创建了一个包含所有 CPE 的 IP 地址的文件(名为 client.txt)。我认为我的脚本可以这样开始:
#!/bin/bash
for host in $(cat client.txt);
do
ssh Administrador@$host sameforall;
sed 's/x.x.x.x/y.y.y.y /etc/resolve.conf;
sed 's/w.w.w.w/z.z.z.z /etc/resolve.conf;
# here I restart network service but I don't have the command yet
done
y.y.y.y
z.z.z.z
新的 DNS 服务器和旧的x.x.x.x
DNS服务器w.w.w.w
我知道这还远远不够,但我需要有人帮助我。我遇到的第一个问题是 ssh 提示我将给定的服务器 ssh 密钥放入我的 known_hosts 文件中,我该如何解决这个问题???
有人可以帮帮我吗?
答案1
首先,您需要设置公钥/私钥对,以便无需密码即可通过 ssh 连接到每个主机。您可以查看此关联并遵循一些简单的步骤。
据我所知,您有两种选择。您可以在每台服务器中创建一个公钥/私钥对,然后在“主服务器”已知主机中导入每台主机的公钥生成密钥。另一种选择则相反:您可以在主主机中生成一个公钥/私钥对。然后将该私钥放在每台主机中。
然后你可以运行这样的任何命令:
while read MY_HOST ; do ssh $MY_HOST "ANY_COMMAND" < /dev/null; done < client.txt
这两种解决方案对于你的情况来说都相当复杂,因为你有大量的主机。一个可能的解决方法(这只有当所有纳米站都具有相同的用户名/密码时才会起作用)将强制脚本使用纯文本用户名/密码。如果这是一次性更改,并且您将来不会执行任何类似的更改,这可能会有所帮助:
while read MY_HOST ; do sshpass -p 'YourPassword' ssh user@$MY_HOST "ANY_COMMAND" < /dev/null; done < client.txt
请参考此链接:以明文密码作为参数的 SSH 登录
建议
如果你要在如此庞大的设备群中执行一些管理任务,你可以考虑使用一些 IT 自动化工具,例如Ansible或者木偶,或者至少在部署新的纳米站时生成一个 ssh 密钥对。
编辑-脚本示例
这个简单的脚本会将输出记录到文本文件中,这样您就可以确切地知道哪些主机没有工作(可能是连接或密码错误)。您可能希望通过解析错误并确定原因来改进脚本。
#!/bin/bash
echo "" > connFailed.log
while read MY_HOST;
do < /dev/null;
sshpass -p 'YourPassword' ssh user@$MY_HOST "ANY_COMMAND" > /dev/null 2>&1
if [ $? != 0 ] ; then
echo "[ERROR] Unable to connect to: " $MY_HOST >> connFailed.log
fi
done < client.txt
答案2
我要发现的第一个问题是 ssh 提示我将给定的服务器 ssh 密钥放入我的 known_hosts 文件中,我该如何解决这个问题???
与许多事情一样,通过阅读手册。手册将引导您参考ssh 客户端设置配置文件的man ssh
手册man ssh_client
~/.ssh/config
(但您也可以通过命令行开关调整客户端设置)您会发现以下设置:
严格主机密钥检查
如果此标志设置为
yes
,ssh(1) 永远不会自动将主机密钥添加到 ~/.ssh/known_hosts 文件中,并拒绝连接到主机密钥已更改的主机。这提供了最大程度的保护**,防止特洛伊木马攻击,尽管当 /etc/ssh/ssh_known_hosts 文件维护不善或频繁连接到新主机时,这可能会很烦人。此选项强制用户手动添加所有新主机。 如果此标志设置为no
,ssh 将自动添加将新的主机密钥添加到用户已知的主机文件中。
如果此标志设置为ask
,只有在用户确认这是他们真正想要做的事情后,新的主机密钥才会添加到用户已知主机文件中,并且 ssh 将拒绝连接到主机密钥已更改的主机。在所有情况下,已知主机的主机密钥都将自动验证。参数必须是yes
、no
或ask
。默认值为ask
。