在 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
环境变量等对新手来说很复杂的问题。无论如何,这些都是其他问题的主题。所以我就这样吧。
进一步阅读
- https://unix.stackexchange.com/a/200281/5132
- 乔纳森·德博因·波拉德 (2001)。 “不要为了“将守护进程置于后台”而使用 fork()。”。 设计 Unix 守护程序时要避免的错误。常见答案。
答案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
我用作zenity
askpass 助手的示例。