본문 바로가기
JAVA

[Java] Jsch를 이용한 리눅스 명령어 전송 방법

by GoodDayDeveloper 2022. 6. 14.
반응형


Jsch를 이용해서 리눅스에 SFTP 전송하는 방법에 대해 이야기해보겠습니다.
우선 저의 로직은,

저는 회원가입을 하게 되면
리눅스에 아이디를 생성하면서 해당 폴더를 생성해줍니다.
그리고 암호를 지정하여 리눅스에 사용자가 별도의 공간을 사용할 수 있도록 설정해주는거죠!

여러 Jsch 라이브러리의 활용법들이 많지만
이 글의 특징은 여러 명령문을 사용하는 점이 키포인트라 말할 수 있습니다.
저처럼 해매시는 분들을 위한 포스팅이니 도움이 되셨으면 좋겠습니다~



Controller

 

 

1
2
3
4
5
6
7
8
9
List<String> commandList = new ArrayList<>();
commandList.add("useradd "+searchVO.getMe_id() + " -s /sbin/nologin -d /home/"+searchVO.getMe_id());
commandList.add("echo "+ oriPwd + " | passwd --stdin "+ searchVO.getMe_id());
 
for(int i = 0; i < commandList.size(); i++) { 
 JschImplement jsch = new JschImplement();
 jsch.JschMethod(commandList.get(i));
 
}
cs


동시에 여러 명령어를 실행시키려 시도를 해봤으나,
명령어를 하나만 실행하고 접속이 끊어졌습니다.
그래서 리스트에 명령어를 담아 반복문으로 실행하는 방법으로 구현하였습니다.

참고로 searchVO.getMe_id()에는 회원 아이디와,
oriPwd는 패스워드가 들어간 변수입니다.





JschMethod

 

 

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package com.bsite.bioresource.member.web;
 
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
 
import egovframework.com.cmm.EgovProperties;
 
public class JschImplement {
 
public void JschMethod(String command){
 
    String host = "host정보를 넣어줍니다.";
    int    port = "port정보를 넣어줍니다.";
    String username = "사용자 생성 정보를 넣어줍니다.";
    String password = "패스워드 정보를 넣어줍니다.";
    
    Session session = null;
    Channel channel = null;
 
    // 세션 객체를 생성합니다. (사용자 이름, 접속할 호스트, 포트를 인자로 줍니다.)
    try {
        // JSch 객체를 생성합니다.
        JSch jsch = new JSch();
        session = jsch.getSession(username, host, port);
 
        // 패스워드를 설정합니다.
        session.setPassword(password);
 
        // 세션과 관련된 정보를 설정합니다.
        java.util.Properties config = new java.util.Properties();
        // 호스트 정보를 검사하지 않습니다.
        config.put("StrictHostKeyChecking""no");
        session.setConfig(config);
 
        // 접속합니다.
        session.connect();
 
        // sftp 채널을 엽니다.
        channel = session.openChannel("exec");
 
        // 채널을 SSH용 채널 객체로 캐스팅합니다
        ChannelExec channelExec = (ChannelExec) channel;
        
        
        //명령어를 넣습니다.
        channelExec.setCommand(command);
        
        //실행합니다.
        channelExec.connect();
 
 
    } catch (JSchException e) {
        
        e.printStackTrace();
        
    } finally {
        
        if (channel != null) {
            channel.disconnect();
        }
        
        if (session != null) {
            session.disconnect();
        }
        
    }
    
}
 
}
 
cs

 

그리고 host, port와 사용자 아이디, 패스워드 정보를 통해

  • JSCH 객체를 생성하고,
  • 패스워드를 설정하여 환결설정을 한다음,
  • 접속을 하고,
  • SFTP 채널을 열어
  • SSH용 채널로 캐스팅하여
  • 명령문을 넣고
  • 실행해줍니다.




이러한 코드를 이용하여 응용하면 더욱 좋은 구현체가 나올 수 있을 것 같네요

반응형

댓글