1つのコマンドラインでパスワード付きのsudo?


115

忙しい日に走りたい

$ ./configure && make && sudo make install && halt

夜間に就寝すると、アプリケーションが自動的にインストールされることを期待しています。しかし、次の日に表示されるのは、sudoがパスワードを尋ねる画面です。それでは、1つのコマンドラインでパスワードを使用してsudoを実行するにはどうすればよいでしょうか、またはこれを行う他の方法はありますか?


haltルートとして実行する必要があります。
キーストンプソン

1
しないsudo15分のタイムアウトがありますか?sudo lsパスワードを入力してから、上記のコマンドを実行して、sudo特権を有効にしたまま、実行することはできませんか?(現時点ではこれをテストできません。そうでない場合は、回答として投稿します。)
マット

1
タイムアウトsudoは設定可能です。セキュリティに敏感な人(私のようなパラノイア)はゼロに設定します... :
dda

回答:


173

はい、-SSTDINからパスワードを読み取るスイッチを使用します。

$echo <password> | sudo -S <command>

したがって、あなたの場合は次のようになります。

$./configure && make && echo <password> | sudo -S make install && halt

もちろん、<password>パスワードに置き換えてください。


42
明らかに、他の誰かがシェル履歴でパスワードを見る危険がある場合、これを実行したくないでしょう。
ブレットダニエル

リモートホストで特権コマンドを実行する簡単な方法を探しています。これは感謝です。
nelaaro

13
'echo <password> |を使用することにした場合 sudo -S 'オプションは、コマンド履歴にパスワードが公開されないように、スペース文字でコマンドを開始します。もちろん、最適なオプションは、安全なファイルからパスワードをパイプすることです。
シャノンハワース

あなたは、あなたが$変数にパスワードを持っている場合(あなたが例えばのSOPとの規定を持っている可能性があること)を使用することをお勧めします
Natim

9年後、まだ魅力のように動作します:)
WinEunuuchs2Unix

10

コマンドラインを次のように置き換えることができます。

$sudo su

$./configure && make && make install && halt

すぐにパスワードの入力を求められます。その後、残りのコマンドはスーパーユーザーとして実行されます。


8
これの代替(そしておそらくおそらく)バージョン:sudo sh -c "./configure && make && make install && halt"
偽物のキホーテ2009年

2
しかし、生成されたすべてのコンパイルファイルにスーパーユーザーのアクセス許可がないのですか?これにより、後で通常のユーザーとして./configure && makeを実行できなくなります。
user45909

はい、user45909、あなたはまったく正しいです。とにかく、メインパッケージの更新をダウンロードした後を除いて、個人的に./configure && makeを再実行したことはありませんが、おそらく典型的ではありません。
CarlF

10

他のソリューションのいくつかは、彼らが不必要に実行不利持っ./configuremakeルートなどを。

これは少し複雑ですが、動作するはずです:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

$USER(非ルート)シェルで展開できるように二重引用符を使用していることに注意してください。

コマンドのsleep 60前にaを追加することもできhaltます。コマンドが長時間実行されることを期待して、時々このようなことをしましたが、何かがうまくいかず、すぐに終了します。これsleepにより、システムがシャットダウンする前にコマンドを強制終了できます。またはshutdown、時間引数とともに使用できます。


9

また、sudoを構成しvisudoて、ユーザーがmakeをパスワードなしでsudoとして使用できるようにすることもできます。

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS

9

HISTIGNOREを「sudo -S」に設定します

$ export HISTIGNORE='*sudo -S*'

次に、パスワードを安全にsudoに渡します。

$ echo "your_password" | sudo -S -k <command>

「履歴」は、このコマンドを履歴に保存しないことを意味します。これは、メモリまたは「〜/ .bash_history」ファイルの履歴です。

たとえば、以下は、パスワードの履歴を保持せずに、パスワードをsudoコマンドに安全にパイプします。

「-S」は、パスワードにstdinを使用することを意味し、

「-k」は、キャッシュされた資格情報を無視して、sudoに常に要求することを意味します。これは一貫した動作のためです。

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

