You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:10:13