在PyCharm与终端带参运行Python脚本时的API认证失败问题
解决终端传参时密码含$符号导致认证失败的问题
问题根源
你观察到的密码中$开头的部分丢失,本质是Bash(或其他类Unix shell)会将$开头的字符串视为环境变量名,尝试去替换成对应的变量值。如果这个变量不存在(比如$qTyqf没被定义过),shell就会把它替换成空字符串,导致最终传递给Python脚本的密码缺失了这部分内容,自然会触发API的"invalid login data"错误。
而PyCharm的运行/调试配置里传参正常,是因为PyCharm在处理参数时不会像终端shell那样解析特殊符号,直接把引号里的内容完整传递给了脚本。
解决办法
这里有几种可靠的解决方式,你可以根据场景选择:
1. 用单引号包裹密码参数
shell不会解析单引号内部的任何特殊字符(包括$、?、.这些),所以把密码放在单引号里就能完整传递:
python -m scriptname "abcde" 'abcde$qTyqf§abcde'
2. 对$符号进行转义
在每个$前面添加反斜杠\,告诉shell这是一个普通字符,不要当作变量解析:
python -m scriptname "abcde" "abcde\$qTyqf§abcde"
3. 从标准输入读取密码(更安全的方案)
命令行参数会被记录在shell的历史记录里,存在安全风险。更稳妥的方式是让脚本通过标准输入读取密码,比如使用Python的getpass模块,避免密码暴露在命令行中,同时也能避开shell解析的问题:
修改你的代码:
import requests import argparse import json import getpass # 导入getpass模块 URL = "some url" parser = argparse.ArgumentParser() parser.add_argument("username", help="Username") args = parser.parse_args() # 用getpass读取密码,避免命令行参数的问题 password = getpass.getpass("Please enter your password: ") def get_token(username, password): url = URL + "/auth" headers = {'Content-type': 'application/json'} params = { "username": username, "password": password } r = requests.post(url, json=params, headers=headers) return json.loads(r.content.decode('utf-8'))['data']['token'] token = get_token(args.username, password) print(token)
运行脚本时只需要输入用户名,然后在提示后输入密码即可:
python -m scriptname abcde
内容的提问来源于stack exchange,提问作者maria
相关产品推荐
相关产品推荐

