如何用cat命令使标准输入按回车终止以传递密码短语?
解决cat命令按回车键终止输入并保留原始密码短语的问题
问题分析
你当前使用cat > /tmp/namedpipe时,cat会持续读取标准输入直到收到EOF(终端中需按Ctrl+D)或被Ctrl+C中断,无法通过回车键终止输入。同时你需要完整保留密码短语的原始输入(包括首尾空格、制表符),用于共享给两个解锁脚本。
解决方案
方案1:单行read命令(与原逻辑一致,推荐)
将你原来的6行代码简化为一行,既保留原始输入、支持按回车终止,又能及时清空变量保证安全:
IFS= read -r passphrase && { printf -- '%s' "$passphrase" > /tmp/namedpipe & } && unset passphrase
IFS=:禁止read修剪首尾的空格、制表符read -r:不转义输入中的反斜杠,完全保留原始内容{ ... & }:将写入命名管道的操作放入后台,避免因管道无读取端导致进程阻塞unset passphrase:立即清空密码变量,降低泄露风险
方案2:cat结合head(更简洁,需注意换行符)
如果允许密码短语末尾包含换行符(即输入回车后的换行),可以用以下命令实现按回车终止输入:
cat | head -n1 > /tmp/namedpipe
head -n1:仅读取第一行输入,遇到回车就停止读取- 若不需要末尾的换行符,可追加处理去掉:
cat | head -n1 | sed '$s/\n$//' > /tmp/namedpipe
关键说明
- 避免使用
echo输出密码:echo会自动添加换行符,部分环境下还会转义特殊字符,破坏原始输入 - 命名管道特性:写入管道时若没有进程在读取,会阻塞当前进程,因此建议将写入操作放入后台(如方案1中的
&)
内容的提问来源于stack exchange,提问作者midnite
相关产品推荐
相关产品推荐

