シェルスクリプトでルートパスワードを安全に渡す

シェルスクリプトでルートパスワードを安全に渡す

私はいつも GNU/Linux ラップトップをコンソール モードで起動します。しかし、時々 GUI モードを起動する必要があります。その場合、常にルート パスワードの入力が必要です。そこで、次のスクリプト「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 セッションを開始します。追加の権限は必要ありません。

startxlightdm が使用するのと同じデフォルトのセッション タイプが選択されない可能性があるため、ウィンドウ マネージャーまたはデスクトップ環境を明示的に指定する必要がある場合があります。

startx -- gnome-session

答え2

いくつかのオプションがあり、その 1 つはvisudoNOPASSWD フラグを使用して特定のコマンドを追加することです。

%wheel ALL=(ALL) NOPASSWD: /path/to/myscript

cat /path/to/myscript
#!/bin/bash
service lightdm start

答え3

編集
コメントでUnityについて言及しているのに気づきました。どうやらUbuntuを使っているようですね。私の最初の回答はシスビニットシステムではなく、コマンドtelinit互換性のためにまだ存在しており、システムドまたはアップスタート

SysVの方法

    telinit 5

現代のSystemdシステムでは、telinitリダイレクト先systemctl

Systemdの方法

    systemctl isolate runlevel5.target

または

    systemctl isolate graphical.target

元の回答:
古い非Systemdディストリビューション(例えばRHEL/CentOS 6以前)では、コンソールモードからGUIに切り替える最も簡単な方法は、telinitコマンド。たとえば、RHEL/Centos ディストリビューションでは、マルチユーザー テキストベース モードは実行レベル 3、マルチユーザー GUI モードは実行レベル 5 です。コンソールから GUI モードへの切り替えは、次のように行います。デフォルトでは、ルート権限が必要です。パスワードなしで通常のユーザーとしてこれを実行するには、エントリまたは telinit 実行可能ファイルに setuid フラグを設定するtelinit必要があります。この方法は、自分のアカウントだけに制限できるため、推奨されるアプローチです。sudoerssudo

答え4

特に について言及しているのでsudoジルの答えただし、あなたの質問のタイトルは単にプログラムのパスワードを取得することに関するものでありstdin、私は最近同様の状況に遭遇しました。

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

おそらく批判されるだろうが、効果はあった。

といえばbash、おそらくそこでも使えるでしょう

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

関連情報