首先我需要说我不是一个程序员,但我需要做一些基于编程的东西….我的问题是,我需要修改近1000个纳米设备的DNS服务器。 我可以通过ssh访问他们,我想创build一个脚本来完成这个任务。 我已经用所有CPE(名为client.txt)的IP地址创build了一个文件。 我想我的脚本可以这样开始:
#!/bin/bash for host in $(cat client.txt); do ssh Administrador@$host sameforall; sed 's/xxxx/yyyy /etc/resolve.conf; sed 's/wwww/zzzz /etc/resolve.conf; # here I restart network service but I don't have the command yet done
yyyy和zzzz是新的DNS服务器, xxxx和wwww是旧的
我知道这是很正确的,但我需要有人帮助我。 我要find的第一个问题是,ssh提示我把给定的服务器ssh密钥到我的known_hosts文件,我该如何解决这个?
任何人都可以帮我吗?
首先你需要设置一个公钥/私钥ssh密钥对,以便通过ssh连接到每个主机而不需要密码。 你可以看看这个链接,并按照一些简单的步骤。
AFAIK你有两个select。 呦可以在每台服务器上创build一个公钥/私钥对,然后将每个主机的公钥生成密钥导入到已知主机的“主服务器”中。 另一种方法是另一种方法:您可以在主控主机中生成公钥/私钥对。 然后将该私钥放置在每个主机中。
然后你可以运行这样的命令:
while read MY_HOST ; do ssh $MY_HOST "ANY_COMMAND" < /dev/null; done < client.txt
这两种解决scheme在你的情况下是相当复杂的,因为你有大量的主机。 一个可能的解决方法( 只有当所有纳米测量具有相同的用户名/密码 )才会强制脚本使用纯文本的用户名/密码。 如果这是一个单一的变化,你将来没有这样做,这可能会有所帮助:
while read MY_HOST ; do sshpass -p 'YourPassword' ssh user@$MY_HOST "ANY_COMMAND" < /dev/null; done < client.txt
请参考以下链接: 以明文密码作为参数的SSHlogin
忠告
如果您在如此庞大的设备场中执行某些pipe理任务,则可能会考虑使用一些IT自动化工具(如Ansible或Puppet) ,或者至less在部署新的纳米统计信息时生成一个ssh密钥对。
编辑 – 脚本示例
这个简单的脚本将输出logging到一个文本文件,所以你会知道究竟哪个主机不工作(可能连接或密码错误)。 您可能需要通过parsing错误并确定原因来改进脚本。
#!/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
我要find的第一个问题是,ssh提示我把给定的服务器ssh密钥到我的known_hosts文件,我该如何解决这个?
与许多事情一样,通过阅读手册。 man ssh手册会将ssh客户端设置configuration文件~/.ssh/config (也可以通过命令行开关调整客户端设置)引用您的手册man ssh_client ,您可以在其中find以下设置:
StrictHostKeyChecking
如果此标志设置为
yes,ssh(1)将永远不会自动将主机密钥添加到〜/ .ssh / known_hosts文件,并拒绝连接到主机密钥已更改的主机。 这为特洛伊木马攻击提供了最大程度的保护**,但是当/ etc / ssh / ssh_known_hosts文件维护不当或连接到新主机频繁发生时,这可能会令人讨厌。 该选项强制用户手动添加所有新的主机。 如果这个标志设置为no,ssh会自动将新的主机密钥添加到用户已知的主机文件中。
如果此标志设置为ask,则只有在用户确认了他们真正想要做的事情之后,新的主机密钥才会添加到用户已知的主机文件中,而ssh将拒绝连接到主机密钥已更改的主机。 已知主机的主机密钥将在所有情况下自动进行validation。 争论必须yes,no,或者ask。 默认是ask。