
2日ごとにユーティリティを実行するスクリプトがあります。このユーティリティは私のシステムでいくつかのことをしました。非常によく知られ、広く使用されているオープンソースソフトウェアです。
#!/usr/bin/env bash
#...do stuff here
utility
時々(常にそうではない)、utility
作業を完了するにはパスワードを入力する必要があります。私は実行を見なかったし、utility
何の結果も見なかった1>/dev/null
。だから私はすべての試みが自動的に失敗したいとutility
思いますsudo
。後で手動で実行して、スーパーユーザーアクセスが必要なタスクを確認できます。
問題は、これが私がsudoしているスクリプトではありませんが、定期的に更新されるのでutility
編集utility
したくないということです。 SUDO_ASKPASSを役に立たないように設定するsudo
と有望に-A
見えますがutility
。utility
マニュアルページやオンラインドキュメントにも「sudoブロック」の方法はなく、Googleで「システム全体のsudoブロック」を検索したことがありません。
私はこれを使うつもりですfake-sudo-test.bash
:
#!/usr/bin/env bash
FAKE_SUDO="/usr/local/bin/sudo"
echo "echo 'no sudo for you $0' && exit 1" > $FAKE_SUDO
chmod u+x $FAKE_SUDO
sudo echo "I got superuser access"
\rm $FAKE_SUDO
私の$ PATH/usr/local/bin
の前に/usr/bin
。
より良い方法を知っていますか?
PS: utility
はいbrew
、macOSのHomebrandパッケージマネージャです。私はbrew upgrade
問題のパッケージマネージャを使用しています。質問をもっと一般的なものにすることで、もっと役に立つと思います。
$ sudo -V
Sudo version 1.8.17p1
Sudoers policy plugin version 1.8.17p1
Sudoers file grammar version 45
Sudoers I/O plugin version 1.8.17p1
答え1
Linuxでは、このフラグを有効にして、プロセスおよびここで開始された他のすべてのプロセスに対するsetuidビットの影響を無効にすることができますno_new_privs
(参考文献を参照prctl(2)
)。シェルスクリプトでは、setpriv
パッケージ内のユーティリティを使用して次のことができますutil-linux
。
$ setpriv --no-new-privs sudo -v
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
したがって、上記の騒々しいエラーメッセージに耐えることができる限り、スクリプトを修正して代わりにsetpriv --no-new-privs utility
実行すると、アクションが実行されます。utility
brew
(残念ながら、これはmacOSでは機能しないかもしれませんが、他の人には役に立つかもしれないと言いました。)
答え2
端末に接続していないとパスワードを要求できません。
setsid brew < /dev/null &> /dev/null
または出力をキャプチャする場合:
setsid brew < /dev/null |& cat
つまり、あなたが持っていると仮定setsid
、これは明らかにMacOSでは動作しないことがあります。欲しいのにないとここにいます。利用可能な実装。
あなたはいませんが、sedsid
持っているならat
:
[ -e ~/brew_$$.log ] && rm ~/brew_$$.log
at now << eof
brew > ~/brew_$$.lo_ 2>& 1 || true
mv ~/brew_$$.lo_ ~/brew_$$.log
eof
while ! [ -e ~/brew_$$.log ]; do sleep 1; done
cat ~/brew_$$.log && rm ~/brew_$$.log
brew
これで、端末から離れて実行され、出力をキャプチャし、それをスクリプトの出力ストリームにコピーします。
答え3
出てください
/etc/sudoers
。これにより、すべてのsudo試行が失敗します。次の行をコメントアウトする必要があります。
%sudo ALL=(ALL:ALL) ALL
この操作をキャンセルできるように、root権限(rootパスワードなど)を取得する他の方法があることを確認してください。
次の行を編集してください
/etc/sudoers
。Defaults env_reset
入力する
Defaults env_reset,timestamp_timeout=-1
これにより、sudoはパスワードを要求しません。 (源泉。)
失敗したすべてのsudo試行は
/var/log/auth.log
.Runに書き込まれ、utility
次の行を探しますauth.log
。Jul 4 12:23:07 host sudo: test_perm : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/nick ; USER=root ; COMMAND=/bin/echo
(これはmacOSの他の場所に記録される可能性があります。わかりません。)