Python调用curl触发Jenkins时含^&的密码处理问题求助
解决方案
方法1:使用subprocess.run替代os.system(推荐)
os.system会把命令交给系统shell解析,导致&(后台执行符号)、^(转义符)这类特殊字符被错误处理。改用subprocess.run并传递参数列表,能绕过shell解析,直接把参数传给curl进程,彻底解决特殊字符问题。
修改后的代码示例:
import subprocess import datetime import time def Start_Job(args): global job_start_date print("\n----------------- Run Command -----------------\n" + " ".join(args)) job_start_date = datetime.now() print("\n job_start_date = " + str(job_start_date) + "\n") try: # shell=False(默认值)直接传递参数列表,避免shell解析 result = subprocess.run(args, check=True) print("\n-------- Wait for 100 seconds ---------------------") time.sleep(100) except subprocess.CalledProcessError as e: print("Error in Start_Job [返回码:", e.returncode, ", 输出:", e.output, "]") except Exception as e: print("Error in Start_Job [" , str(e) , "]") # 将curl命令拆分为参数列表,每个参数作为独立元素 args = [ 'curl', '--insecure', '-u', 'admin:G^H&j8k9G^H&j8k9', 'https://expert_solution.net.plm.eds.com/job/Amar/job/WaitingTest/buildWithParameters?token=simdevops&Machine_Name=iltlvinteg6' ] Start_Job(args)
方法2:对密码进行shell转义(兼容os.system)
如果必须保留os.system,需要对密码里的shell特殊字符做转义处理:
- 针对bash等类Unix shell:
&转义为\&,^转义为\^ - 针对Windows cmd:
&转义为^&,^转义为^^
以bash为例,修改后的command:
command = 'curl --insecure -u admin:G\^H\&j8k9G\^H\&j8k9 "https://expert_solution.net.plm.eds.com/job/Amar/job/WaitingTest/buildWithParameters?token=simdevops&Machine_Name=iltlvinteg6"'
也可以用单引号包裹整个用户名密码(shell中单引号内的字符不会被解析):
command = 'curl --insecure -u \'admin:G^H&j8k9G^H&j8k9\' "https://expert_solution.net.plm.eds.com/job/Amar/job/WaitingTest/buildWithParameters?token=simdevops&Machine_Name=iltlvinteg6"'
为什么urllib.parse.quote无效?
urllib.parse.quote是用于URL编码的工具,但-u参数里的密码是curl用于HTTP基础认证的凭据,不属于URL的一部分,所以URL编码无法解决shell解析特殊字符的问题。
内容的提问来源于stack exchange,提问作者expert student
相关产品推荐
相关产品推荐

