如何让tee命令记录用户对程序提示符的输入内容?
解决交互式命令日志缺失用户输入的问题
当运行openssl req这类需要用户交互输入的命令时,直接用管道| tee只能捕获程序输出的提示符,无法记录用户输入内容——原因是tee默认只捕获标准输出(stdout),而用户输入是通过**标准输入(stdin)**传入的,不会被管道捕获。下面是几种可行的解决方案:
方法1:使用script命令(最简便)
script是专门用来记录终端会话的工具,能完整捕获包括用户输入、程序输出在内的所有交互内容:
script -a openssl-req.log # 之后在新的会话中运行你的命令 openssl req [your options] # 完成后按Ctrl+D退出script会话
执行后openssl-req.log会包含所有终端交互内容,包括你输入的每一行和程序的响应。
方法2:手动关联标准输入与输出
如果不想用script,可以通过管道将用户输入同步写入日志,需要用到文件描述符配合tee:
# 创建临时管道文件 mkfifo input_fifo # 后台读取管道内容并追加到日志 cat input_fifo | tee -a openssl-req.log & # 运行命令,同时将用户输入发送到管道和程序 openssl req [your options] < input_fifo | tee -a openssl-req.log # 清理临时管道 rm input_fifo
注意:这种方式会明文记录所有输入内容,若涉及敏感信息(如密码)需谨慎使用。
方法3:使用expect脚本(适合自动化场景)
如果需要自动化执行并记录完整交互流程,可编写expect脚本控制命令并记录日志:
#!/usr/bin/expect -f log_file -a openssl-req.log # 启动openssl命令 spawn openssl req [your options] # 模拟用户输入,需根据实际提示符调整 expect "Country Name (2 letter code) \[AU]:" send "CN\r" expect "State or Province Name (full name) \[Some-State]:" send "Beijing\r" # 继续添加其他交互步骤... expect eof
保存为record_openssl.exp,赋予执行权限后运行:
chmod +x record_openssl.exp ./record_openssl.exp
这种方式适合批量处理或预先定义输入的场景,日志会完整包含所有交互细节。
内容的提问来源于stack exchange,提问作者Underhill
相关产品推荐
相关产品推荐

