如何将Python变量传入bash命令?多命令场景实现方案问询
解决Python中向bash命令传入变量的问题
方法1:使用Python字符串格式化(注意转义和安全)
如果bash代码结构固定,可通过Python字符串格式化替换变量,但要确保context['nickname']是可信输入,避免命令注入风险。示例如下:
nickname = context['nickname'] bash_code = r''' echo "/common_home/{nickname} /tmp/back/{nickname} none bind 0 0" | sudo tee --append /etc/fstab sudo mkdir /tmp/{nickname} /tmp/back/{nickname} '''.format(nickname=nickname) subprocess.run(['bash', '-c', bash_code], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
也可使用f-string(若bash代码中无其他需转义的大括号):
nickname = context['nickname'] bash_code = f''' echo "/common_home/{nickname} /tmp/back/{nickname} none bind 0 0" | sudo tee --append /etc/fstab sudo mkdir /tmp/{nickname} /tmp/back/{nickname} ''' subprocess.run(['bash', '-c', bash_code], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
方法2:通过环境变量传递(更安全)
将Python变量存入环境变量,让bash脚本读取,能规避大部分命令注入问题,适合处理不可信输入:
import os import subprocess nickname = context['nickname'] env = os.environ.copy() env['NICKNAME'] = nickname bash_code = r''' echo "/common_home/$NICKNAME /tmp/back/$NICKNAME none bind 0 0" | sudo tee --append /etc/fstab sudo mkdir /tmp/$NICKNAME /tmp/back/$NICKNAME ''' # sudo默认会重置环境变量,需加-E参数保留自定义环境变量 subprocess.run(['sudo', '-E', 'bash', '-c', bash_code], env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
方法3:用Python替代部分bash命令(更可控)
无需把所有操作交给bash,比如目录创建可直接用Python实现,减少bash代码复杂度:
import os import subprocess nickname = context['nickname'] # 用Python创建目录,exist_ok=True避免已存在时报错 os.makedirs(f'/tmp/{nickname}', exist_ok=True) os.makedirs(f'/tmp/back/{nickname}', exist_ok=True) # 处理fstab写入操作 fstab_line = f"/common_home/{nickname} /tmp/back/{nickname} none bind 0 0\n" subprocess.run(['sudo', 'tee', '--append', '/etc/fstab'], input=fstab_line.encode(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
内容的提问来源于stack exchange,提问作者Durable Metal
相关产品推荐
相关产品推荐

