如何在 Python 中传递包含正则表达式的参数?

Posted

技术标签:

【中文标题】如何在 Python 中传递包含正则表达式的参数?【英文标题】:How to pass argument that contains regular expression in Python? 【发布时间】:2020-10-10 01:26:51 【问题描述】:

我正在使用 python 的 argparse 模块从命令行获取参数并登录网站,例如:python app.py username password。但是,我意识到一些更复杂的密码可能包含正则表达式,例如“#”或“$”,而 args.password 最终会被 MacOS 终端忽略或修改:python app.py username #pa$$word

 parser = argparse.ArgumentParser()
 parser.add_argument("username", help="website account username", type=str)
 parser.add_argument("password", help="website account password", type=str)
 args = parser.parse_args()

如何避免这种行为而不必对这些 str 参数进行硬编码?

【问题讨论】:

无论如何,将密码放在参数列表中通常是个坏主意,因为其他进程(包括在其他用户名下运行)可以通过ps 命令或等效命令检查它们。 有什么更好更安全的选择? 通常的策略涉及以下任何一种:(1) 将它们放在一个文件中(适当保护)并传递文件名,(2) 将它们放在一个环境变量中(可以被其他运行的进程检查作为同一用户但不是其他用户),(3)交互式提示 无论如何,原始问题本质上是一个shell问题而不是python问题。 argparse 可以读取 python 进程的任何命令行参数,但是当从终端中运行的 shell 调用命令时,某些字符串可能需要引用或转义。但鉴于上述情况,这恐怕不是需要直接解决的问题。 知道了。嗯,谢谢你的帮助,我会听从你的建议的。 【参考方案1】:

你说的不是正则表达式。

进一步的问题不是python,而是你的shell。

你必须调用你的脚本

python app.py username '#pa$$word'

sys.argv[2] 将包含密码。

如果您的密码包含单引号 ('),则必须将其替换为三重单引号 '\'',其中第二个 '\ 为前缀

正如其他人已经说过的那样:

将密码作为命令行参数传递给脚本被认为是不好的做法,因为任何能够在同一台机器上输入ps 的人都会看到密码。

更常见的选择是,您

传递包含密码的文件名,并且该文件对组和其他人没有读取权限 传递包含密码的环境变量的名称或 通过标准输入将密码输入您的脚本。 提示输入密码。 (通常您尝试重新配置终端,使密码不会显示在终端上)

【讨论】:

谢谢,我选择设置环境变量,但我仍然在处理涉及“$”的情况。三重单引号提示很有帮助。但是,我认为 '#pa$$word' 示例中的 '#' 导致 python 脚本忽略了该变量,这就是为什么我一开始就将问题标记为 python 问题。 如果# 在shell 上被引用,它不会被shell 忽略对于python # 只是一个字符,如果它位于从文件读取的行中的变量中 仅在py 中如果不在字符串中,源代码# 将是注释的开头。最大的问题通常是从 shell 获取奇怪的字符串到你的 python 脚本。例如,我认为密码A'#B"$C 可以在shell 中引用为'A\'#B"$C',我花了一些时间才发现我必须使用'A'''#B"$C'。如果密码存储在具有严格读取权限的文件中,则不会出现这些问题 更正: 不是''',而是'\'',您必须输入才能替换单个代码。所以在上面的评论中:'A'\''#B"$C' 或者,'A'"'"'#B"$C'(但这并不是更漂亮)

以上是关于如何在 Python 中传递包含正则表达式的参数?的主要内容,如果未能解决你的问题,请参考以下文章

jmeter之上下文传递(正则表达式)

带有正则表达式的 Python lambda

正则表达式 Python 模式 [重复]

Python正则表达式:字符串不包含“jpg”,必须有“-”和小写

jmeter参数传递(正则jsonbeanshell)

如何将参数传递给正则表达式构造函数,并在 String.matchAll 方法中使用 [重复]