バックグラウンドでパスワード入力が必要なsudoコマンドを実行するにはどうすればよいですか?


29

最近、sudo認証キャッシュ機能を無効にしたため、毎回パスワードの入力を求められます。

そして、これはセキュリティには良いですが、解決策を見つけられなかったわずかな問題を引き起こしました。次のような行に沿ってコマンドを実行することはできません。

sudo <command> &

sudo以前はコマンドを実行していましたが、パスワードをキャッシュして、sudoプロンプトなしで次の数分間コマンドを実行できるようにしていたため、コマンドを実行できました。
しかし、事前にキャッシュがなく、新しいスレッドをすぐに開始sudoし、パスワードの入力を求められないため、今実行すると、この方法で実行できません。

そのため、そのsudo -i前に実行しない限り、この形式のコマンドを実行することはできず、かなり面倒になります。
だから私はこれを回避し、まだこの方法でプログラムとコマンドを実行する方法があるかどうか疑問に思っていましたか?

私はUbuntu GNOME 15.10をGNOME 3.18で実行しています。具体的には、この方法で実行したいプログラムetherapeはそれが違いを生む場合ですが、すべてのプログラムとコマンドでこのソリューションが機能することを本当に望んでいます。


3
@kossince &は実際には検索できません… sudo command in the background。これをに変更しています。
ムル

@muru人気のある検索エンジンに代わりに特殊文字を検索させることができる場合。:P
コス

回答:


56

sudoバックグラウンドで実行する代わりにsudo、コマンドをバックグラウンドで実行するように指示します。からman sudo

-b, --background
     Run the given command in the background.  Note that it is not
     possible to use shell job control to manipulate background
     processes started by sudo.  Most interactive commands will
     fail to work properly in background mode.

例えば:

sudo -b sleep 10

別の方法は、シェルを使用してコマンドを実行することです。

sudo sh -c 'sleep 10 &'

別のオプションでは、パスワードを取得するためのグラフィカルプログラムを指定し、sudoとにかくバックグラウンドに送信します。

-A, --askpass
     Normally, if sudo requires a password, it will read it from
     the user's terminal.  If the -A (askpass) option is
     specified, a (possibly graphical) helper program is executed
     to read the user's password and output the password to the
     standard output.  If the SUDO_ASKPASS environment variable is
     set, it specifies the path to the helper program.  Otherwise,
     if sudo.conf(5) contains a line specifying the askpass
     program, that value will be used.  For example:

         # Path to askpass helper program
         Path askpass /usr/X11R6/bin/ssh-askpass

     If no askpass program is available, sudo will exit with an
     error.

Askpassプログラムは通常、SSHに使用されます。そのようなものの1つはssh-askpass-gnome、少なくともUbuntu 15.10にデフォルトでインストールされるパッケージによって提供されます。

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &

11

設定できている喜んでいる場合timestamp_timeoutのように、少なくとも何かに0.02(1.2秒、私は同じように安全であると言うだろう0中)/etc/sudoers(お使いの場合には必要ですが、デフォルト設定でかとtimestamp_timeout何に設定されていますが、0一つは、単に次のことを行うことができます) 、でこのようなエイリアスを設定~/.bashrcできます。これにより、コマンドを実行する前に何かを行うことを覚えておく必要がなくなり、プロセスの制御を維持できます。

alias sudo='sudo -v; [ $? ] && sudo'

ここでのトリックはバッシュが解析ようになりますセミコロン、あるsudo -vユーザを認証、別途最初とし、電位バックグラウンド化の一部を制限する[ $? ] && sudoかどうかを確認するコマンド、sudo -v成功したと実行sudoそれがあった場合には(潜在的にそれをバックグラウンド化)再び。

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &

sudo -vキャッシングが無効になっている場合でも、資格情報のキャッシュを拡張しますか?また、IIRC <エイリアスを展開するには、スペースをコマンドの先頭ではなく末尾に配置する必要があります。
ムル

@muru RIGHT彼がtimestamp_timeout設定したことを忘れました0。そして、ええ、私はエイリアス拡張の事を完全に台無しにしました。実際、エイリアス拡張すべきではありません。ありがとう。
コス

alias sudo='sudo -v && sudo'同じくらい良くないでしょうか?
G-マンは「元に戻すモニカ言う

@ G-Manいいえ、これ;はBashがsudo -v最初に個別に解析するため、機能します。&&Bashを使用すると、すぐに両方が単一のコマンドとバックグラウンドの両方として解析されます。
コス

8

できません。&すぐ背景にコマンドを送信します。つまり、サブシェルがバックグラウンドで作成され、コマンドがそこで実行されます。そのコマンドがプロンプトを発行すると、の場合のようsudoに、プロンプトがバックグラウンドで表示され、表示されません。

それを回避する唯一の方法は、コマンドをフォアグラウンドに戻し、パスワードを提供してバックグラウンドに送り返すことです。例えば:

$ sudo command &
$ fg
sudo command
[sudo] password for terdon: 

次に、パスワードを入力し、ヒットEnterしてからヒットCtrlZして、パスワードをバックグラウンドに戻し、bg実行を継続するように伝えます。

より単純なアプローチは、決して使用せ&ず、代わりに、ジョブを起動した後、CtrlZまたは手動でバックグラウンドにジョブを送信bgすることです。

最後に、sudoのパスワードタイムアウトを1秒または2秒などに設定することを検討してください。これにより、十分なセキュリティが得られ(Flashから保護しようとしている場合を除く)、期待どおりにそのようなコマンドを実行できます。


フラッシュが私のチョコレートケーキを盗んでいるので... ; P

2
アドビの脆弱性とファームウェアに感染するマルウェアのこの時代では、Flashに注意することが必要です。
ダミアンジェリック16年


ちなみに、タイムアウトを実際に秒に設定することは可能ですか?man sudoers言うtimestamp_timeout値が(途中で作ることができ小数部分と分を指定しなければならないのsudo私がいないことを確認、なぜ、いずれかを指定しようとすると、エラーが出)。
コス

2
@kosはそうですね。2.5ここでは正常に動作します(Arch、sudoバージョン1.8.15)。
テルドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.