现在,systemd 给出了答案。

现在,systemd 给出了答案。

在 Ubuntu 15.04 上我有这个文件:/usr/local/bin/myscript(这是我制作的脚本)。

如果我在我的帐户下运行此命令,它将执行我需要它作为根用户执行的操作:须藤 /usr/local/bin/myscript

我现在想做/usr/local/bin/myscript在计算机启动时运行,但以 root 用户身份运行(就好像我正在运行 sudo 命令但无需输入任何密码)。在 Ubuntu 15.04 上这是如何完成的?

答案1

现在,systemd 给出了答案。

您使用的是 Ubuntu 版本 15。您有 systemd。 /etc/rc.local它充其量只是 systemd 中的向后兼容机制。正如下面超链接的 AskUbuntu 问题中显示的混乱情况,使用它可能会出现严重错误。因此,请创建一个适当的 systemd 服务单元。

您正在创建一个本地的非系统非包服务单元,因此单元文件将位于/etc/systemd/system/该类型单元所在的位置。我们就这样称呼它吧/etc/systemd/system/myscript.service。它包含了:

[单元]
描述=user2580的脚本
文档=https://unix.stackexchange.com/questions/202698/

[服务]
类型=简单
ExecStart=/usr/local/bin/myscript

[安装]
WantedBy=多用户.target

如果您的脚本“为了守护进程”分叉,那么请阻止它这样做。那是完全没有必要的。

  • 运行systemctl preset myscript.service(作为超级用户)以使其在引导时自动启动。
  • 立即运行systemctl start myscript.service(以超级用户身份)手动启动它。
  • 运行systemctl status myscript.service以查看其状态。

请注意,这不会在能够与 X 服务器通信的上下文中执行您的脚本。它甚至可以在 X 服务器启动之前运行。但是您没有提到成为 X 客户端的任何要求,也没有提到HOME环境变量等对新手来说很复杂的问题。无论如何,这些都是其他问题的主题。所以我就这样吧。

进一步阅读

答案2

您只需添加一行来调用 中的脚本即可/etc/rc.local。该文件是最后运行的初始化脚本。

只要确保它/etc/rc.local是可执行的并且由 root 拥有即可。

答案3

您可以使用gksudo:-

NAME
       gksu - GTK+ frontend for su and sudo


DESCRIPTION           
       gksu is a frontend to su and gksudo is a frontend to sudo.  Their primary purpose is to run graphical commands
       that need root without the need to run an X terminal emulator and using su directly.
  • 打开启动应用程序(系统设置 > 启动应用程序或gnome-session-properties)。
  • 使用以下命令添加新条目(gksudo myscript或者gksudo /usr/local/bin/myscript):-

屏幕截图

单击“添加”,此脚本将在您启动/登录桌面时运行。


笔记:-确保gksu已安装才能使用gksudo。 (您可以通过安装它sudo apt-get install gksu


另一种方法是使用 Askpass 程序,它适用于sudo -A:-

-A, --askpass
                 Normally, if sudo requires a password, it will read it from the user's terminal.  If the -A
                 (askpass) option is specified, a (possibly graphical) helper program is executed to read the user's
                 password and output the password to the standard output.  If the SUDO_ASKPASS environment variable
                 is set, it specifies the path to the helper program.  Otherwise, if sudo.conf(5) contains a line
                 specifying the askpass program, that value will be used.  For example:

                     # Path to askpass helper program
                     Path askpass /usr/X11R6/bin/ssh-askpass

我用作zenityaskpass 助手的示例。

相关内容