cshスクリプトの実行時にPythonにパスワードを入力させます
質問
Solaris 10でcshスクリプトを実行するpythonスクリプトを作成しています。cshスクリプトは、ユーザーにルートパスワードの入力を求めます(これは知っています)が、pythonスクリプトでプロンプトに応答する方法がわかりませんパスワード。これは可能ですか?以下は、cshスクリプトを実行するために使用しているものです。
import commands
commands.getoutput('server stop')
解決
pexpect モジュールをご覧ください。インタラクティブなプログラムを扱うように設計されていますが、これはあなたの場合のようです。
ああ、シェルまたはpythonスクリプトでルートのパスワードをハードエンコーディングすると、セキュリティホールになる可能性があることを覚えておいてください:D
他のヒント
サブプロセスを使用します。 Popen()を呼び出してプロセスを作成し、communicate()を使用してテキストを送信します。申し訳ありませんが、PIPEを含めるのを忘れました。
from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate('password')
パスワードを避けて、sudoやsudoersなどのスキームを試してください。他で言及されているPexpectは、標準ライブラリの一部ではありません。
import pexpect
child = pexpect.spawn('server stop')
child.expect_exact('Password:')
child.sendline('password')
print "Stopping the servers..."
index = child.expect_exact(['Server processes successfully stopped.', 'Server is not running...'], 60)
child.expect(pexpect.EOF)
トリックをやった!期待ルール!
proc = communicate()
に input =
を追加して、標準ライブラリを使用したい人のために実行します。
from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate(input='password')
パラメータとして渡すことができるはずです。次のようなもの:
commands.getoutput('server stop -p password')
これはうまく機能しているようです:
import popen2
(stdout, stdin) = popen2.popen2('server stop')
stdin.write("password")
しかし、まだ100%ではありません。 「パスワード」とはいえ、私がまだsuを取得している正しいパスワードです:cshスクリプトがsuでrootになろうとしているときに申し訳ありません。
Pythonスクリプトでパスワードの質問に答える必要を避けるために、スクリプトをルートとして実行します。この質問にはまだ回答がありませんが、今のところこの方法でやろうと思います。