如何在脚本中使用计时器和屏幕保护程序命令执行关机

Eka*_*Eka 3 command-line shutdown scripts screensaver

我在执行时制作了这个脚本将关闭我的系统(一段时间后)并且应该启用屏幕保护程序。

#!/bin/bash
sudo shutdown -h +30
gnome-screensaver-command -a
Run Code Online (Sandbox Code Playgroud)

这个脚本主要有两个问题。

  1. 它要求输入密码(我不想要)
  2. 执行后sudo shutdown -h +30不运行gnome-screensaver-command -a

也就是说,它会激活关机,但不会激活屏幕保护程序

如何解决这些问题?

hee*_*ayl 6

问题1和2的解决方案:

  1. 您需要编辑/etc/sudoers( sudo visudo) 文件以添加相关条目以授予sudo用户运行此脚本(而不是shutdown命令)的无密码权限:

    foo spamegg = (root) NOPASSWD: /path/to/script.sh
    
    Run Code Online (Sandbox Code Playgroud)

    foo是用户名,spamegg是主机名,相应地替换/path/to/script.sh。现在运行命令(使脚本可执行):

    sudo /path/to/script.sh
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,该gnome-screensaver-command -a命令也将作为 运行root,如果您不希望您需要为用户授予无密码sudo shutdown命令的权限:

    foo spamegg = (root) NOPASSWD: /sbin/shutdown
    
    Run Code Online (Sandbox Code Playgroud)
  2. 第二个问题是因为在您当前的脚本中,gnome-screensaver-command -a只会在shutdown命令完成后运行。由于该shutdown命令将在 30 分钟后实际执行,因此处于阻塞状态。要解决此问题,您可以将shutdown命令置于后台:

    shutdown -h +30 &
    gnome-screensaver-command -a
    
    Run Code Online (Sandbox Code Playgroud)

简而言之,您可以按如下方式制作脚本:

foo spamegg = (root) NOPASSWD: /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

运行它:

sudo /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

在使用之前sudo,请将脚本存放在安全的地方,它必须只有您可以访问,并且您必须确定脚本的内容。