【问题标题】:sending password to command line tools向命令行工具发送密码
【发布时间】:2011-05-23 09:53:27
【问题描述】:

我正在编写一个 python 应用程序,它使用命令行实用程序(专有,因此无法修改)来完成其部分工作。问题是我必须将密码作为命令行参数传递给工具,任何执行“ps ax”的用户都可以轻松看到该工具。如何从 python(或 shell 脚本)中安全地将密码发送到命令行工具?

【问题讨论】:

  • 这在很大程度上取决于您要调用的工具如何接受密码。例如,ssh 从标准输入接受它,如果它是一个终端。

标签: python bash shell


【解决方案1】:

如果应用程序有一些交互模式,你可以使用类似pyexpect的东西。

如果它只接受命令行上的密码,那么应用程序被设计为容易受到“ps ax”的攻击,您希望如何克服最初的糟糕设计?它是专有的,投诉应该去有罪^H^H^H^H^H^H作者。

【讨论】:

    【解决方案2】:

    如果密码只在命令行上被接受,那你就很不走运了。您确定没有以其他方式发送密码的选项吗?如果您可以通过进程的stdin 发送它,您可以通过管道与其通信,并以这种方式安全地发送密码。

    【讨论】:

    • 我会调查一下,但我不确定是否可行。
    • 您确定通过管道将密码传递给程序是安全的吗?看看我的新问题stackoverflow.com/questions/6321353/…也许你可以在那里抓住一些要点。
    【解决方案3】:

    您可以通过使用加密的密码参数并传递加密的密码来获得更高的安全性,并且程序可以对其进行解密。至少不会有纯文本密码四处飘荡。当通过另一个进程启动一个进程并传递参数时,我使用了这种方法。不过,在您的情况下可能不可行。

    【讨论】:

      【解决方案4】:

      编写另一个python脚本,该脚本将使用getpass.getpass()从命令提示符接受密码并将其存储在变量中。然后使用以密码为参数的变量从脚本调用命令。

      【讨论】:

        【解决方案5】:

        您可以强制使用内联 shell 包装器,如下所示

        somecommand --password=$(echo "Enter Password: " >&2;read -s PASSWORD;echo $PASSWORD)
        

        密码条目将在执行之前填充命令

        密码不会出现在你的 shell 历史中

        但它会出现在你的“ps”输出中

        【讨论】:

        • 需要更多报价。 --password="$(...; echo "$PASSWORD")" 如果您不希望密码带有空格或可以被解释为 glob 表达式。 (最好使用printf '%s\n' "$PASSWORD" 而不是echo;否则-n 会消失,带有文字反斜杠的密码具有未定义的行为等)。
        【解决方案6】:

        这在 bash 中怎么样:

        command_asking_for_password < <(command_that_prints_a_password; printf "\r")
        

        【讨论】:

        • 更好地使用printf -- 当使用反斜杠给定格式字符串时echo 的行为 -- 或者就此而言,-n 参数 -- 是undefined by POSIX,并且不同的 shell 在实践中有所不同(ash 和 dash 的行为与具有默认配置的 bash 不同,这与启用了xpg_echo 标志的 bash 不同)。
        猜你喜欢
        • 2011-02-06
        • 1970-01-01
        • 2012-03-15
        • 1970-01-01
        • 2010-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多