尝试制作脚本

尝试制作脚本

首先我要说的是,我不是程序员,但我需要做一些基于编程的事情……我的问题是,我需要修改近 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.yz.z.z.z新的 DNS 服务器和旧的x.x.x.xDNS服务器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 将拒绝连接到主机密钥已更改的主机。在所有情况下,已知主机的主机密钥都将自动验证。参数必须是yesnoask。默认值为 ask

相关内容