我有大约 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