指定した日付にファイルをフォルダーに移動する必要があるユーザーがいます。 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