
sudoを内外に使用できるスクリプトがあります。一部のコマンドは$ USERで実行する必要があり、一部のコマンドはrootとして実行する必要があります。
現在、私はスクリプトを実行してパスワードを一度入力すると、スクリプトが必要なコマンドをsudoし(残りは通常のユーザーとして実行)、バックグラウンドループが終了するようにsudoをアクティブに保つためにバックグラウンドでループを実行しています。 on: スクリプトが 。スクリプトは非常に制御された環境でのみ実行され、プロセス中にsudoアクセスが開いていることを心配しません。
しかし、後で整理されない場所にこのスクリプトを記録しようとしました。スクリプトの関連部分は次のとおりです。
#!/bin/bash
logFile="path/to/log/file"
main () {
# some getopts
}
getOptExample () {
sudoFunction
# do some other stuff that takes a really long time
# and bounces back and forth between sudo and not sudo
cleanUp
}
getOptOtherExample () {
sudoFunction
# do some other stuff that takes a really long time
# and bounces back and forth between sudo and not sudo
cleanUp
}
sudoFunction () {
sudo -v
while true;
do
sudo -n true
sleep 60
kill -0 "$$" || exit
done 2>/dev/null &
}
cleanUp () {
# remove script file
# remove tmp dir that we're working in
# reboot computer to apply all changes
}
(main "$@") 2>&1 | tee $logFile
sudo関数が呼び出される前にスクリプトの最後の行が発生するため、/var/logに書き込むことはできず、実行中のユーザーの権限のみを持ちます。また、tmpディレクトリが複雑になり、スクリプトが完了した後にその中のファイルを削除する必要があるため、tmpディレクトリに書き込むことはできません。さらに、スクリプト自動化操作が完了した後も、そのディレクトリが存在し続ける理由はありません。
- ホームディレクトリが影響を受けないアカウントがありますが、ユーザーにはそのホームディレクトリにファイルを作成する権限がありません。
- このスクリプトはMac OSで実行されていますが、他の/未来/Mac以外のものと互換性があるようにしようとしています(bashに固執し、posixに固執しようとしていますが、Linusの指示に固執しようとしています) )。 Linuxカーネルに追加)。
- 1回以上の再起動後も維持するには、ログファイルが必要です。
このスクリプトのログファイルをどこにダンプする必要がありますか?
- 見つけやすさ(直感的)
- ユーザーはsudoなしで書くことができます。
- ユーザーのホームディレクトリに書き込まないでください。
- 再起動時に削除されない
それともこれを行うより良い方法があります(必要に応じてスクリプト全体を公開できます)。
答え1
これを行うには、デフォルトのファイル権限またはACLを使用します。
group
たとえば、権限セクションとnewgrp
基本グループを切り替えるコマンドがあります。たとえば、所有者としてSGID
ビットを使用することも検討してください。nobody
OSXでACLを使用できるかどうかはわかりませんが、ACLがあることを願っています。単にログファイルへのアクセスと書き込みをsetfacl
許可するために使用されます。user|group
通常は/var/log/
ログファイルに適用されます。たとえば、適切な権限を持つフォルダを設定します/var/log/yourscripname
。