Выполните команду, которая требует, чтобы sudo через некоторое время передал

Я обычно делаю

sleep 4h; command

выполнить команду после 4-й. Однако, если та команда требует sudo, это не будет работать.

Действительно ли возможно дать sudo разрешение в данный момент я работаю sleep команда?

30
задан 18 February 2019 в 03:50

4 ответа

Использовать 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?
Обратите внимание, что в зависимости от команды это может создать дефект безопасности.

46
ответ дан 23 November 2019 в 00:45

Принятие Вас только хочет выполнить процесс однажды (не, например, каждые 4 часа) затем можно использовать atd

  1. Удостоверьтесь, что фактическое время отправления работает (в человечности, которая является /etc/init.d/atd status или лучше все еще systemctl status atd)
  2. На терминале как корень выполняет Вашу команду следующим образом:

    # at now + 4 hours
    warning: commands will be executed using /bin/sh
    at> command
    at> CTRL-D
    
  3. Если Вы хотите выполнить его каждые 4 часа, Вы могли бы также использовать крон (в качестве корня) со следующей конфигурацией в Вашем crontab

    0 */4 * * * sh -c $'/path/to/command'
    
21
ответ дан 23 November 2019 в 00:45

Один путь состоит в том, чтобы работать с помощью сценария оболочки с 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
15
ответ дан 23 November 2019 в 00:45

Иначе должен был бы запустить sudo интерактивную сессию с sudo -s (не изменяет каталог), или sudo -i (текущий каталог изменений для укоренения корневого каталога), и затем вводят команды (без sudo)

2
ответ дан 23 November 2019 в 00:45

Другие вопросы по тегам:

Похожие вопросы: