私は常にコンソールモードでGNU/Linuxラップトップを起動します。しかし、時々私はGUIモードを立ち上げる必要があります。常にrootパスワードを入力する必要があります。そこで、次のスクリプト「gogui.sh」を作成して/usr/bin
:
#!/bin/bash
echo "mypassword" | Sudo service lightdm start
誰かがファイルを読んでも、簡単に私のパスワードを見ることができるので、それは本当に愚かな考えです。
これの代替はありますか?
スクリプトでパスワードを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
いくつかのオプションがあり、そのうちの1つは、NOPASSWDフラグを指定したvisudo
を使用して特定のコマンドを追加することです。
%wheel ALL=(ALL) NOPASSWD: /path/to/myscript
cat /path/to/myscript
#!/bin/bash
service lightdm start
[〜#〜]編集[〜#〜]
Unityについて言及しているコメントでちょうど気づいたので、Ubuntuを実行しているようです。私の元の答えはSysVinitシステムに向けられていましたが、互換性のために telinit
のようなコマンドがまだ存在し、機能しますディストリビューションではSystemdまたはUpstartを使用します。
SysVウェイ
telinit 5
最新のSystemdシステムでは、 telinit
は systemctl
にリダイレクトされます。
Systemd way
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
メソッドは、アカウントのみに制限できるため、推奨される方法です。
古典的なUNIXの方法は、スクリプトを作成することです setuid :
$ Sudo chown root gogui.sh #not necessary if root is already the owner of the file
$ Sudo chmod u+s gogui.sh
これにより、ファイルに特別な許可ビットが設定されます。
$ ls -l gogui.sh
-rwsr-xr-x 1 root root [omitted] gogui.sh
(4番目の位置のs
ではなく、x
に注意してください。)
これを行うと、スクリプトを実行するたびに、スクリプトを実行するユーザーの権限ではなく、ファイルの所有者の権限で実行されます。
スクリプトgogui.sh
を単純化して、
/usr/sbin/service lightdm start
実行可能ファイルの明示的なパスを追加したことに注意してください(which service
と入力して見つけた)。これは、setuidファイルで必要です。そうしないと、service
にあるPATH
という最初のプログラムが実行されます。明示的なパスを忘れるとhugeのセキュリティ問題が発生します。これは、すべてのユーザーがPATH
変数を微調整し、root権限で任意のプログラムを実行できることを意味します。
必要に応じて、他のユーザーがchgrp some_group gogui.sh; chmod o-x gogui.sh
を使用してファイルを実行できないように制限することもできます。これにより、ファイルはsome_group
のメンバーに対してのみ実行可能になります。
特にSudo
を参照しているので、 Gillesの答え に固執します。ただし、質問のタイトルは単にプログラムのstdin
のパスワードを取得することに関するものであり、私も最近同様の状況にありました。
echo $(read -sp "Password: " password; echo $password) | yourcommand
私はおそらくそのためにいくらかバッシングを稼ぐでしょうが、それはうまくいきました。
bash
と言えば、おそらくここでも使用できます
yourcommand <$(read -sp "Password: " password; echo $password)