通过 SSH 更新一堆 Mac

通过 SSH 更新一堆 Mac

我正在编写一个将从我们的 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

相关内容