Bash
通過 SSH 更新一堆 Mac
我正在編寫一個將在我們的 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
命令之前被解密。