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
相关产品推荐
相关产品推荐

