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

関連情報