質問

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スクリプトでパスワードの質問に答える必要を避けるために、スクリプトをルートとして実行します。この質問にはまだ回答がありませんが、今のところこの方法でやろうと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top