含引号及特殊字符的文件管道传入OpenSSL的Bash脚本问题求助
解决Bash脚本中echo处理特殊字符失效的问题
嘿,这个问题我之前也碰到过!根源在于echo命令会自动解析一些特殊字符(比如转义符、引号),导致你的原始内容被篡改后才传给openssl。咱们只需要做两个小修改就能彻底解决:
关键修改点
- 给
read添加-r选项:默认情况下read会把行内的反斜杠当作转义符处理,导致原始内容丢失。-r选项会禁用这种行为,完整保留输入行的所有字符。 - 用
printf替代echo输出内容:echo会解析转义序列(比如\n、\t)并对引号做特殊处理,而printf "%s\n" "$line"会严格按照原始内容输出,不会做任何额外解析。
修改后的完整脚本
#!/bin/bash printf "What is your encryption password?\n" read -s password </dev/tty while read -r line; do printf "%s\n" "$line" | openssl enc -aes-256-cbc -base64 -pass pass:"$password" -e; done > >(openssl s_client -quiet -connect localhost:3001)
为什么这样有效?
举个例子,假设输入文件里有这样一行内容:
He said "Hello!" and waved \ goodbye!
- 原来的
echo "$line"会把末尾的\吃掉,输出变成He said "Hello!" and waved goodbye!(注意反斜杠消失了)。 - 修改后的
printf "%s\n" "$line"会完整输出原始内容,反斜杠和引号都被保留,openssl就能正确加密你想要的内容。
另外,别忘了给pass pass:"$password"里的$password加上引号,这样如果你的密码里包含空格或特殊字符,shell也不会错误解析。
内容的提问来源于stack exchange,提问作者Etalam
相关产品推荐
相关产品推荐

