通过脚本使用 sudo 用户在多个服务器上运行本地脚本

通过脚本使用 sudo 用户在多个服务器上运行本地脚本

我有大约 100 个远程服务器。我想使用一台终端服务器来管理我的所有服务器,以使用 sudo 权限更新、运行命令。

我需要一个主脚本将另一个测试脚本作为参数。主脚本使用带有远程服务器名称的主机文件通过 with 循环运行。

测试脚本包含要在远程服务器上立即运行的所有实际 sudo 命令

./mainscript hostfile testscript 例如,测试脚本可能有“sudo yum -y update”或一串命令。

如果我以 root 用户身份登录,这似乎很容易。但我想以在所有远程服务器上拥有 sudo 权限的用户“admin”身份运行它。所有这些脚本都位于本地终端服务器上。

请向我建议您可能需要实现这一目标的任何想法?

答案1

一种想法(尽管可能不是最好的)是将 ssh 配置为使用基于密钥的身份验证而不是密码身份验证。如果您不知道,此说明应该足够了SSH 密钥认证

我不知道你的测试脚本包含什么,也不知道它的复杂性。让我们认为这是一个相当复杂的脚本,它将输出保存在 /tmp/script_output/ 下,在这种情况下,我建议如下:

while read -r i
do
   scp $2 admin@remote_server:/tmp/
   ssh -t admin@remote_server /tmp/$2
   ssh admin@remote_server rm /tmp/$2
   scp -r admin@remote_server:/tmp/script_output/ /tmp/
   ssh admin@remote_server rm -rf /tmp/script_output
done < "$1"

顺便说一句,来自 sudoers

#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

答案2

前段时间我也遇到了同样的问题。这就是我的解决方案:
https://github.com/maciejkorzen/misc-ruby/blob/master/ssh-batch-upload-sftp-and-run.rb

  • 下载这个脚本。
  • 创建包含服务器名称和密码的 CSV 文件(我假设每台服务器上的登录名都是相同的)。
  • 创建您要执行的脚本。
  • 调整我的 Ruby 脚本中的变量,运行它并让它为您完成所有工作。 :-)

答案3

以下将允许您在多个主机上执行命令,而只需在开始时sudo输入一次密码。sudo

缺少的是 for 循环或将HOSTS变量设置为您拥有的主机的东西。该脚本在temp包含密码的文件夹中创建一个文件sudo,但该文件会立即删除。这允许命令使用sudo密码,而无需将其显示在终端窗口或脚本中。

#!/bin/bash

if "something" 
 then

 else

cat > /tmp/$HOSTS-pw.sh <<EOS
#!/bin/sh
ssh user@$HOSTS sudo "your command here" <<EOC
$SUDOPW
EOC
EOS

fi

chmod 700 /tmp/$HOSTS-pw.sh
/tmp/$HOSTS-pw.sh >/dev/null
if [ -f /tmp/$HOSTS-pw.sh ]; then rm -f /tmp/$HOSTS-pw.sh; fi

echo "Enter SUDO password:"
read -s SUDOPW

for loop here!

unset SUDOPW
exit 0

答案4

对于这种情况,我有两个脚本。该脚本runonnodes对所选服务器(服务器列表)执行所有 ssh 操作。另一个名称runonnodes_commands位于网络共享上,该共享在每台服务器上都可用。这是在每个选定服务器上执行的脚本。

第一个脚本runonnodes主要包括:

#!/bin/bash

SELECTEDNODES="node1 node2 node2"

for NODE in $SELECTEDNODES; do
    ssh -t $NODE "sudo su -c /mnt/share/runonnodes_commands"

为此,使用基于密钥的身份验证(我的公钥~/.ssh/authorized_keys)并且我可以这样做sudo su

该脚本runonnodes_commands包含必须在节点上完成的所有内容,例如复制文件、安装包:

#!/bin/bash

yum install python

相关内容