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

Java程序如何正确接收命令行参数中包含\n的SSH私钥字符串?

问题根因

你猜测的Bash转义问题完全正确。Bash中单引号包裹的字符串不会处理任何转义序列,你在启动命令中写的\n会被当成字面量的\+n两个字符传入Java,而非真实的换行符。你观察到println输出的内容和预期一致,是终端渲染时将字面量\n识别为换行提示,实际Java内存中存储的字符串没有正确的换行分隔符,因此JSch无法解析私钥格式。

调试验证方法

你可以通过打印字符ASCII码的方式确认转义问题:

// 拿到prvKeyData后执行以下代码
for (char c : prvKeyData.toCharArray()) {
    System.out.printf("字符: '%c', ASCII码: %d%n", c, (int)c);
}

如果输出中存在ASCII码为92的\字符,且后一位是ASCII码为110的n字符,即可确认是转义未生效的问题。

解决方案

有两类解决方式,按需选择即可:

Java侧适配(无需修改启动命令)

将传入字符串中的字面量\n替换为真实换行符后再传入JSch:

protected JSch createDefaultJSch(FS fs) throws JSchException {
    String prvKeyData = Main.getPrvKeyData();
    // 新增转义替换逻辑
    prvKeyData = prvKeyData.replace("\\n", "\n");
    JSch jSch = super.createDefaultJSch(fs);
    jSch.addIdentity("monitoring-configs", prvKeyData.getBytes(), null, "passphrase".getBytes());
    return jSch;
}

命令行侧适配(无需修改Java代码)

修改启动命令,让Bash传入的私钥自带真实换行符:

  • 使用Bash的ANSI-C引用格式$'',自动解析\n为换行符:
./myProgram --prvKey $'-----BEGIN RSA PRIVATE KEY-----\nxxx\n-----END RSA PRIVATE KEY-----\n'
  • 直接在单引号中输入换行,无需写\n:
./myProgram --prvKey '-----BEGIN RSA PRIVATE KEY-----
xxx
-----END RSA PRIVATE KEY-----
'
  • 从本地私钥文件直接读取内容传入,避免手动处理转义:
./myProgram --prvKey "$(cat ~/.ssh/id_rsa)"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:54:07