如何向同文件内的Bash脚本部分传递Python变量
Python变量传递给内嵌Bash脚本实现方法
首选:位置参数安全传参(无注入风险)
这种方式不需要做字符串拼接,不会因为参数带特殊字符导致脚本执行异常,只需要修改两处代码:
- 调整
subprocess.run的参数列表,将Python侧拿到的网卡名n作为Bash脚本的执行参数传入 - 移除Bash代码段里硬编码的
n=enp35s0,改为读取传入的位置参数赋值给n
修改后的完整核心代码如下:
#!/usr/bin/python3 import os import sys import subprocess import time n = sys.argv[1] print(n) def capture(): # bash -c 后的参数规则:第一个参数是脚本的$0(一般填shell名占位),后续参数对应$1、$2... subprocess.run(["pkexec", '/bin/bash', '-c', bash, "bash", n], check=True) bash = ''' set -x INTERVAL="1" # update interval in seconds # 读取传入的第一个位置参数,赋值给n n="$1" # 统计时长配置 start=1 end=8 # 配置统计运行时长,原注释标注单位为分钟 while [[ $start -le $end ]] do ((start = start + 1)) R1=`cat /sys/class/net/$n/statistics/rx_bytes` T1=`cat /sys/class/net/$n/statistics/tx_bytes` sleep $INTERVAL R2=`cat /sys/class/net/$n/statistics/rx_bytes` T2=`cat /sys/class/net/$n/statistics/tx_bytes` TBPS=`expr $T2 - $T1` RBPS=`expr $R2 - $R1` TKBPS=`expr $TBPS / 1024` RKBPS=`expr $RBPS / 1024` echo "TX $n: $TKBPS kB/s RX $n: $RKBPS kB/s" done ''' capture()
注:原Bash代码里echo输出用的是
$1,这里已经改成直接用$n,和前面的网卡路径引用保持一致,避免参数位置错乱。另外Bash段开头的shebang行在通过bash -c执行时不会生效,已经移除。
备选:字符串插值嵌入(仅可信输入场景使用)
如果能完全确定传入的网卡名是合法的系统设备名(仅包含字母、数字、下划线,无空格、引号等特殊字符),也可以直接用Python f-string把变量值嵌入Bash代码段,修改方式更简单:
- 把Bash字符串的定义改成f字符串(开头加
f) - 把Bash段里硬编码的
n=enp35s0改成n={n},直接把Python变量的值插入进去
# 仅核心修改部分展示 bash = f''' INTERVAL="1" # 直接嵌入Python变量n的值 n={n} # 后续原有Bash逻辑不需要改动 start=1 end=8 # ... 其余代码保持原样 '''
补充说明
- 优先选第一种位置参数传参的方式,兼容性、安全性更好,不会出现命令注入、特殊字符转义问题
- 原代码里用
expr做算术计算可以替换为Bash原生算术扩展$((计算式)),执行效率更高,比如TBPS=$((T2 - T1)),不修改也不影响原有功能。
内容的提问来源于stack exchange,提问作者user19127009
相关产品推荐
相关产品推荐

