如何在Python的subprocess.run中执行含$()的Linux命令?
解决方案
你的问题核心是subprocess默认不启用shell解析,所以$(...)被当成普通字符串传给了echo,没有执行命令替换。以下两种方法可以实现需求:
方法1:启用Shell解析
通过设置shell=True,让系统shell来解析命令中的特殊语法(比如命令替换$()),注意此时命令要写成字符串形式而非列表:
import subprocess proc = subprocess.run( 'echo "$(echo 1111dGUv+rG551123eFwBhCMde6BIS90c3AAAAA= | base64 -d)"', check=True, stdout=subprocess.PIPE, shell=True ) # 输出包含非UTF-8字符,用latin1解码避免报错 print(proc.stdout.decode('latin1'))
方法2:避免Shell,用Python直接处理(更安全)
直接在Python中完成base64解码,再调用echo或直接输出,这样可以避免Shell注入风险:
方式A:解码后传给echo
import base64 import subprocess # 先解码base64字符串 decoded_content = base64.b64decode('1111dGUv+rG551123eFwBhCMde6BIS90c3AAAAA=') # 调用echo输出解码结果,-n参数避免自动添加换行 proc = subprocess.run( ['echo', '-n', decoded_content], check=True, stdout=subprocess.PIPE ) print(proc.stdout.decode('latin1'))
方式B:直接在Python中输出(无需调用echo)
如果只是需要输出解码结果,完全不需要调用外部echo命令:
import base64 decoded_content = base64.b64decode('1111dGUv+rG551123eFwBhCMde6BIS90c3AAAAA=') print(decoded_content.decode('latin1'))
原代码失效原因
subprocess默认以无shell模式运行,此时命令列表中的每个元素会直接作为参数传递给echo程序,$(echo ... | base64 -d)不会被解析为命令替换,只是作为普通字符串输出。
内容的提问来源于stack exchange,提问作者armaka
相关产品推荐
相关产品推荐

