티스토리 뷰
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를 사용하는데 윈도우를 쓰는 사람이라면, 이 내용이 도움이 되길!
'etc' 카테고리의 다른 글
[spring-rest-docs] adoc 파일을 pdf로 저장하는 방법 (2) | 2022.10.05 |
---|---|
[mongodb] image, video 저장하기 (0) | 2022.09.27 |
[ Docker ] Docker 외부 포트 설정 (직접 명령어 & REST API 적용) (0) | 2022.07.05 |
[Maven] Maven 프로젝트 실행가능한 Jar 파일 만들기 (0) | 2022.07.01 |
[ wireshark ] 와이어샤크(wireshark) 사용법 (0) | 2022.06.10 |