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

Gue*_*OCs 31 bash sudo scripts

我通常做

sleep 4h; command
Run Code Online (Sandbox Code Playgroud)

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

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

des*_*ert 47

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

sudo bash -c 'sleep 4h; command'
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)

另一种方法是sudo visudo允许在没有 root 访问权限的情况下执行命令,请参阅: 如何使用 sudo 在不提示输入密码的情况下允许执行?
请注意,根据命令,这可能会造成安全漏洞。


Ama*_*ren 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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果你想每 4 小时运行一次,你也可以在你的 crontab 中使用 cron(作为 root)和以下配置

    0 */4 * * * sh -c $'/path/to/command'
    
    Run Code Online (Sandbox Code Playgroud)

  • @SimonRichter:`sudo bash -c 'sleep 4h && command' &` 将 sudo 置于后台是一种不阻塞 shell 窗口/选项卡的更简单方法。如果您*希望*输出异步弹出以提醒它发生了,那就更容易了。它在重新启动后不起作用,但根据您的 `nohup` 设置,它可能会在退出 / 从 shell 注销后保持运行。 (4认同)
  • 请注意,当系统在指定时间挂起时,`at` 会尽快运行该命令,请参阅 [此处在 U&L](https://unix.stackexchange.com/q/411022/246819) – 取决于运行此命令的命令可能不是您想要的。 (4认同)
  • 是的,`at` 是这项工作的正确工具,因为它也负责 I/O 重定向,不会阻塞 shell 窗口,并且即使在用户注销或机器重新启动后也能工作。 (2认同)
  • 只是一个建议,你也可以使用 systemctl 来检查服务状态,而不是直接调用那个 init.d 脚本。虽然两者似乎都有相同的结果,但我认为与 systemd 服务交互的现代方式应该是首选:`systemctl status atd` (2认同)

sud*_*dus 15

一种方法是通过具有sudo权限的 shellscript 运行(并在启动 shellscript 时提供密码),如果 shellscript 在当前目录中,

sudo ./delayer 4h
Run Code Online (Sandbox Code Playgroud)

哪里delayer可以是包含内容的 shellscript

#!/bin/bash
sleep "$1"
command
Run Code Online (Sandbox Code Playgroud)

使其可执行

chmod +x delayer
Run Code Online (Sandbox Code Playgroud)

并根据需要将其复制或移动到目录中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
"$@"
Run Code Online (Sandbox Code Playgroud)

演示示例(短延迟,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
Run Code Online (Sandbox Code Playgroud)

  • 好吧,如果它是 `/bin/sh` 语法就可以了。但是如果您打算使用 bash 特定的功能,那么 shebang 是必要的。我和steeldriver在某个地方讨论过这个问题。在我做出正确回应之前,Aaand Videonauth 删除了他的评论。那好吧 (3认同)