Scp файл с jsch дает «неожиданное имя файла» - PullRequest
1 голос
/ 03 ноября 2011

Я использую Jsch 0.1.44, чтобы скопировать файл с одного хоста на другой. Соответствующий код следующий:

public boolean transferFileToHost(File fileToTransfer, String destDirectory, String destFilename) {
    Channel channel = null;
    try {
        String command = "scp -t "+ destDirectory + destFilename;
        channel = session.openChannel("exec");
        ((ChannelExec)channel).setCommand(command);

        OutputStream out = channel.getOutputStream();
        InputStream in = channel.getInputStream();

        if(!connectToChannel(channel, in)) {
            return false; 
        }

        if(!sendScpCommand(fileToTransfer, command, out, in)) {
            return false;
        }

        if(!sendFileContent(out, fileToTransfer, in)) {
            return false;
        }

        return true;
    } catch (IOException e) {
        logger.error("Error while reading file. Error was: ",e);
    } catch (JSchException e) {
        logger.error("Error while sending ssh commands. Error was: ",e);
    } 
    finally {
        if(channel != null) {
            channel.disconnect();
        }
    }

private boolean sendScpCommand(File file, String command, OutputStream out, InputStream in) throws IOException {
    long filesize=file.length();
    command="C0644 "+filesize+" ";
    command+=file;
    command+="\n";

    out.write(command.getBytes());
    out.flush();
    if (checkAck(in) != 0) {
        return false;
    }
    return true;
}

Команда в этой строке

((ChannelExec)channel).setCommand(command);

выглядит так: scp -t /tmp/config.xml и команда в этой строке

out.write(command.getBytes());

выглядит так: C0644 5878 /home/myuser/config.xml

Проблема в том, что я получаю следующую ошибку от scp: scp: error: unexpected filename: /path/to/config.xml

В чем причина этой ошибки? Как я могу избежать этого?

Любая помощь высоко ценится.

1 Ответ

2 голосов
/ 03 ноября 2011

Я нашел решение. Кажется, что имя исходного файла в команде не должно содержать косых черт. Чтобы решить эту проблему, вам просто нужно изменить эту строку:

command+=file;

в это:

command+=file.getName();

Вот так.

...