【问题标题】:Make python enter password when running a csh script运行 csh 脚本时让 python 输入密码
【发布时间】:2010-09-18 20:28:37
【问题描述】:

我正在编写一个在 Solaris 10 中执行 csh 脚本的 python 脚本。csh 脚本提示用户输入 root 密码(我知道),但我不确定如何让 python 脚本回答提示密码。这可能吗?这是我用来执行 csh 脚本的内容:

import commands

commands.getoutput('server stop')

【问题讨论】:

标签: python scripting passwords root csh


【解决方案1】:

看看pexpect 模块。它旨在处理交互式程序,这似乎是您的情况。

哦,请记住,在 shell 或 python 脚本中硬编码 root 的密码可能是一个安全漏洞:D

【讨论】:

  • 是的,pexpect 是要走的路......我在这个帖子的底部发布了答案。
【解决方案2】:

使用subprocess。调用 Popen() 来创建您的进程并使用communicate() 向它发送文本。抱歉,忘记包含 PIPE..

from subprocess import Popen, PIPE

proc = Popen(['server', 'stop'], stdin=PIPE)

proc.communicate('password')

您最好避免使用密码并尝试像 sudo 和 sudoers 这样的方案。在别处提到的 Pexpect 不是标准库的一部分。

【讨论】:

  • 这似乎不起作用。不过我会继续调查 popen。
  • 我在使用您在此处推荐的 PIPE 时得到相同的响应。脚本以 Password: 提示符停止。
  • 我认为这行不通,因为 csh 脚本确实 exec su root -c "$cmd0 $*" 尝试 su 到 root。 su 将是与“服务器停止”脚本不同的进程。
【解决方案3】:
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)

成功了!期待规则!

【讨论】:

    【解决方案4】:

    proc.communicate() 中添加input= 使其运行,适合喜欢使用标准库的人。

    from subprocess import Popen, PIPE
    proc = Popen(['server', 'stop'], stdin=PIPE)
    proc.communicate(input='password')
    

    【讨论】:

      【解决方案5】:

      应该可以作为参数传递。类似:

      commands.getoutput('server stop -p password')
      

      【讨论】:

      • 我们的服务器停止脚本没有 -p 标志,也不太可能得到一个。
      【解决方案6】:

      这似乎效果更好:

      import popen2
      
      (stdout, stdin) = popen2.popen2('server stop')
      
      stdin.write("password")
      

      但这还不是 100%。即使“密码”是正确的密码,我仍然得到 su: sorry 当它试图 su 到 root 时从 csh 脚本返回。

      【讨论】:

      • 我认为你颠倒了标准输入和标准输出。
      • 不,来自API:返回文件对象(child_stdout,child_stdin)
      • 仅供参考——popen2 是“自 2.6 版起已弃用:此模块已过时。使用子进程模块。特别检查用子进程模块替换旧函数部分。”
      • 是的,我刚刚注意到了。我将代码切换回子流程模块。谢谢!
      • @darrick:我错误地引用了 os.popen2 而不是 popen2.popen2。奇怪的是,两个库的stdin和stdout的顺序是不一样的……
      【解决方案7】:

      为了避免在 python 脚本中回答密码问题,我将以 root 身份运行该脚本。这个问题仍然没有答案,但我想我现在就这样做。

      【讨论】:

      • 请你整理一下你的答案好吗?
      猜你喜欢
      • 2012-05-23
      • 2017-06-10
      • 2018-07-05
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      相关资源
      最近更新 更多