티스토리 뷰

반응형

JAVA로 command 명령어를 작성할 수 있다. ProcessBuilder 를 이용하면 되는데, 나는 처음에 ProcessBuilder를 이용하여 scp를 실행하려고 하였다. 

 

그런데, ProcessBuilder 를 이용해 scp를 사용하려면, password 입력을 처리가 어려워지는 문제가 있었다.

그래서 다른 방법을 찾아보던 중,  jSch 라이브러리를 이용하여, scp를 실행시킬 수 있음을 알았다. 

 

 

 

외부 라이브러리 추가

<!-- scp -->
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

 

 

scp 파일 전송 코드

       JSch jSch = new JSch();
        Session session;

        try {
            session = jSch.getSession(accountUserName, scpAddr);
            session.setPassword(accountPassword);
            session.setPort(scpPort);

            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);

            session.connect();
            Channel channel = session.openChannel("sftp");
            ChannelSftp channelSftp = (ChannelSftp) channel;
            channelSftp.connect();

            channelSftp.put(srcPath + "/" + filename, dstPath + "/" + filename);

            channelSftp.quit();
            channel.disconnect();
            session.disconnect();

        } catch (JSchException | SftpException e) {
            e.printStackTrace();
        }

코드를 좀 보자면,

 

1. 일단 전송하려는 서버의 Host Name 과 Host IP를 입력해야 한다. 

ex) 내 host pc 명이 KIM 이고 IP가 127.0.0.1 이라면,  jSch.getSession("KIM", "127.0.0.1");

 

2. 그리고 전송하는 서버가 password가 걸려있다면, session.setPassword를 이용하여, 비밀번호를 입력하면 된다.

※ 이것때문에, jSch 라이브러리를 사용하게 된 것이다. 

 

3. 그리고 Host 서버에서 ssh 로 default로 22 번이 아닌 다른 포트를 이용하고 있다면, session.setPort를 이용하여, ssh 포트를 입력하면된다.

 

그 이후로는 위 코드대로 sftp 채널을 열어서 파일을 보내주고 닫으면 된다.

 

 

 

jSch 라이브러리 쓰면서 주의해야 할 점

jSch 라이브러리가 password 에 대한 고민을 해결해주는 좋은 친구였지만, 나를 애먹게 하기도 했다.  

Host에 파일을 전송할 경로를 지정하는 부분이었는데, 나는 scp 를 이용하면, 전체 경로를 작성한다. 예를 들어 C:/Users/KIM/Desktop/data 이런 식으로 작성을 하는데, 이 부분에서 문제가 있었다. 

jSch 는 C:/Users/KIM 까지 알아서, Host의 default 경로를 가져와서, 내가 입력한 Host의 경로에 붙이는 것이다. 

즉, 내가 C:/Users/KIM/Desktop/data 입력했다면, jSch는 자동으로 C:/Users/KIM/C:/Users/KIM/Desktop/data 이렇게 만들어준다는 뜻이다. 

따라서, Host에 파일을 전송할 경로에는 C:/Users/KIM 을 제외한 나머지 경로를 넣어줘야 제대로 된 경로가 만들어지며, 파일을 원하는 위치에 잘 전송할 수 있다.

 

또한, 참고로 더 얘기하면, 전체 경로가 존재해야만 파일을 전송할 수 있다.

 

 

 ....

 

22.7.7 절대경로에 대한 내용을 추가하자면, jSch 의 경우 경로의 첫 문자가 '/'로 시작하면, 절대경로라고 본다. 그러나, 이 부분이  리눅스에서는 /home/~... 된다지만, 윈도우에서는 C:/로 시작한다... 윈도우에서는 jSch에서 얘기하는 절대경로 규칙을 따를수가 없다...( 있다면 댓글에 남겨주시면 ...) 암튼 그래서 엄청 해맸다. 나처럼 jSch를 사용하는데 윈도우를 쓰는 사람이라면, 이 내용이 도움이 되길! 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함