Bash脚本用于更新不接受RSA密钥的多个服务器

在我的环境中,我pipe理大约10台需要定期更新软件包的Linux服务器。 我有一个脚本编写连接到每个单独运行更新。 另外,我在每台服务器上安装了RSA密钥。 这是我的代码:

hosts=(host1 host2 host3 host4) read -sp "sudo password (will be used on all servers): " password && echo "" for host in ${hosts[@]} do echo "-------------------------------------------$host----------------" ssh -t $host "sudo -Sp '' apt-get update <<EOP && sudo apt-get upgrade -y $password EOP" done 

我的目标是read一次密码,然后让apt-get update在没有提示的情况下运行。

目前在运行脚本时,系统会在每个系统上的echo声明后input密码。 在监视/var/log/auth.log文件时,直到input密码之后才会生成条目。 (我期望用RSA密钥login尝试失败)。

直接连接到每个服务器时,RSA密钥可正常工作,并可通过检查/var/log/auth.log文件进行validation。 在服务器上使用tail -F /var/log/auth.log我可以看到密码请求是用于validation而不是使用RSA密钥。

我检查过:

  • 身份文件上的权限。
  • 使用-i指定标识文件
  • 使用身份文件的完整path。
  • 添加'user @'$主机到ssh命令强制一个特定的用户。

我认为, expect可能是答案。 Expect是一个自动化交互式应用程序的工具,例如telnet,f​​tp,passwd,fsck,rlogin,tip等等。期望真的使这个东西变得微不足道。 期望对testing这些相同的应用程序也很有用。 通过添加Tk,您还可以将交互式应用程序包装在X11 GUI中。 也看看这个线程