Я обычно делаю
sleep 4h; command
выполнить команду после 4-й. Однако, если та команда требует sudo
, это не будет работать.
Действительно ли возможно дать sudo
разрешение в данный момент я работаю sleep
команда?
Использовать sudo
для запуска корневой оболочки, куда Вы выполняете команды:
sudo bash -c 'sleep 4h; command'
Каждая команда, работающая в корневой оболочке, работает с корневыми полномочиями, который для sleep
не причиняет боль. Если необходимо выполнить команду с полномочиями пользователя в нем, использовать sudo -u USERNAME COMMAND
, например:
$ sudo bash -c 'sleep 4h; sudo -u dessert whoami; whoami'
dessert # whoami run as user dessert
root # whoami run as root
Другой подход должен был бы использовать sudo visudo
для разрешения выполнения команды без корневого доступа см.: Как позволить выполнение, не запрашивая пароль с помощью sudo?
Обратите внимание, что в зависимости от команды это может создать дефект безопасности.
Принятие Вас только хочет выполнить процесс однажды (не, например, каждые 4 часа) затем можно использовать atd
/etc/init.d/atd status
или лучше все еще systemctl status atd
)На терминале как корень выполняет Вашу команду следующим образом:
# at now + 4 hours
warning: commands will be executed using /bin/sh
at> command
at> CTRL-D
Если Вы хотите выполнить его каждые 4 часа, Вы могли бы также использовать крон (в качестве корня) со следующей конфигурацией в Вашем crontab
0 */4 * * * sh -c $'/path/to/command'
Один путь состоит в том, чтобы работать с помощью сценария оболочки с sudo
полномочия (и дают пароль, когда Вы запускаете сценарий оболочки), если сценарий оболочки находится в текущем каталоге,
sudo ./delayer 4h
где delayer
может быть сценарий оболочки с содержанием
#!/bin/bash
sleep "$1"
command
Сделайте это исполняемым файлом с
chmod +x delayer
и копия или перемещение это к каталогу в PATH
если Вы желаете.
Если Вы хотите более гибкий сценарий оболочки, где можно выбрать команду [строка] для задержки путем ввода параметра (параметров), можно попробовать
#!/bin/bash
if [ $# -lt 2 ] || [ "$(whoami)" != "root" ]
then
echo "Delay start of command, that needs 'sudo'
Usage: sudo $0 <delay> <command line>
Example: sudo $0 4h parted -ls"
exit
fi
sleep "$1"
shift
"$@"
Демонстрационный пример (малая задержка, 5 с, для демонстрационной цели),
$ ./delayer
Delay start of command, that needs 'sudo'
Usage: sudo ./delayer <delay> <command line>
Example: sudo ./delayer 4h parted -ls
$ sudo ./delayer 5s parted /dev/sdc p
[sudo] password for sudodus:
Model: Kanguru SS3 (scsi)
Disk /dev/sdc: 15,9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
2 1049kB 2097kB 1049kB primary bios_grub
3 2097kB 258MB 256MB fat32 primary boot, esp
4 258MB 2274MB 2016MB primary
5 2274MB 12,5GB 10,2GB ext2 primary
1 12,5GB 15,9GB 3394MB ntfs primary msftdata
Иначе должен был бы запустить sudo интерактивную сессию с sudo -s
(не изменяет каталог), или sudo -i
(текущий каталог изменений для укоренения корневого каталога), и затем вводят команды (без sudo)