개발자의 끄적끄적

[java/spring] JSch 라이브러리 : java 에서 원격 ssh 명령어 실행 [펌] 본문

개발/java & jsp

[java/spring] JSch 라이브러리 : java 에서 원격 ssh 명령어 실행 [펌]

효벨 2020. 9. 7. 01:00
728x90
반응형

[java/spring] JSch 라이브러리 : java 에서 원격 ssh 명령어 실행 [펌]

 

 

자바에서 원격 서버에 명령어를 실행하거나 ftp로 파일을 주고받기 위해서 apach-commons에 있는 ftp/telnet 라이브러리를 사용한다. 하지만, sftp/ssh는 구현할 수가 없기 때문에 보안에 취약하다.

오픈소스인 jsch라이브러리는 java에서 sftp/ssh를 사용해 원격 서버에 접속할 수 있는 유용한 api를 제공한다.

 

maven spring boot 환경에서 우분투 리눅스 서버에 ssh 명령어를 날려 실행하는 것으로 간단한 테스트를 해 보았다.

 

JCraft 공식 사이트에서 zip, jar 파일의 라이브러리를 직접 받을 수 있다.

여기서는 maven dependency에 설정해서 jsch를 사용했다.

 

maven dependency 설정

 

1

2

3

4

5

6

<dependency>

    <groupId>com.jcraft</groupId>

    <artifactId>jsch</artifactId>

    <version>0.1.54</version>

</dependency>

Colored by Color Scripter

cs

 

 

java class 코드 작성

 

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

        String username = "root";

        String host = "192.168.56.1";

        int port = 22;

        String password = "root";

        

        System.out.println("==> Connecting to" + host);

        Session session = null;

        Channel channel = null;

     

        // 2. 세션 객체를 생성한다 (사용자 이름, 접속할 호스트, 포트를 인자로 준다.)

        try {

            // 1. JSch 객체를 생성한다.

            JSch jsch = new JSch();

            session = jsch.getSession(username, host, port);

         

            // 3. 패스워드를 설정한다.

            session.setPassword(password);

         

            // 4. 세션과 관련된 정보를 설정한다.

            java.util.Properties config = new java.util.Properties();

            // 4-1. 호스트 정보를 검사하지 않는다.

            config.put("StrictHostKeyChecking""no");

            session.setConfig(config);

         

            // 5. 접속한다.

            session.connect();

         

            // 6. sftp 채널을 연다.

            channel = session.openChannel("exec");

         

            // 8. 채널을 SSH용 채널 객체로 캐스팅한다

            ChannelExec channelExec = (ChannelExec) channel;

         

            System.out.println("==> Connected to" + host);

            

            channelExec.setCommand("touch /test/jschTest.txt");

            channelExec.connect();

            

            System.out.println("==> Connected to" + host);

      

        } catch (JSchException e) {

            e.printStackTrace();

        } finally {

            if (channel != null) {

                channel.disconnect();

            }

            if (session != null) {

                session.disconnect();

            }

        }

Colored by Color Scripter

cs

 

리눅스 서버에 ssh 채널을 열고, "touch /test/jschTest.txt" 명령어를 날렸다.

직접 해당 서버에서 파일이 생성되었는지 확인해보자.

 

 

코드 실행 후 해당 파일이 생성된 것을 확인할 수 있다.

 

 

출처 : www.leafcats.com/177

반응형
Comments