在 Windows 系统上安装了 SSH,并与远程主机 (Linux) 交换密钥。我想在 Windows 机器上运行一个 JAR,将 SCP 文件发送到 Linux 机器。在命令行上执行此操作
"C:/Program Files (X86)/ICW/bin/SCP.exe" -i .ssh/id_rsa <filename> theUser@xxx.xxx.xx.xx:/target/path/<filename>
它运作良好(使用双引号)。
但是当我使用JSch从 JAR 中运行 SCP 时,我得到一个 sun.nio.file.InvalidPathException: Illegal char <"> at index...
目的是我必须以编程方式从 FTP 主机收集一堆文件(我已经让这部分工作)。这些文件必须转发到已经提到的远程主机。FTP 主机和远程主机之间不能直接通信。因此,Windows 机器充当一种代理。JAR 从 FTP 服务器获取文件(目前将它们保存在地图中),我想使用 JSch SCP 将它们直接放入远程 Linux 主机上的特定文件夹中。
我怎么解决这个问题?如何解决这个双引号问题?
private void storeFiles() throws IOException {
final JSch jsch = new JSch();
final FileSystem fs = FileSystems.getDefault();
final Path p = fs.getPath( getProperty("scp.key.file.private"));
logger.info("Reading private key from " + getProperty("scp.key.file.private"));
final Session session;
try {
session = jsch.getSession(getProperty("scp.user.name"), getProperty("scp.host.ip"),
Integer.parseInt(getProperty("scp.port")));
jsch.addIdentity(p.toFile().getPath());
final Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
logger.info("Connected to " + getProperty("scp.host.ip") + "...");
vaFiles.forEach((k, v) ->{
// get I/O streams for remote scp
try {
final MessageFormat mf = new MessageFormat(getProperty("scp.command"));
final Object[] commandArgs = new Object[]{getProperty("scp.key.file.private"),
k, getProperty("scp.user.name"),
getProperty("scp.host.ip"),
getProperty("scp.target.path"), k};
final String command = mf.format(commandArgs);
logger.info(command);
final Channel channel;
try {
channel = session.openChannel("exec");
channel.connect();
((ChannelExec)channel).setCommand(command);
// logger.info("Writing " + Arrays.toString(v) + " to SCP channel...");
final OutputStream out = channel.getOutputStream();
out.write(command.getBytes());
out.flush();
out.write(v);
out.close();
channel.disconnect();
} catch (JSchException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}); //end forEach
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
}
}
其中 vaFiles是Map<String, byte[]> 和scp.command来自属性文件并且是
scp.command = '\"C\:/Program\u0020Files\u0020(x86)/ICW/bin/scp.exe\"' -i {0} {1} {2}@{3}\:{4}/{5}
(我试图将命令字符串用单引号、双引号、不带引号、不带 \u0020、...)
使用MessageFormat填充
{0} = '\"C:/Program\u0020Files\u0020(x86)/ICW/bin/scp.exe\"'
{1} = 文件名
{2} = scp 用户名
{3} = scp 历史 IP 地址
{4} = 远程主机上的目标路径
{5} = 文件名(参见 {1})
SFTP 目前没有选项,只有 SCP 安装在 Windows 机器和远程 Linux 主机上。如果我在这样做时完全误解了,我将不胜感激任何技术转让以学习如何以正确的方式做到这一点。:-)