如何在 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 中传递包含正则表达式的参数?的主要内容,如果未能解决你的问题,请参考以下文章