在 shell 脚本中安全地传递 root 密码

在 shell 脚本中安全地传递 root 密码

我总是在控制台模式下启动我的 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

有一些选项,其中之一是使用visudoNOPASSWD 标志添加特定命令:

%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)

相关内容