2014-01-11 3 views
1

Я использую ниже код для запуска команды SFTP через JSch:Как узнать, был ли SFTP успешным или нет в WinSCP

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()); 
    } 
} 

Я помещаю sample.zip с локального компьютера на сервер Unix,

command.txt содержит:

option confirm off 

open sftp:User:[email protected] 

get G:\sample.zip /MyFolderLocation/ 

exit 

Сво работает нормально, но я не получаю никаких исключений, когда процесс SFTP fails.Is есть ли способ справиться с этим?

+0

Это не JSch. Это runtime.exec. Это совершенно разные вещи. –

+0

@RobinGreen: Я знаю, что.что я пытаюсь сказать, что я использую Runtime Class в коде, который использует jar-файл Jsch. Итак, есть ли способ справиться с этим? –

+0

Я не думаю, что Jsch имеет отношение к этому вопросу вообще, за исключением того, что он может дать полезный ответ. –

ответ

2

Есть два распространенных способа обнаружить бегала ли подпроцесс вы произошла ошибка:

  1. проверить свой код выхода,
  2. увидеть, если он записывает сообщения об ошибках в стандартный вывод или стандартную ошибку.

Я не знаю, устанавливает ли WinSCP код выхода в случае ошибки или записывает сообщение на стандартный вывод или стандартную ошибку, но он должен выполнять хотя бы один из них. (Возможно, это и то, и другое, что я ожидал бы от всех хорошо выполненных процессов). Вам просто нужно попробовать WinSCP и посмотреть, что произойдет.

Я бы рекомендовал использовать команду ProcessBuilder вместо Runtime.getRuntime().exec(...) для запуска команды. Если ничего другого, это позволяет перенаправить стандартную ошибку в стандартный вывод, чтобы вы могли читать только один поток.

Вот что ваш код выглядит после того, как я изменил его использовать ProcessBuilder, получить код завершения процесса и прочитать вывод команды в строку:

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()); 
    } 
} 

Конечно, reader должно быть закрыт в блоке finally. Для ясности я не беспокоился об этом в приведенном выше коде.

Обратите внимание, что при запуске подпроцесса в Java вы всегда должны читать вывод подпроцесса, даже если его не интересует его содержимое. Если вы этого не сделаете, буфер, в который будет записываться вывод, может заполниться, что приведет к зависанию подпроцесса, если он хочет писать больше.

+0

Спасибо, что так много. Он работал как шарм. –

+0

. Привет, в любом случае, чтобы увидеть текущий статус файла, который транслируется? Я попытался найти его, но не смог получить полезную информацию. –

+0

@Shashank: Я никогда не использовал WinSCP, поэтому я понятия не имею, какой вывод WinSCP генерирует (если есть), в то время как файл передается. Если он не генерирует какой-либо полезный результат, возможно, вы ничего не можете сделать. –

0

См WinSCP FAQ How do I know that script completed successfully?

You can tell the result of script by WinSCP exit code. Code 0 indicates success, while 1 indicates an error. For more details refer to scripting documentation.

Batch script (specified using /script or /command command-line switches) terminates with code 1 immediately once any error occurs.

To find out why the script failed, inspect session log .

For an example see guide to transfer automation .

Смежные вопросы