ダウンロードとアニメのクリーンアップに役立つスクリプトを作成しましたが、rootなしでは実行できません。
そこで、それを/ etc/sudoersに追加してみました(techrafの提案を使用して編集):
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
Cmnd_Alias FILEPERM_CMDS = /bin/chown, /bin/chmod
# User privilege specification
root ALL=(ALL:ALL) ALL
myUsernane ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/down.sh
myUsernane ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/rehamer.sh
myUsernane ALL=(ALL) NOPASSWD: /bin/chown
myUsernane ALL=(ALL) NOPASSWD: /bin/chmod
myUsernane ALL=(ALL) NOPASSWD: FILEPERM_CMDS
# Allow members of group Sudo to execute any command
%Sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
しかし、これは機能しません...
スクリプトの内容は次のとおりです。
Sudo chown -cR myUsername:users $downloads $anime >>"$default"logs/own.log 2>&1
echo owned
Sudo chmod -cR 664 $anime >>"$default"logs/mod.log 2>&1
Sudo chmod -cR 765 $downloads >>"$default"logs/mod.log 2>&1
Sudo find $downloads $anime -type d -exec chmod a+x {} \; >>"$default"logs/mod.log 2>&1
echo moded
rm -vrf $downloads*.ignore >>"$default"logs/rm.log 2>&1
echo removed ignored files
スクリプトにSudoを残しておくと、パスワードの入力を1回要求され、機能します。スクリプトからSudoを削除すると、パスワードを昇格せずに実行されますが、それでもPermissions denied
エラーが何度も繰り返されます。どうすればこれを修正できますか?
以下をsudoers
に追加します。
myUsername ALL=(ALL) NOPASSWD: /path/to/down.sh
myUsername
が昇格された特権で/path/to/down.sh
スクリプトを実行することを許可しました。これは、次のコマンドを発行できることを意味します。
Sudo /path/to/down.sh
昇格された特権でスクリプト全体を実行するだけで十分であり、パスワードを要求しません。 Sudo
またはchown
に追加のchmod
を追加する必要はありません。これらのコマンドはスクリプトから権限を継承するためです(ただし、この場合、root
にはパスワードプロンプトなしですべてのコマンドを実行する権限があるため、Sudo chown
は問題なく実行されます)。
それが1つの可能な方法です。
反対に...
myUsername
がchown
でchmod
またはsudoers
を実行することを許可しませんでした。スクリプトを通常のユーザーとして実行し、特定のコマンドのみをroot
として実行できるようにする場合は、次のようにすべてをsudoers
で指定する必要があります。
myUsername ALL=(ALL) NOPASSWD: /usr/sbin/chown
バイナリへのパスが異なる場合があります
またはコマンドエイリアスを指定します。
Cmnd_Alias FILEPERM_CMDS = /usr/sbin/chown, /usr/sbin/chmod
myUsername ALL=(ALL) NOPASSWD: FILEPERM_CMDS
このようにして、スクリプトをそのまま使用できます。
最後に、# User alias specification
で権限を指定しました。これは良い習慣のアドバイスにすぎませんが、これはこのセクションの内容ではありません。むしろ# User privilege specification
に追加する必要があります。
いくつかの一般的なシナリオについては、 sudoersの例 をご覧ください。
1つの可能性は、スクリプトSudo自体を使用することです。これを/ etc/sudoersに追加します。
myUsername ALL=(ALL) NOPASSWD: /path/to/down.sh
次に、スクリプトの先頭にこれを追加します。
#!/bin/bash
# If not already running as root, rerun via Sudo
if [ $(id -u) -ne 0 ]; then
exec Sudo "$BASH_SOURCE" "$@"
exit $? # in case something fails...
fi
ファイルパスが/ etc/sudoersのエントリと一致する限り、rootとして透過的に再実行できるはずです(スクリプトの残りの部分でSudo
sを省略できます)。何らかの理由で一致しない場合は、Sudo
のパスワードプロンプトが表示されます。