web-dev-qa-db-ja.com

sudoersを使用したSudoコマンドを含むスクリプトの実行

ダウンロードとアニメのクリーンアップに役立つスクリプトを作成しましたが、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エラーが何度も繰り返されます。どうすればこれを修正できますか?

1
hakarune

以下を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つの可能な方法です。


反対に...

myUsernamechownchmodまたは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の例 をご覧ください。

2
techraf

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として透過的に再実行できるはずです(スクリプトの残りの部分でSudosを省略できます)。何らかの理由で一致しない場合は、Sudoのパスワードプロンプトが表示されます。

0
Gordon Davisson