سؤال

أنا أكتب برنامج نصي Python يقوم بتنفيذ برنامج نصي CSH في Solaris 10. يطالب البرنامج النصي CSH المستخدم بكلمة مرور الجذر (التي أعرفها) لكنني لست متأكدًا من كيفية جعل البرنامج النصي Python يجيب على الموجه باستخدام كلمة المرور. هل هذا ممكن؟ إليك ما أستخدمه لتنفيذ البرنامج النصي CSH:

import commands

commands.getoutput('server stop')
هل كانت مفيدة؟

المحلول

ألق نظرة على Pexpect وحدة. إنه مصمم للتعامل مع البرامج التفاعلية ، والتي يبدو أنها حالتك.

أوه ، وتذكر أن كلمة مرور الجذر الصلبة في نص قذيفة أو بيثون من المحتمل أن تكون ثقب أمان: د

نصائح أخرى

يستخدم عملية فرعية. استدعاء popen () لإنشاء عمليتك واستخدام Communicate () لإرسال نص. آسف ، نسيت أن تتضمن الأنبوب ..

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)

هل الحيلة! قواعد Pexpect!

يضيف input= في proc.communicate() اجعلها تعمل ، للرجال الذين يحبون استخدام LIB القياسي.

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 ٪ بعد. على الرغم من أن "كلمة المرور" هي كلمة المرور الصحيحة التي ما زلت أحصل عليها: آسف مرة أخرى من البرنامج النصي CSH عندما تحاول أن تتجذر.

لتجنب الاضطرار إلى الإجابة على سؤال كلمة المرور في البرنامج النصي Python ، سأقوم فقط بتشغيل البرنامج النصي كجذر. لا يزال هذا السؤال بدون إجابة ، لكنني أعتقد أنني سأفعل ذلك بهذه الطريقة الآن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top