You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中通过Process调用printf/OpenSSL加密含!字符串的问题

处理含特殊字符(如!)的字符串OpenSSL加密问题

以下几种方法可以解决!等特殊字符导致的命令解析问题:

方法1:利用printf的%b格式符转义特殊字符

  • 先将字符串中的!替换为\!,再通过printf "%b"输出,这样能避免bash将!解析为历史命令扩展。
  • 命令示例:
    printf "%b" "abc\!123" | openssl enc -base64 -e -aes-256-cbc -salt -pass pass:"passwordSalt"
    
    在Swift的Process中,只需先对目标字符串做替换处理,将每个!转成\!,再作为参数传入printf即可。

方法2:使用echo的原生参数规避解析

  • 使用echo -n -E组合,-n确保输出无换行符,-E禁止转义特殊字符,直接输出原始字符串。
  • 命令示例:
    echo -n -E "abc!123" | openssl enc -base64 -e -aes-256-cbc -salt -pass pass:"passwordSalt"
    
    在Swift配置Process时,将echo的参数拆分为["-n", "-E", "abc!123"],Process会直接传递参数给命令,无需依赖shell引号,彻底避免插值问题。

方法3:直接向Process标准输入写入内容(推荐)

  • 绕开printf/echo和shell解析,在Swift中直接将字符串字节写入OpenSSL进程的标准输入:
    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()
    
    这种方式无需处理任何字符转义,直接传递原始内容,完全避免shell的字符解析干扰。

内容的提问来源于stack exchange,提问作者Derek Dub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:55:17