ssh 원격 접속 프로토콜을 기반으로 한 SecureCopy(scp)의 약자로서 원격지에 있는 파일 혹은 디렉터리를 보내거나 가져올 때 사용하는 파일 전송 프로토콜입니다.
위키백과에서는 ssh 프로토콜에 기반된 것으로써 로컬 호스트와 원격 호스트 또는 두 원격 호스트 사이의 컴퓨터의 파일을 보다 안정하게 전송하기 위한 수단으로 작성된 프로토콜이라고 할 수 있습니다. cp와 같은 동작을 하지만 cp는 현재 시스템 내부의 파일을 복사하는 것이라면 scp는 현재 시스템으로부터 원격지 시스템까지의 데이터를 전송하는 차이가 있습니다.
이러한 리눅스 명령어를 Java에서 지원하는 라이브러리가 존재하는데 이 라이브러리의 명칭은 JSch, JSSE 등 여러가지 라이브러리가 있다. 그 중 오늘 이용할 라이브러리는 Jsch라이브러리로 만들어진 유틸리티 소스코드를 통해 보다 유연하고 안정성이 높은 코드를 작성할 수 있습니다.
본 문서는 Java 에서 Scp 명령어를 사용하기 위한 라이브러리인 Jsch를 이용하였습니다.
# Contents
- 사용법
# 사용법
1. 라이브러리 다운로드
먼저 Jsch의 라이브러리를 다운받아야 합니다.
지금은 네이티브 자바를 포커스로 맞춰서 사용하는 방법을 설명하겠습니다.
https://mvnrepository.com/artifact/com.jcraft/jsch 에 접속하셔서 maven이나 gradle의 경우 해당 코드를 복사해서 의존성을 추가해주시면 됩니다. 네이티브 자바인 경우에는 jar 파일을 다운받아 주세요.
다운 받은 라이브러리를 Build Path에 추가해주시기 바랍니다.
Build Path은 프로젝트 오른쪽 마우스를 누르시면 됩니다.
2. Jsch 유틸리티 작성
추가한 라이브러리를 사용하는 유틸리티를 작성하겠습니다. 해당 유틸리티를 통해 간단하게 SCP 업로드 및 다운로드를 진행할 수 있습니다.
public class SCPUtil {
private Session session;
private Channel channel;
private ChannelSftp channelSftp;
private boolean inVaild = false;
/**
* @param serverIp : 아이피 주소
* @param serverId : 서버 아이디
* @param serverPw : 서버 패스워드
*/
public void init(String serverIp, String serverId, String serverPw) {
/* JSch 라이브러리 호출 */
JSch jsch = new JSch();
try {
/* 세션 호출 */
session = jsch.getSession(serverId, serverIp, 22);
session.setPassword(serverPw);
/* 세션 키 없이 호출 */
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
/* 세션 연결 */
session.connect();
/* 채널 방식을 설정한 후 채널을 이용하여 Upload, Download */
channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
inVaild = true;
} catch (JSchException e) {
e.printStackTrace();
}
}
/**
* @param path : ls 명령어를 입력하려고 하는 path 저장소
* @return
*/
public Vector<ChannelSftp.LsEntry> getFileList(String path) {
Vector<ChannelSftp.LsEntry> list = null;
try {
channelSftp.cd(path);
list = channelSftp.ls(".");
} catch (Exception e) {
// TODO: handle exception
}
return list;
}
/**
* @param path : serverVO.path 를 통해 scp로 들어간 서버로 접속하여 upload한다.
* @param file : File file을 객체를 받음
*/
public void upload(String path, File file) {
FileInputStream in = null;
try {
in = new FileInputStream(file);
channelSftp.cd(path);
channelSftp.put(in, file.getName());
} catch (SftpException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
if(in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* @param path : serverVO.path 를 통해 scp로 들어간 서버로 접속하여 download한다.
* @param fileName : 특정 파일의 이름을 찾아서 다운로드 한다.
* @param userPath
*/
public void download(String path, String fileName, String userPath) {
InputStream in = null;
FileOutputStream out = null;
try {
channelSftp.cd(path);
in = channelSftp.get(fileName);
} catch (SftpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
String fullpath = userPath + File.separator + fileName;
out = new FileOutputStream(new File(fullpath));
int i;
while ((i = in.read()) != -1) {
out.write(i);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 서버와의 연결을 끊는다.
*/
public void disconnection() {
channelSftp.quit();
channel.disconnect();
session.disconnect();
setInVaild(false);
}
public boolean isInVaild() {
return inVaild;
}
public void setInVaild(boolean inVaild) {
this.inVaild = inVaild;
}
}
3. Main 함수 작성
라이브러리를 통해 유틸리티를 작성하였고, 이 유틸리티를 통해 만들어진 객체를 이용하여 추상화 시킨 메소드를 사용할 수 있습니다. 추상화 시킨 메소드는 사용하기 용이하고 안정성이 높기 때문에 이러한 형식으로 작성된 유틸리티를 사용하는 편이 좋습니다.
public static void main(String[] args) {
/* SCP 클래스 생성 */
SCPUtil scpUtil = new SCPUtil();
scpUtil.init("127.0.0.1", "root", "root");
if (!scpUtil.isInVaild()) {
System.out.println("에러");
scpUtil = null;
}
/* 파일 업로드 */
/* -------- 처리 --------- */
File file = new File("C:\\home\\helloworld\\GHOST.txt");
String path = "/home/hello";
scpUtil.upload(path, file);
/* 세션 종료 및 파일 닫기 */
scpUtil.disconnection();
scpUtil = null;
/* SCP 클래스 생성 */
scpUtil = new SCPUtil();
scpUtil.init("127.0.0.1", "root", "root");
if (!scpUtil.isInVaild()) {
System.out.println("에러");
scpUtil = null;
}
/* 파일 다운로드 */
/* -------- 처리 --------- */
String fileName = "GHOST.txt";
String userPath = "/home";
scpUtil.download(path, fileName, userPath);
/* 세션 종료 및 파일 닫기 */
scpUtil.disconnection();
scpUtil = null;
}
'기초 문법 > 자바스크립트' 카테고리의 다른 글
[jQuery] mousewheel.js (0) | 2021.11.23 |
---|---|
[jQuery] jQuery 정리 (0) | 2021.11.23 |
[JavaScript] Decorator (0) | 2021.09.28 |
[JavaScript] AES128 암호화/복호화 (0) | 2021.09.24 |
객체에서 배열, 배열에서 객체 (0) | 2021.09.24 |