sudoersファイルを入力した後にユーザーとしてmvコマンドを実行すると、権限が拒否されました。

sudoersファイルを入力した後にユーザーとしてmvコマンドを実行すると、権限が拒否されました。

指定した日付にファイルをフォルダーに移動する必要があるユーザーがいます。 sudoersファイルには次のエントリがあります。

backupuser ALL=(ALL) NOPASSWD: /usr/bin/mv /var/lib/pgsql/base_backup/*.tar.gz /var/lib/pgsql/backups/$(date +%Y_%m_%d/)

ただし、ユーザーがコマンドを実行すると、コマンドはパスワードの入力を求められ、sudoersファイルに入力したコマンドが選択されていないことを示します。

一部のエスケープ文字がありませんか? (、)、%の前に\を使用してエスケープしようとしましたが、そうしようとすると構文エラーが発生します。

より多くの情報が必要な場合はお知らせください。

答え1

評価の順序についてです。ユーザーがこのようなコマンドを実行すると

sudo mv /var/lib/pgsql/base_backup/*.tar.gz /var/lib/pgsql/backups/$(date +%Y_%m_%d/)

これ評価順序ワイルドカードと$(…)拡張は、コマンドが実行される前にシェルによって処理されます。 2つのソースファイルone.tar.gzとがあり、two.tar.gz今日の日付が2024年4月25日の場合、次のコマンドが実行されます。

sudo mv /var/lib/pgsql/base_backup/one.tar.gz /var/lib/pgsql/base_backup/two.tar.gz /var/lib/pgsql/backups/2024-04-25/

sudoers文書実際には*ワイルドカードとして理解されています(しかし、これまでシェルより無料- 参考にしてください! )、その$(…)部分は理解されていないため、18文字のリテラルシーケンス以外の他の項目と一致しません。したがって、結果のコマンドは拒否されます。sudo

スクリプトを作成し、バックアップユーザーにスクリプトを実行させることをお勧めします。たとえば、ルートのみを変更できる場所に配置されます。

#!/bin/sh
# Move backup files to a date-based directory
########################################################################
#
today=$(date +%Y_%m_%d)
ss=0

src='/var/lib/pgsql/base_backup'
dst="/var/lib/pgsql/backups/$today"

if [ ! -d "$src" ]
then
    echo "ERROR: Missing source: $src" >&2
    ss=1
fi
if [ ! -d "$dst" ] || [ ! -w "$dst" ]
then
    echo "ERROR: Missing or inaccessible destination: $dst" >&2
    ss=1
fi
if [ "$ss" -gt 0 ]
then
    exit "$ss"
fi

mv -f -- "$src"/*.tar.gz "$dst/"
exit

関連情報