Pergunta

Estou usando o código abaixo para executar o comando SFTP por meio de Jsch:

public void putfile(){

    try {                      
        String command="winscp /script=D:\\command.txt" ;
        System.out.println(command);
        Runtime rt=Runtime.getRuntime();

        rt.exec(command);
    }
    catch(Exception e) {
        System.out.println("Exception in index.jsp:"+e.getMessage());
    }
}

Estou colocando sample.zip da máquina local no servidor Unix,

O comando.txt contém:

option confirm off

open sftp:User:password@IP

get G:\sample.zip /MyFolderLocation/

exit

Está funcionando bem, mas não recebo nenhuma exceção sempre que o processo SFTP falha. Existe alguma maneira de lidar com isso?

Foi útil?

Solução

Existem duas maneiras comuns de detectar se um subprocesso executado encontrou um erro:

  1. verifique seu código de saída,
  2. veja se ele grava alguma mensagem de erro na saída padrão ou no erro padrão.

Não sei se o WinSCP define um código de saída em caso de erro ou grava uma mensagem na saída padrão ou no erro padrão, mas deve executar pelo menos um deles.(Pode até fazer as duas coisas, que é o que eu esperaria que todos os processos bem comportados fizessem.) Você apenas terá que experimentar o WinSCP e ver o que acontece.

Eu também recomendo usar um ProcessBuilder em vez de Runtime.getRuntime().exec(...) para executar o comando.No mínimo, isso permite redirecionar o erro padrão para a saída padrão, para que você tenha apenas um fluxo para ler.

Esta é a aparência do seu código depois de modificá-lo para usar um ProcessBuilder, obtenha o código de saída do processo e leia a saída do comando em uma string:

public void putfile() {

    try {                      
        ProcessBuilder builder = new ProcessBuilder("winscp", "/script=D:\\command.txt");
        builder.redirectErrorStream(true);

        Process process = builder.start();

        // read output from the process
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        StringBuilder outputBuilder = new StringBuilder();
        String line;
        do {
           line = reader.readLine();
           if (line != null) { outputBuilder.append(line).append('\n'); }
        } while (line != null);

        reader.close();

        String output = outputBuilder.toString();
        // inspect output for error messages.

        int exitCode = process.waitFor();
        // see if exit code is 0 (success) or != 0 (error)
    }
    catch(Exception e) {
        System.out.println("Exception in index.jsp:"+e.getMessage());
    }
}

Claro, reader deverá ser fechado em finally bloquear.Para maior clareza, não me preocupei em fazer isso no código acima.

Observe que ao executar um subprocesso em Java você deve sempre ler a saída do subprocesso, mesmo que não se importe com seu conteúdo.Caso contrário, o buffer no qual a saída é gravada poderá ficar cheio, o que fará com que o subprocesso trave se quiser gravar mais.

Outras dicas

Consulte as perguntas frequentes do WinSCP Como posso saber se o script foi concluído com sucesso?

Você pode saber o resultado do script pelo código de saída do WinSCP.Código 0 indica êxito, enquanto 1 indica um erro.Para mais detalhes, consulte Para script documentação.

Script em lote (especificado usando /script ou /command opções de linha de comando) termina com o código 1 imediatamente após ocorrer qualquer erro.

Para descobrir por que o script falhou, inspecione registro da sessão.

Para ver um exemplo guia para automação de transferência.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top