web-dev-qa-db-ja.com

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

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

そして、これはセキュリティには良いのですが、解決策を見つけられなかったわずかな問題を引き起こしました。

Sudo <command> &

過去にSudoコマンドを実行していた場合、パスワードをキャッシュして、今後数分間、プロンプトなしでSudoコマンドを実行できるようにしたため、実行できるようになりました。コマンド。
しかし、手元にキャッシュがなく、すぐに新しいスレッドを開始し、Sudoがパスワードの入力を求めないので、今実行すると、これで実行できません仕方。

したがって、Sudo -iを実行する前に、この形式のコマンドを実行することはできません。
だから、これを回避し、この方法でプログラムやコマンドを実行する方法があるのだろうかと思っていましたか?

Ubuntu GNOME 15.10をGNOME 3.18で実行しています。具体的には、この方法で実行したいプログラムはetherapeですが、それが違いを生む場合は、すべてのプログラムとコマンドで動作するようにしたいと思います。

29
user364819

バックグラウンドで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 &
55
muru

timestamp_timeoutを少なくとも0.02のようなもの(1.2秒、0と同じくらい安全)に設定する場合は、/etc/sudoers(必要に応じて、ただし、デフォルト設定またはtimestamp_timeout0 one以外に設定します)次のようにできます)、~/.bashrcにこのようなエイリアスを設定できます。これにより、コマンドを実行する前に何かを行うことを覚えておく必要がなくなり、プロセスの制御を維持できます。

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

ここでのトリックは、Bashが最初に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 &
11
kos

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

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

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

今、あなたのパスワードを入力して、ヒット Enter そして、ヒット CtrlZ バックグラウンドに送り返し、bgを実行して実行を継続するよう指示します。

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

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

8
terdon