当前位置: 首页 > news >正文

python shlex

python shlex

核心函数

  1. shlex.split(s, comments=False, posix=True)
  • 作用:将字符串按类似 Shell 的语法规则分割成参数列表,常用于安全处理命令行输入。
  • 参数说明:
    s(必需): 待分割的字符串(如 “ls -l ‘file name’”)。
    comments(默认 False): 是否保留注释(以 # 开头的内容)。
    posix(默认 True): 是否启用 POSIX 模式(正确处理引号和转义符)。
import shlex 
print(shlex.split("echo  'Hello World'"))  # 输出:['echo', 'Hello World']
print(shlex.split("ls  #注释", comments=True))  # 输出:['ls', '#注释']
  1. shlex.quote(s)
  • 作用:对字符串进行安全 Shell 转义,防止命令注入攻击。
    参数:
  • s: 需要转义的字符串(如包含空格或特殊字符的路径)。
filename = "file; rm -rf /"
safe_cmd = f"ls {shlex.quote(filename)}"   # 输出:ls 'file; rm -rf /'
  1. 举例
  • 场景:执行带有空格和引号的命令
import shlex 
import subprocess 
 
# 原始命令字符串(含空格文件名)
cmd_str = 'ls -l "my document.txt"' 
 
# 使用 shlex 安全分割 
args = shlex.split(cmd_str) 
print("分割后的参数列表:", args)  
# 输出: ['ls', '-l', 'my document.txt'] 
 
# 执行命令 
result = subprocess.run(args,  capture_output=True, text=True)
print("执行结果:", result.stdout) 
# 输出 -rw-r--r-- 1 user group 1024 Feb 19 21:00 my document.txt  
  • 场景:通过管道传递数据
cmd_str = 'echo "Hello | World" | grep "World"'
args = shlex.split(cmd_str) 
 
# 使用 shell=True 启用管道功能(需谨慎)
result = subprocess.run(args,  shell=True, capture_output=True, text=True)
print("分割后的参数列表:", args)  # 输出: ['echo', 'Hello | World', '|', 'grep', 'World']
print("执行结果:", result.stdout)   # 输出: Hello | World 
* 关键说明:
	* 若 shell=False(默认),管道符 | 会被视为普通字符导致失败
	* 此处 shell=True 仅为演示管道功能,实际建议用 subprocess.PIPE 替代 
  • 场景:执行含变量和引号的命令
cmd_str = 'python -c "import os; print(os.getenv(\'USER\'))"' 
args = shlex.split(cmd_str) 
 
# 执行并捕获输出 
result = subprocess.run(args,  capture_output=True, text=True)
print("分割后的参数列表:", args)
# 输出: ['python', '-c', 'import os; print(os.getenv(\'USER\'))'] 
 
print("用户环境变量值:", result.stdout.strip())   # 输出: admin 
  • 根据用户输入动态生成命令
user_input = 'file with spaces.log' 
cmd_str = f'grep "error" {shlex.quote(user_input)}'   # 自动添加引号 
args = shlex.split(cmd_str) 
 
print("安全分割后的命令:", args)  
# 输出: ['grep', 'error', 'file with spaces.log'] 
 
# 执行命令 
subprocess.run(args) 
  • 综合案例:执行复杂查找命令
cmd_str = 'find /logs -name "*.log" -exec grep -H "404" {} \;'
args = shlex.split(cmd_str) 
 
result = subprocess.run( 
    args, 
    stdout=subprocess.PIPE, 
    text=True,
    check=True 
)
print("找到的404错误日志:")
print(result.stdout) 
* 预期输出示例
* /logs/access.log:127.0.0.1  - [404] GET /missing-page 
* /logs/nginx/error.log:[404]  File not found: /old-link 
  • 总结
    • 安全分割:shlex.split() 可正确处理空格、引号等特殊字符 13
    • 避免命令注入:优先使用列表参数 + shell=False(默认)
    • 管道处理:需要管道功能时配合 shell=True,但需严格验证输入
    • 动态命令构建:使用 shlex.quote() 处理用户输入中的特殊字符

相关文章:

  • ROS2--动作通信
  • 代码随想录刷题day23|(字符串篇)54. 替换数字
  • 基于 LangChain 实现数据库问答机器人
  • CUDA Toolkit 历史版本 cuda安装
  • C++ Qt项目教程:WebServer网络测试工具
  • C++ Primer 构造函数再探
  • 深入HBase——数据结构与算法
  • POI pptx转图片
  • Python 库自制 Cross-correlation 算法(当采样点已经1 对 1 匹配)
  • 2025-2-19学习笔记 : this关键字,constructor结构体,class类
  • 洛谷 P2234 [HNOI2002] 营业额统计(详解)c++
  • 2025软件测试就业形势剖析:机遇与挑战交织
  • 深入探讨优先队列:原理、实现与应用
  • 用deepseek学大模型05逻辑回归
  • 力扣每日一题【算法学习day.129】
  • SpringBoot启动失败之application.yml缩进没写好
  • 学习kafka和flink
  • 从零搭建微服务项目Base(第7章——微服务网关模块基础实现)
  • 硬核技术组合!用 DeepSeek R1、Ollama、Docker、RAGFlow 打造专属本地知识库
  • zyNo.25
  • 中国-拉共体成员国重点领域合作共同行动计划(2025-2027)
  • 警方通报:某博主遭勒索后自杀系自导自演,已立案调查
  • 长三角议事厅·周报|从模速空间看上海街区化AI孵化模式
  • 行知读书会|换一个角度看见社会
  • 2025年上海好护士揭晓,上海护士五年增近两成达12.31万人
  • 民企老板被错羁212天续:申请国赔千万余元,要求恢复名誉赔礼道歉