Bash

通過 SSH 更新一堆 Mac

  • April 20, 2019

我正在編寫一個將在我們的 Mac 伺服器上執行的腳本,它會(希望)通過 Munki(repo 在同一台伺服器上)和內置softwareupdate命令更新我們所有的 Mac。

到目前為止,這是我的腳本:

#!/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 腳本遠端客戶端(對嗎?)。

我需要這個腳本在沒有管理員輸入的情況下自動執行,我真的很想避免將它的任何部分放在客戶端系統上。

弄清楚了。這是我的功能腳本:

#!/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命令之前被解密。

引用自:https://unix.stackexchange.com/questions/169288