上記の方法の欠点は、後で履歴で実行したコマンドを表示したい場合、それらが表示されないことです。別の方法は、sudo認証資格情報キャッシュを更新し(デフォルトでは5分のタイムアウトで有効になっています)、sudoを個別に実行します。ただし、これの欠点は、5分間のキャッシュに注意する必要があることです。

例えば:

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

注各コマンドの前にsudoを実行して、デフォルトが5分であるため、sudoキャッシュが更新されることを確認しました。はい、whoamiは5分はかからないはずですが、一貫性を保つために各コマンドの前に実行することも考えられます。「export HISTIGNORE =」sudo -Sと入力することもできます〜/ .bashrcファイルに「」を追加し、「。」でロードします。〜/ .bashrc "またはlogoff then login。ただし、スクリプトの目的でこれを使用することを考えているので、最高のセキュリティプラクティスのためにすべてのスクリプトの先頭に配置します。代わりに変数にsudo -S -v "を使用するのも良い考えです。ルート権限が必要な各コマンドの前に変数を実行します。Janarのコメントを参照してください。「John T」のコメントには「-k」パラメータも含める必要があります、「-k」なしで「sudo -S」を実行し、sudo認証キャッシュにすでに資格情報があり(まだ有効で、デフォルトのsudo認証キャッシュは5分)、bashはパスワードをコマンドとして実行します悪い。


1
履歴にないものを作成するための小さなメモのように、コマンドの前に1つのスペースを置いてコマンドを実行します。何らかの理由で、これにより履歴は無視します。
マットフレッチャー

4

注:sudoの古いバージョン、具体的には「Sudoバージョン1.6.7p5」ではメソッドが機能しないことがわかりました。

$ echo "<your_password>" | sudo -S -k whoami

このメソッドが古いバージョンと新しいバージョンで機能する場合、sudo:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami

これは元の質問に対する答えではありません。投稿者に批評または説明を依頼するには、投稿の下にコメントを残します-自分の投稿にいつでもコメントできます。評価が十分になったら、投稿にコメントできます。
DavidPostill

@Darren DeHaven:ここで尋ねられた質問の答えになる方法を説明していただけますか?
Renju Chandran chingath 14


2

もっと注意したい場合は、スクリプトを作成し、rootのみが読み取りと編集を行えるようにファイルの権限を変更してから、実行するだけです。

例:
1)ファイルを作成します:

gedit ~/.easy.install  

2)これを貼り付けて保存します。

./configure && make && echo <password> | sudo -S make install && halt  

3)実行可能にする:

sudo chmod +x ~/.easy.install  

4)ファイルのアクセス権を変更して、rootのみがそれを読み取って編集できるようにします。

sudo chmod 700 ~/.easy.install  

5)実行:

~/.easy.install  

楽しい ;-)


echo <password>は引き続きプロセスリストに表示され、誰かが正確なタイミングでps auxでラッキーになった場合、クリアテキストでパスワードを見ることができます。パスワードをファイルに保存し、<を使用してファイルからsudoにリダイレクトすることをお勧めします。
ボブポール

1

そのようなsudoのセットアップは、sudoがアカウントにパスワードを必要としないという事実を誰かが偶然見つけた場合に危険です。何をしているのかわからない限り、それをしないでください。地元のA +トレーニングプログラムで、実験用コンピューターを使用して何度も繰り返してしまった... -_-

ジョンT.が言ったことは、シェル履歴でパスワードを見つけるリスクがまだあることを除いて、良いように聞こえます。CarlFの発言は良く聞こえますが、1つのコマンドが失敗しても、コンピューターはスーパーユーザー特権で実行されます。


0

個人的には、ジョンTが2009年11月9日に2:47で答えたのと同じことをします。彼の答えのガイダンスに従って、私のものも改善しました。

違いは、次のような変数を使用する傾向があることです。

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

そのようにして、sudoの代わりにmine変数を簡単に使用できます。

$AutoSuDo apt-get update;

これは、いくつかの長いスクリプトで非常に便利です。私はこれらを主に他の人のパソコンに利用しています。

私も注意を払うことをお勧めします:

  • 2011年4月19日23:56にデスグア回答
  • user224306は、13年5月14日17:38にコメントし、John Tは09年11月9日2:47に回答します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.