我正在编写一个将从我们的 Mac 服务器运行的脚本,它(希望)能够通过 Munki(存储库位于同一服务器上)和内置命令更新我们所有的 Mac softwareupdate
。
到目前为止,这是我的脚本:
#!/bin/bash
ADMIN_PASS='cat /Users/adminuser/Documents/Update\ Script/enPass.txt | base64 --decode'
ADMIN_USER="adminuser"
HOST_LIST="/Users/adminuser/Desktop/hosts.txt"
for HOST in $(< $HOST_LIST); do
echo ""
echo "--------------------------------"
echo "# CONNECTING TO: $HOST #"
echo "--------------------------------"
echo ""
ssh -tt $ADMIN_USER@$HOST sudo su << UPDATE
echo "Connected to host!"
/usr/local/munki/managedsoftwareupdate -v --auto
softwareupdate -ia
shutdown -r now
UPDATE
echo ""
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo "~~ Update script completed sucessfully on $HOST ~~"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo ""
done
我知道我目前没有在此脚本中使用 ADMIN_PASS 变量。我在以前的版本中尝试过它,并认为这可能是安全性方面的最佳选择(如果您有更好的建议,我洗耳恭听!)。
无论如何,当我按原样运行此命令时,它会返回以下内容:
--------------------------------
# CONNECTING TO: 192.168.0.120 #
--------------------------------
echo "Connected to host!"
/usr/local/munki/managedsoftwareupdate -v --auto
softwareupdate -ia
shutdown -r now
Password:
Sorry, try again.
Password:
我假设“抱歉,请再试一次”。是因为echo
命令实际上被扔到了密码提示符中,但我不确定使这个东西正常工作的语法,sudo su
因为 ADMIN_PASS 变量是本地的,如果不将文件存储在 ssh 脚本上,就无法传递到 ssh 脚本远程客户端(对吗?)。
我需要这个脚本在没有管理员任何输入的情况下自动运行,并且我真的很想避免将其任何部分放在客户端系统上。
答案1
弄清楚了。这是我的功能脚本:
#!/bin/bash
ADMIN_PASS="$(cat /Users/adminuser/Documents/UpdateScript/enPass.txt)"
ADMIN_USER="adminuser"
HOST_LIST="/Users/adminuser/Desktop/hosts.txt"
for HOST in $(< $HOST_LIST); do
echo ""
echo "--------------------------------"
echo "# CONNECTING TO: $HOST #"
echo "--------------------------------"
echo ""
ssh -tt $ADMIN_USER@$HOST << ENDSSH
echo 'Connected to host!'
echo $ADMIN_PASS | base64 -d | sudo -S /usr/local/munki/managedsoftwareupdate -v --auto
echo 'Finished Munki Update!'
echo $ADMIN_PASS | base64 -d | sudo -S softwareupdate -ia
echo 'Finished Apple Software Update!'
echo $ADMIN_PASS | base64 -d | sudo -S shutdown -r now
logout
ENDSSH
echo ""
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo "~~ Update script completed successfully on $HOST ~~"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo ""
done
将变量显式传递$ADMIN_PASS
给我想要运行的每个命令似乎工作得很好。我做出了一个假设,因为这将在远程 Mac 上运行,所以本地$ADMIN_PASS
变量将不起作用。我将继续搞乱这个,因为我不喜欢它每次echo $ADMIN_PASS
使用时都会突出显示 enPass.txt 中的值。曾希望此语法将其发送到base64 -d
命令并使其远离终端窗口。
这个功能很好。如果有人有建议,请告诉我。我也很好奇这个脚本的安全性如何。如果我的大脑运转正常的话思考加密的密码被发送到客户端系统,然后在命令中使用之前被解密sudo -S
。