在 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 telinit。若要以普通使用者身分執行且無需密碼,您需要輸入一個sudoers條目或在 telinit 執行檔上設定 setuid 標誌。該sudo方法是首選方法,因為它可以僅限於您的帳戶。

答案4

由於您具體指的是sudo,請堅持吉爾斯的回答。但是,由於您的問題標題只是關於獲取程式的密碼stdin,而我最近也遇到了類似的情況:

echo $(read -sp "Password: " password; echo $password) | yourcommand

我可能會因此受到一些批評,但它確實有效。

說到bash這裡,你可能還可以使用

yourcommand <$(read -sp "Password: " password; echo $password)

相關內容