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

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

我通常会

sleep 4h; command

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

sudo我运行命令时可以给予许可吗sleep

答案1

用于sudo启动 root shell,并在其中运行以下命令:

sudo bash -c 'sleep 4h; command'

在 root shell 中运行的每个命令都以 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 允许执行而不提示输入密码?
请注意,根据命令的不同,这可能会造成安全漏洞。

答案2

假设你只想运行一次该过程(例如不是每 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'
    

答案3

一种方法是通过具有权限的 shellscript 运行sudo(并在启动 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 秒,用于演示目的),

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

答案4

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

相关内容