【问题标题】:pexpect.spawn('sudo ssh somehost') asks for sudo password every timepexpect.spawn('sudo ssh somehost') 每次都要求输入 sudo 密码
【发布时间】:2013-05-15 14:02:21
【问题描述】:

我有一系列 bash 脚本,它们依赖于 sudo 来 ssh/scp 一些具有 root 权限的主机。

所以我制作了一个 python 脚本 sshOK,它使用 pexpect 来处理 ssh 主机的所有细节,例如回答是以存储密钥并在主机可用于 ssh 时返回 true 和所有没问题。

但是,每次在 python pexpect.spawn 中使用 sudo 都会要求我输入密码,而不是在 bash 脚本中调用 sudo 时每五分钟一次。

有什么方法可以调用

child=pexpect.spawn('sudo ssh somehost', Pty=get_parent_pty())

或在我的 python 脚本 sshOK 中的类似内容,它使我正在运行的 shell sshOK 记住该自动化?根据我对sudo RTFM 的了解,pexpect 调用需要共享pseudo terminal 以继承凭据或类似的东西。期望的行为是:

[foo@bar bin]$ sshOK somehost
[sudo] password for foo:
Try ssh            on somehost   testing connection              [--OK--]
[foo@bar bin]$ sshOK somehost
Try ssh            on somehost   testing connection              [--OK--]
[foo@bar bin]$

而不是

[foo@bar bin]$ sshOK somehost
[sudo] password for foo:
Try ssh            on somehost   testing connection              [--OK--]
[foo@bar bin]$ sshOK somehost
[sudo] password for foo:
Try ssh            on somehost   testing connection              [--OK--]
[foo@bar bin]$

我们的目标是稍后用更多的 python 和 pexpect 替换 bash 脚本,但现在的障碍是能够多次调用同一个脚本,而不必输入密码和恶心。

另一种方法是将使用 pexpect 的部分提取到单独的脚本中,将该脚本添加到 sudoers 并让整个脚本运行提升。不能为每个用户添加 ssh 密钥。

【问题讨论】:

  • 为你改了:)
  • err... 真正的问题是为什么在运行 ssh 时首先需要调用 sudo?而是将当前用户的 ssh 密钥放入远程的 authorized_keys 文件中?
  • 您可能希望避免在大量客户端上向 authorized_keys 添加多个公钥。一种替代方法是使用共享身份文件与 ssh -i 一起使用,但有些人可能会认为该文件一旦被多个用户读取就会受到损害。我们选择只允许少数用户 sudo 访问 ssh 和 scp。这样,我们可以通过将一个用户名添加到跳板计算机上的一个组来授予访问权限。如果您使用 cfengine 或 puppet 来管理状态,或者有一些其他的同步授权密钥的智能方法可以作为一个不错的选择。
  • 你也可以让他们sudo ssh 不需要密码。
  • 如果我们没有一次要求输入密码,OSI 协议的政治和法律层面就会出现问题。抱歉,我说“不,那是几百台计算机,您作为 root 可以访问可能敏感的文件,我们必须至少付出一半的努力来确保您是我们中的一员”;)

标签: python sudo pexpect


【解决方案1】:

看来正确答案是……

没有

所有的通信都发生在独立且完全不相交的 [pt]ty 中。凭证无法传输,pexpect 创建的 pty 无法链接到运行脚本的 tty。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多