シェルスクリプトからルートパスワードを安全に渡します。

シェルスクリプトからルートパスワードを安全に渡します。

私はいつもコンソールモードで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互換性のためにまだ存在し、ディストリビューションで使用される予定です。システムまたは突然現れる

システムVモード

    telinit 5

最新のSystemdシステムではtelinitにリダイレクトされるsystemctl

システムアプローチ

    systemctl isolate runlevel5.target

または

    systemctl isolate graphical.target

元の答え:
以前の非システムディストリビューション(RHEL / CentOS 6以下など)からコンソールモードからGUIに切り替える最も簡単な方法は、次のことです。telinit注文する。たとえば、RHEL / Centosディストリビューションでは、マルチユーザーテキストベースモードは実行レベル3、マルチユーザーGUIモードは実行レベル5です。コンソールからGUIモードに切り替える方法は次のとおりです。デフォルトではtelinitroot権限が必要です。パスワードなしで一般ユーザーとして実行するには、sudoersエントリを入力するか、telinit実行可能ファイルにsetuidフラグを設定する必要があります。このsudo方法はお客様のアカウントに制限される可能性があるため、優先されます。

答え4

に具体的に言及しているので、sudo次のことを守ってください。ザイルズの答え。しかし、あなたの質問のタイトルは単にプログラムのパスワードを取得することだけで、stdin最近同様の状況が発生しました。

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

これについていくつかの批判を受けることができますが、効果があります。

言い換えればbash、あなたも使用できます

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

関連情報