문제

Jsch를 통해 SFTP 명령을 실행하려면 아래 코드를 사용하고 있습니다.

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:password@IP

get G:\sample.zip /MyFolderLocation/

exit

잘 작동하지만 SFTP 프로세스가 실패할 때마다 예외가 발생하지 않습니다. 처리할 방법이 있나요?

도움이 되었습니까?

해결책

실행한 하위 프로세스에 오류가 발생했는지 여부를 감지하는 두 가지 일반적인 방법이 있습니다.

  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에서 하위 프로세스를 실행할 때는 내용에 관심이 없더라도 항상 하위 프로세스의 출력을 읽어야 합니다.그렇지 않으면 출력이 기록되는 버퍼가 가득 차서 더 이상 기록하려는 경우 하위 프로세스가 중단될 수 있습니다.

다른 팁

winscp faq 스크립트가 성공적으로 완료되었음을 어떻게 알 수 있습니까?

WinScp 종료 코드로 스크립트 결과를 알 수 있습니다.코드 0. 1은 성공을 나타내며 1은 오류를 나타냅니다.자세한 내용은 참조하십시오 스크립팅 문서화

Batch 스크립트 (/script 또는 /command 명령 줄 스위치 )가 종료됩니다.오류가 발생하면 즉시 코드 1.

스크립트가 실패한 이유를 알아 보려면 세션 로그 를 검사하십시오.

예제는 자동화를 전송할 안내

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top