私は問題があります。ユーザーがSudoモードである必要がある操作を実行するために必要なソフトウェアを書いています。 'Sudo python filename.py'を実行することはオプションではありません。 pythonスクリプトを使用して途中でSudoに変更する方法はありますか?ユーザーはプログラムが次の方法で実行する必要があるSudoパスワードを知っているため、セキュリティは問題ではありません。
私の問題はステップ3にあります。提案できるポインタやフレームワークがあれば、非常に役立ちます。
乾杯
クリス
TclとExpectに加えて、サブプロセスを使用して自分自身を向上させます。つまり、基本的には次のようになります。
Sudo.tcl
spawn Sudo
expect {
"Password:" {
send "password"
}
}
Sudo.py
import subprocess
subprocess.call(['tclsh', 'Sudo.tcl'])
次にSudo.pyを実行します。
昇格された特権で実行するプログラムはできるだけ少なくすることをお勧めします。 subprocess.call()
関数を介して、より多くの特権が必要な小さな部分を実行できます。
import subprocess
returncode = subprocess.call(["/usr/bin/Sudo", "/usr/bin/id"])
自分で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")
私は最近、システムインストールスクリプトの作成中にこの問題に対処しました。スーパーユーザー権限に切り替えるには、 '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/ )というパッケージもあります。
昇格された特権を必要とする必要な機能だけを別の実行可能ファイルにカプセル化できる場合は、実行可能ファイルのsetuidビットプログラムを使用して、ユーザーレベルから呼び出すことができますpythonスクリプト。
このように、setuid-executable内のアクティビティのみがrootとして実行されますが、これを実行するにはSudo、つまりroot権限は必要ありません。 setuid-executableの作成/変更のみにSudoが必要です。
Setuid実行可能プログラムがユーザー入力(パラメーターなど)を適切にサニタイズし、だまされてはいけないことにだまされないようにする(代理の問題の混乱)など、いくつかのセキュリティ上の影響があります。
ref: http://en.wikipedia.org/wiki/Setuid#setuid_on_executables
編集:setuidはコンパイルされた実行可能ファイル(バイナリ)でのみ機能し、解釈されたスクリプトでは機能しないため、コンパイルされたsetuidラッパーを使用する必要がある場合があります。
import subprocess
subprocess.check_output("Sudo -i -u " + str(username) + " ls -l", Shell=True).decode("utf-8").strip()
Setuidを使用して、ユーザーuidを設定できます。しかし、明らかなセキュリティ上の理由から、これはrootである(またはプログラムにsuid root権限がある)場合にのみ可能です。これらは両方ともおそらく悪い考えです。
この場合、特定のプログラムを実行するには、Sudo権限が必要です。その場合は、代わりに「Sudo theprogram」をサブスクライブしてください。