经过一段时间后,运行需要sudo的命令


30

我通常会

sleep 4h; command

在4小时后执行命令。但是,如果该命令需要sudo,则它将不起作用。

sudo我正在运行sleep命令时是否可以授予权限?



在这种情况下,我认为您可以使用shutdown。带有sudo的命令和适当的参数来安排在特定时间的睡眠。
oarfish


您需要执行的任务是什么,为什么要精确睡眠4个小时?
托尔比约恩Ravn的安德森

Answers:


46

使用sudo的地方开始运行命令一个root shell:

sudo bash -c 'sleep 4h; command'

在root外壳中运行的每个命令都以root权限运行,这对用户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小时运行一次,则还可以在crontab中将cron(作为root用户)与以下配置一起使用

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

2
是的,这at是完成此任务的正确工具,因为它还可以处理I / O重定向,不阻止外壳程序窗口,并且即使在用户注销或此后重新启动计算机后也可以正常工作。
西蒙·里希特

4
@SimonRichter:sudo bash -c 'sleep 4h && command' &将sudo放在背景中是一种不阻塞shell窗口/选项卡的简便方法。如果您希望输出异步弹出以提醒您发生了该事件,那么会更容易。它在重新启动后无法正常工作,但根据您的nohup设置,退出或退出Shell后它可能仍保持运行。
Peter Cordes

4
请注意,at在指定时间挂起系统后,应尽快运行该命令,请参见U&L –根据要运行的命令,这可能不是您想要的。
甜点

2
仅作为建议,您也可以使用systemctl来检查服务状态,而不是直接调用该init.d脚本。虽然两者看似具有相同的结果,但我认为应该首选与systemd服务进行交互的现代方式:systemctl status atd
Byte Commander

15

一种方法是通过具有sudo权限的shellscript运行(如果启动shellscript,并输入密码),如果该shellscript位于当前目录中,

sudo ./delayer 4h

delayer包含内容的shellscript 在哪里

#!/bin/bash
sleep "$1"
command

使它可执行

chmod +x delayer

并根据需要将其复制或移动到目录中PATH


如果您想使用更灵活的shellscript,可以在其中通过输入参数选择命令[line]来延迟执行,您可以尝试

#!/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 s,用于演示)

$ ./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。我和钢杆司机在某处进行了讨论。Aaand Videonauth在我可以正确回复之前删除了他的评论。哦,很好
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy,你是对的。因此,在这种情况下,shebang可以使Shellscript健壮,以防语法可能有所不同的附加功能。
sudodus

@SergiyKolodyazhnyy好吧,这只是一个建议,所以我认为留下评论是没有必要的,只会增加混乱。随意打我聊天并指出您的观点:)
Videonauth

2

另一种方法是使用sudo -s(不更改目录)或sudo -i(将当前目录更改为根主目录)启动sudo交互式会话,然后输入命令(不使用sudo)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.