如何将Linux Bash命令行输入/输出记录至文本文件?含Python脚本方案
记录Linux Bash输入输出的两种实现方案
嘿,这个需求我太熟了!不管是想记录整个命令行会话,还是单个命令的输入输出,都有靠谱的办法,分Bash原生工具和Python脚本两种场景给你讲清楚:
一、Bash 原生命令行记录方法
1. 用 script 记录完整会话
这是最直接的方式,专门用来捕获整个命令行交互过程的输入和输出:
- 启动记录:直接在终端输入
script my_session.log,之后你在终端的所有操作(输入的命令、输出的结果)都会自动写入my_session.log文件 - 停止记录:按下
Ctrl+D或者输入exit即可结束会话,记录自动保存 - 进阶用法:
- 追加模式:如果不想覆盖已有日志,用
script -a my_session.log,新的会话内容会追加到文件末尾 - 记录时间戳:加上
-t参数可以把每个操作的时间戳单独存到另一个文件,比如script -t 2>timestamps.log my_session.log,之后用scriptreplay timestamps.log my_session.log还能回放整个会话
- 追加模式:如果不想覆盖已有日志,用
2. 重定向单个命令的输出
如果只是想记录某一个命令的结果,不用完整会话,可以用重定向:
- 只记录标准输出:
ls -l > output.log(会覆盖原有文件) - 同时记录标准输出和错误:
ls -l &> output.log或者ls -l 2>&1 > output.log - 同时在屏幕显示并写入文件:用
tee命令,比如ls -l | tee output.log,追加模式加-a参数:ls -l | tee -a output.log
二、Python 脚本实现方案
如果需要更灵活的控制(比如自定义记录格式、结合其他逻辑),可以用Python脚本实现:
1. 记录单个外部命令的输入输出
用 subprocess 模块捕获命令的执行结果,然后写入文件:
import subprocess # 定义要执行的命令 target_cmd = "ls -l /home" # 执行命令并捕获输出和错误信息 cmd_result = subprocess.run( target_cmd, shell=True, capture_output=True, text=True # 让输出以字符串形式返回,而非字节 ) # 将结果写入日志文件 with open("single_cmd_log.log", "w", encoding="utf-8") as log_f: log_f.write(f"执行命令: {target_cmd}\n\n") log_f.write("命令输出:\n") log_f.write(cmd_result.stdout) if cmd_result.stderr: log_f.write("\n命令错误信息:\n") log_f.write(cmd_result.stderr) print("命令执行结果已保存到 single_cmd_log.log")
2. 模拟交互式命令行并记录会话
这个脚本可以实现类似 script 命令的功能,同时支持自定义日志格式:
import subprocess import sys # 日志文件路径 session_log = "python_session.log" # 启动bash交互式进程 bash_process = subprocess.Popen( ["bash"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, # 将错误输出合并到标准输出 text=True, bufsize=1, universal_newlines=True ) print("=== 交互式会话已启动,输入'exit'结束 ===") with open(session_log, "a", encoding="utf-8") as log_f: while True: # 获取用户输入的命令 user_input = input("$ ") # 输入exit则退出会话 if user_input.strip() == "exit": bash_process.stdin.write("exit\n") bash_process.stdin.flush() break # 将用户输入写入日志 log_f.write(f"[输入] $ {user_input}\n") # 把命令发送给bash进程 bash_process.stdin.write(f"{user_input}\n") bash_process.stdin.flush() # 读取命令执行的输出 output_lines = [] while True: line = bash_process.stdout.readline() if not line: break output_lines.append(line) output_content = "".join(output_lines) # 在终端显示输出 print(output_content, end="") # 将输出写入日志 log_f.write(f"[输出]\n{output_content}\n") # 等待bash进程结束 bash_process.wait() print(f"\n=== 会话结束,日志已保存到 {session_log} ===")
内容的提问来源于stack exchange,提问作者Todd Jarolimek
相关产品推荐
相关产品推荐

