![在 shell 脚本中安全地传递 root 密码](https://linux22.com/image/76545/%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%AE%89%E5%85%A8%E5%9C%B0%E4%BC%A0%E9%80%92%20root%20%E5%AF%86%E7%A0%81.png)
我总是在控制台模式下启动我的 GNU/Linux 笔记本电脑。但有时我需要调出 GUI 模式。它总是要求输入 root 密码。所以我编写了以下脚本“gogui.sh”并将其放入/usr/bin
:
#!/bin/bash
echo "mypassword" | sudo service lightdm start
这是一个非常愚蠢的想法,就好像有人读取了该文件,可以轻松地看到我的密码一样。
有替代方案吗?
答案1
在脚本中向 sudo 传递密码是完全没有意义的。相反,添加 sudo 规则添加您想要运行的特定命令NOPASSWD
添加您想要使用标签。请注意,特定于命令的NOPASSWD
规则必须位于任何一般规则之后。
saeid ALL = (ALL:ALL) ALL
saeid ALL = (root) NOPASSWD: service lightdm start
但这可能无论如何都没有用。lightdm start
启动登录提示,但仅当您想让其他用户以图形方式登录时才需要它。如果您只想启动 GUI 会话,则不需要它。相反,请致电startx
从文本模式会话启动 GUI 会话。这不需要任何额外的特权。
您可能需要显式指定您的窗口管理器或桌面环境,因为startx
可能不会选择 lightdm 使用的相同默认会话类型。
startx -- gnome-session
答案2
有一些选项,其中之一是使用visudo
NOPASSWD 标志添加特定命令:
%wheel ALL=(ALL) NOPASSWD: /path/to/myscript
cat /path/to/myscript
#!/bin/bash
service lightdm start
答案3
编辑
刚刚注意到您在评论中提到了 Unity,所以看起来您正在运行 Ubuntu。我原来的答案是针对系统初始化系统,但命令如telinit
为了兼容性仍然存在,并将在发行版上使用系统或者暴发户。
系统V方式
telinit 5
在现代 Systemd 系统上,telinit
被重定向到systemctl
。
系统方式
systemctl isolate runlevel5.target
或者
systemctl isolate graphical.target
原答案:
在较旧的非 Systemd 发行版(例如 RHEL/CentOS 6 及更早版本)上,从控制台模式切换到 GUI 的最简单方法是使用telinit
命令。例如,在 RHEL/Centos 发行版上,多用户基于文本的模式是运行级别 3,多用户 GUI 模式是运行级别 5。从控制台切换到 GUI 模式的操作如下:默认情况下,telinit
需要 root特权。要以普通用户身份运行且无需密码,您需要输入一个sudoers
条目或在 telinit 可执行文件上设置 setuid 标志。该sudo
方法是首选方法,因为它可以仅限于您的帐户。
答案4
由于您具体指的是sudo
,请坚持吉尔斯的回答。但是,由于您的问题标题只是关于获取程序的密码stdin
,而我最近也遇到了类似的情况:
echo $(read -sp "Password: " password; echo $password) | yourcommand
我可能会因此受到一些批评,但它确实有效。
说到bash
这里,你可能还可以使用
yourcommand <$(read -sp "Password: " password; echo $password)