Назад | Перейти на главную страницу

Сценарий bash: запрос пароля sudo только один раз

Я работаю над сценарием резервного копирования bash, который выполняет кучу длинных rsync рабочие места. Некоторые из них занимают до 3-4 часов каждый.

После этих больших передач я хочу очистить кеш диска после синхронизации файлов перед запуском контрольных сумм на целевом диске, чтобы убедиться, что все на целевом диске было скопировано правильно. У меня есть эта строка ниже, которая предположительно делает это, требуя sudo:

sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

Чтобы выполнить весь сценарий bash без прерывания, я запрашиваю пароль пользователя в начале для sudo, но я замечаю sudo по понятным причинам сохраняет сеанс паролей всего около 15 минут. Через несколько часов скрипт перестает ждать, пока пользователь войдет в sudo пароль еще раз.

Как лучше всего запустить этот сценарий, чтобы сохранить sudo разрешения на время, когда они необходимы, но без запроса пароля каждый раз, чтобы сценарий работал без перебоев в течение нескольких часов, сохраняя возможность команды очистки дискового кеша?

#!/bin/bash

# backup all drives using rsync and also verify the integrity of the backup

    # BACKUP

    # first, drop the disks internal volatile caches to start with clean file system state (https://unix.stackexchange.com/questions/30970/)
    printf "\nNeed sudo priviliges in order to flush disk caches in this script.\n"
    # invoke sudo to ask for permission needed to clear the disk cache in next command
    sudo printf "\nClearing disk cache... " 
        sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
    printf "DONE.\n\n\n"

    # now run the backup lines
        # First disk
        printf "rsync 'First' disk...\n"
        # need to put [] around $ to escape it for folders like $RECYCLE.BIN (https://stackoverflow.com/questions/19305010)
        rsync -vah --progress --stats --exclude={"Adobe","[$]RECYCLE.BIN","System Volume Information","pagefile.sys","temp"} /media/n/First/ ./First/
        printf "\n\n"

        # Scratch disk
        printf "rsync 'Scratch' disk...\n"
        rsync -vah --progress --stats --exclude={"[$]RECYCLE.BIN","System Volume Information","pagefile.sys","temp"} /media/n/Scratch/ ./Scratch/
        printf "\n\n"


        # ...



    # CHECKSUM
    # re-read/compare

    # drop the disks internal volatile caches
    printf "Now testing backup checksums for integrity.\n\n"
    # rsync --itemize-changes, legend here: (https://stackoverflow.com/questions/4493525)

        # First disk
        printf "Clearing disk cache... "
            sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
        printf "DONE.\n"
        printf "Checking 'First' disk backup...\n"
        # need to put [] around $ to escape it for folders like $RECYCLE.BIN (https://stackoverflow.com/questions/19305010)
        rsync -vah --progress --checksum --itemize-changes --stats --exclude={"Adobe","[$]RECYCLE.BIN","System Volume Information","pagefile.sys","temp"} /media/n/First/ ./First/
        printf "\n\n"


# ...



print "Finished.\n\n"

# revoke sudo
sudo -k
exit

Запустите свой скрипт с помощью sudo.

sudo yourscript.sh

Вам будет предложено только один раз, и сценарий будет запущен с правами root.

используйте (как root) visudo (или отредактируйте / etc / sudoers напрямую) и добавьте:

# below "root ALL=..."
jonny      ALL=NOPASSWD: your_script

Примечание: сценарий должен находиться в одном из «безопасных_путь» в / etc / sudoers