私は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
。