프로젝트를 하다가 웹에서 버튼클릭시 서버에 설치된 파이썬 파일을 실행해야하는 일이 생겨서, 아래 관련 내용을 정리합니다.
jsch란?
JSCH는 Java에서 SSH 프로토콜을 지원하는 라이브러리로, SFTP, SCP, 포트 포워딩, 터널링 등의 기능을 제공합니다.
Spring에서는 JSCH를 활용하여 원격 서버에 접속하고 파일을 업로드/다운로드하는 등의 작업을 수행할 수 있습니다.
pom.xml
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
build.gradle
implementation group: 'com.jcraft', name: 'jsch', version: '0.1.55'
Controller
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
...
@ResponseBody
@PostMapping("/sshCommand.json")
public String sshCommand(@RequestBody Map<String, Object> params) {
String host = "ssh ip를 입력"; // SSH 서버의 호스트
int port = port를 입력;
String user = "로그인 아이디 입력"; // SSH 로그인 사용자
String password = "로그인 패스워드 입력"; // SSH 로그인 비밀번호
String command = "df -h"; // ssh command에 입력할 명령어 입력
Session session = null;
ChannelExec channel = null;
try {
// JSch 객체 생성
JSch jsch = new JSch();
session = jsch.getSession(user, host, port);
session.setPassword(password);
// SSH 연결 시 호스트 키 확인을 건너뛰기
session.setConfig("StrictHostKeyChecking", "no");
// 연결 타임아웃 설정
session.connect(10000);
//session.connect();
// 명령어 실행을 위한 채널 열기
channel = (ChannelExec) session.openChannel("exec");
channel.setCommand(command); // 쉘 스크립트 실행 명령 설정
channel.setErrStream(System.err);
// 명령어 실행
InputStream inputStream = channel.getInputStream();
channel.connect();
// 실행 결과 읽기
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line); // 명령어 실행 결과 출력
}
channel.disconnect();
session.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return "ok"; // 명령어 실행 후 홈으로 리다이렉트
}
- command에는 ssh 명령어 입력창에 입력되는 명령어를 입력합니다.
//예제 home으로 이동한후 test.sh파일을 실행해라
cd /home && ./test.sh
session time out 현상이 있어서 아래 코드를 추가하였습니다.
아래코드는 session time out을 10초까지 기다린다는 의미입니다.
session.connect(10000);
jsch 0.1.55 socket is not established error가 발생할경우
- host, post, user, password를 다시 한번 확인해서 입력을 해야 합니다. 해당 정보가 맞지않아 웹 소켓 연결이 안될경우 발생하는 에러입니다.
'backend > 스프링' 카테고리의 다른 글
Spring boot 3.0 이상, 3.0이하 querydsl 설정 방법 (0) | 2023.09.30 |
---|---|
H2 데이터베이스 생성 (Database not found, either pre-create it or allow remote database creation (not recommended in secure environments) (0) | 2023.09.30 |
InteliJ UTF-8 한글깨짐 설정 (0) | 2023.09.20 |
Spring + jquery ajax post 파일 다운로드 (0) | 2022.12.08 |
spring boot restart시 query 실행하기 (0) | 2022.11.29 |