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명령이 실제로 비밀번호 프롬프트에 던져졌지만 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.

관련 정보