web-dev-qa-db-ja.com

pythonスクリプト内でSudoユーザーに変更します

私は問題があります。ユーザーがSudoモードである必要がある操作を実行するために必要なソフトウェアを書いています。 'Sudo python filename.py'を実行することはオプションではありません。 pythonスクリプトを使用して途中でSudoに変更する方法はありますか?ユーザーはプログラムが次の方法で実行する必要があるSudoパスワードを知っているため、セキュリティは問題ではありません。

  1. 通常のユーザーとして実行中のプログラム
  2. ......操作の実行
  3. ユーザーがSudoパスワードを入力する
  4. ユーザーがSudoに変更されました
  5. sudo権限を必要とするサブプログラムが実行されます
  6. トリガー時でも(サブプログラムの終了)ユーザーは再び通常のユーザーになります
  7. ......操作の実行

私の問題はステップ3にあります。提案できるポインタやフレームワークがあれば、非常に役立ちます。

乾杯

クリス

24
Kraken18

TclとExpectに加えて、サブプロセスを使用して自分自身を向上させます。つまり、基本的には次のようになります。

Sudo.tcl

spawn Sudo
expect {
    "Password:" {
        send "password"
    }
}

Sudo.py

import subprocess
subprocess.call(['tclsh', 'Sudo.tcl'])

次にSudo.pyを実行します。

2
andrew

昇格された特権で実行するプログラムはできるだけ少なくすることをお勧めします。 subprocess.call()関数を介して、より多くの特権が必要な小さな部分を実行できます。

import subprocess
returncode = subprocess.call(["/usr/bin/Sudo", "/usr/bin/id"])
18
nealmcb

自分でSudoを作成しようとしないでください。

class NotSudo(Exception):
    pass

if os.getuid() != 0:
    raise NotSudo("This program is not run as Sudo or elevated this it will not work")
9
Jakob Bowyer

私は最近、システムインストールスクリプトの作成中にこの問題に対処しました。スーパーユーザー権限に切り替えるには、 'Sudo'でsubprocess.call()を使用しました。

_#!/usr/bin/python

import subprocess
import shlex
import getpass

print "This script was called by: " + getpass.getuser()

print "Now do something as 'root'..."
subprocess.call(shlex.split('Sudo id -nu'))

print "Now switch back to the calling user: " + getpass.getuser()
_

コマンドをshlex.split()で使用できるようにするには、subprocess.call()を使用する必要があることに注意してください。コマンドからの出力を使用する場合は、subprocess.check_output()を使用できます。この目的で使用できる 'sh'( http://amoffat.github.com/sh/ )というパッケージもあります。

5
Josh M

昇格された特権を必要とする必要な機能だけを別の実行可能ファイルにカプセル化できる場合は、実行可能ファイルのsetuidビットプログラムを使用して、ユーザーレベルから呼び出すことができますpythonスクリプト。

このように、setuid-executable内のアクティビティのみがrootとして実行されますが、これを実行するにはSudo、つまりroot権限は必要ありません。 setuid-executableの作成/変更のみにSudoが必要です。

Setuid実行可能プログラムがユーザー入力(パラメーターなど)を適切にサニタイズし、だまされてはいけないことにだまされないようにする(代理の問題の混乱)など、いくつかのセキュリティ上の影響があります。

ref: http://en.wikipedia.org/wiki/Setuid#setuid_on_executables

編集:setuidはコンパイルされた実行可能ファイル(バイナリ)でのみ機能し、解釈されたスクリプトでは機能しないため、コンパイルされたsetuidラッパーを使用する必要がある場合があります。

2
user42935
import subprocess
subprocess.check_output("Sudo -i -u " + str(username) + " ls -l", Shell=True).decode("utf-8").strip()
0
Juan Medina

Setuidを使用して、ユーザーuidを設定できます。しかし、明らかなセキュリティ上の理由から、これはrootである(またはプログラムにsuid root権限がある)場合にのみ可能です。これらは両方ともおそらく悪い考えです。

この場合、特定のプログラムを実行するには、Sudo権限が必要です。その場合は、代わりに「Sudo theprogram」をサブスクライブしてください。

0
Lennart Regebro