我通常会
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
- 确保 atd 正在运行(在 ubuntu 中
/etc/init.d/atd status
或更好systemctl status atd
) 在终端以 root 身份运行以下命令:
# at now + 4 hours warning: commands will be executed using /bin/sh at> command at> CTRL-D
如果你想每 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)