Swift中通过Process调用printf/OpenSSL加密含!字符串的问题
处理含特殊字符(如!)的字符串OpenSSL加密问题
以下几种方法可以解决!等特殊字符导致的命令解析问题:
方法1:利用printf的%b格式符转义特殊字符
- 先将字符串中的
!替换为\!,再通过printf "%b"输出,这样能避免bash将!解析为历史命令扩展。 - 命令示例:
在Swift的Process中,只需先对目标字符串做替换处理,将每个printf "%b" "abc\!123" | openssl enc -base64 -e -aes-256-cbc -salt -pass pass:"passwordSalt"!转成\!,再作为参数传入printf即可。
方法2:使用echo的原生参数规避解析
- 使用
echo -n -E组合,-n确保输出无换行符,-E禁止转义特殊字符,直接输出原始字符串。 - 命令示例:
在Swift配置Process时,将echo -n -E "abc!123" | openssl enc -base64 -e -aes-256-cbc -salt -pass pass:"passwordSalt"echo的参数拆分为["-n", "-E", "abc!123"],Process会直接传递参数给命令,无需依赖shell引号,彻底避免插值问题。
方法3:直接向Process标准输入写入内容(推荐)
- 绕开
printf/echo和shell解析,在Swift中直接将字符串字节写入OpenSSL进程的标准输入:
这种方式无需处理任何字符转义,直接传递原始内容,完全避免shell的字符解析干扰。let process = Process() process.executableURL = URL(fileURLWithPath: "/usr/bin/openssl") process.arguments = ["enc", "-base64", "-e", "-aes-256-cbc", "-salt", "-pass", "pass:passwordSalt"] let inputPipe = Pipe() process.standardInput = inputPipe try process.run() guard let data = "abc!123".data(using: .utf8) else { return } inputPipe.fileHandleForWriting.write(data) inputPipe.fileHandleForWriting.closeFile() process.waitUntilExit()
内容的提问来源于stack exchange,提问作者Derek Dub
相关产品推荐
相关产品推荐

