저는 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
명령이 실제로 비밀번호 프롬프트에 던져졌지만 ADMIN_PASS 변수가 로컬이고 원격 클라이언트에 파일을 저장하지 않고는 ssh 스크립트에 전달할 수 없기 때문에 이 작업을 수행하는 구문이 확실하지 않습니다. End sudo su
( 오른쪽?).
관리자의 입력 없이 자동으로 실행하려면 이 스크립트가 필요하며 클라이언트 시스템에 이 스크립트의 어떤 부분도 넣지 않고 싶습니다.
답변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
.