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/)

이것평가 순서와일드카드와 $(…)확장은 명령이 실행되기 전에 셸에서 처리됩니다. 두 개의 소스 파일 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

관련 정보