Запустіть команду, яка потребує sudo після того, як пройшов час


30

Я зазвичай так роблю

sleep 4h; command

виконати команду через 4 год. Однак якщо ця команда вимагає sudo, вона не працюватиме.

Чи можна надати sudoдозвіл, коли я виконую sleepкоманду?


щось на кшталт цього unix.stackexchange.com/questions/391796/…
MatsK

У цьому конкретному випадку я думаю, що ви можете просто скористатися shutdown. команда з sudo та відповідні аргументи для планування сну на певний час.
морська риба


Яке завдання вам потрібно зробити, і чому саме 4-годинний сон?
Thorbjørn Ravn Andersen

Відповіді:


46

Використовуйте 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для дозволу виконання команди без доступу root, див. Як дозволити виконання без запрошення пароля за допомогою sudo?
Зауважте, що залежно від команди це може створити недолік безпеки.


21

Якщо припустити, що ви хочете запустити процес лише один раз (не, наприклад, кожні 4 години), тоді ви можете використовувати atd

  1. Переконайтеся, що atd працює (у ubuntu, який є /etc/init.d/atd statusчи ще краще systemctl status atd)
  2. У терміналі як root виконайте команду наступним чином:

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

    0 */4 * * * sh -c $'/path/to/command'

2
Так, atце правильний інструмент для цієї роботи, оскільки він також піклується про перенаправлення вводу / виводу, не блокує вікно оболонки і працює навіть тоді, коли користувач вийшов із системи або з цього часу перезавантажили машину.
Саймон Ріхтер

4
@SimonRichter: проставити судо sudo bash -c 'sleep 4h && command' &на задньому плані - це простіший спосіб не блокувати вікно / вкладку оболонки. Якщо ви хочете, щоб результат вийшов асинхронно, як нагадування про те, що це сталося, це простіше. Він не працює під час перезавантаження, але залежно від ваших nohupналаштувань може залишатися запущеним після виходу / виходу з оболонки.
Пітер Кордес

4
Зауважте, що atкоманда запускається, як тільки вона зможе, коли система призупинена у вказаний час, дивіться тут на U&L - залежно від команд (ив) для виконання цього можливо не є тим, що ви хочете.
десерт

2
Лише пропозиція, ви також можете використовувати systemctl для перевірки стану послуги замість того, щоб безпосередньо викликати цей скрипт init.d. Хоча обидва, здавалося б, мають однаковий результат, я вважаю, що слід віддавати перевагу сучасному способу взаємодії із системними службами:systemctl status atd
Байт-командир

15

Один із способів - запустити через оболонку оболонки з 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
"$@"

Демонстраційний приклад (коротка затримка, 5s, для демонстраційних цілей),

$ ./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

3
Що ж, якщо це /bin/shсинтаксис, це буде добре. Але якщо ви маєте намір використовувати особливості bash, тоді shebang необхідний. У мене з Steeldriver десь дискутували про це. Aa Videonauth видалив його коментар, перш ніж я міг відповісти належним чином. Ну добре
Сергій Колодяжний

@SergiyKolodyazhnyy, Ви маєте рацію. Тож у цьому випадку шебанг є для того, щоб зробити сценарій оболонки надійним у випадку додаткових функцій, де синтаксис може відрізнятися.
sudodus

@SergiyKolodyazhnyy Ну це була лише пропозиція, тому я подумав, що залишати коментар там не потрібно і додасть лише захаращення. Не соромтеся
забивати

2

Іншим способом було б запустити інтерактивний сеанс sudo з sudo -s(не змінює каталог) або sudo -i(змінює поточний каталог на головний домашній каталог), а потім вводить ваші команди (без sudo)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.