본문

Telnet 로그인 로직 구현(JAVA)

반응형

# Telnet 로그인 로직 구현 (JAVA)


# Telnet & Commons/Net

Commons/Net 라이브러리는 org.apache.commons.net.telnet 패키지와 
그 중의 TelnetClient 만으로도 구현할 수 있을만큼 심플한 패키지를 제공한다.

이 클래스는 가장 기초적이며 적용 절차는 아래와 같다.
 1. 서버에 접속하기 위해 connect() 메소드 호출
 
 2. 서버와의 통신하기 위해 getInputStream() 메소드와 getOutputStream() 메소드를 구현
 
 3. disconnect() 메소드를 호출함으로써 종료한다.(stream에 대한 close( ) 메소드는 호출하지 않는다)
 
위의 내용을 구현하면 아래 소스와 같다.
TelnetClient telnet = new TelnetClient();
telnet.connect( "192.168.1.99", 23 );
InputStream in = telnet.getInputStream();
PrintStream out = new PrintStream( telnet.getOutputStream() );
 ...
telnet.close();
 
기본적으로 Telent 서버는 23번 포트를 열어놓고 client의 접속을 기다린다. 
(마찬가지로 FTP는 21번, SMTP는 25번, POP3는 119번, HTTP는 80번 포트를 기본적으로 사용한다.) 
connect() 메소드에 의해 192.168.1.99 서버의 23번 포트로 접속을 한다. 
그런 다음 java.io.InputStream 객체와 java.io.PrintStream 객체를 생성한다.


source 01) TelnetSample.java

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import java.io.*;
import org.apache.commons.net.telnet.TelnetClient;
 
public class TelnetSample {
 
    private TelnetClient telnet = new TelnetClient();
    private InputStream in = null;
    private PrintStream out = null;
    private char prompt = '$';
 
    public TelnetSample(String server, String user, String password) {
        try {
            // telnet 서버로의 접속
            telnet.connect(server, 23);
 
            // 참조할 input, output stream 객체 획득
            in = telnet.getInputStream();
            out = new PrintStream(telnet.getOutputStream());
 
            // 사용자 로그온
            readUntil("login:");
            write(user);
            readUntil("Password:");
            write(password);
 
            // prompt 대기
            readUntil(prompt + " ");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    /**
     * superuser로 전환 @param password superuser의 password @exception
     */
    public void su(String password) {
        try {
            write("su");
            readUntil("Password:");
            write(password);
            prompt = '#';
            readUntil(prompt + " ");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    /**
     * @param pattern
     * @return java.lang.String
     */
    public String readUntil(String pattern) {
        try {
            char lastChar = pattern.charAt(pattern.length() - 1);
            StringBuffer sb = new StringBuffer();
            boolean found = false;
            char ch = (charin.read();
 
            while (true) {
                System.out.print(ch);
                sb.append(ch);
                if (ch == lastChar) {
                    if (sb.toString().endsWith(pattern)) {
                        return sb.toString();
                    }
                }
 
                ch = (charin.read();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return null;
    }
 
    /**
     * 생성된 output stream에 value를 전송한다. @param value stream으로 전송할 String
     * value @exception
     */
    public void write(String value) {
        try {
            out.println(value);
            out.flush();
            System.out.println(value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    /**
     * Telnet 명령어를 전송한다. @param command telnet 서버로 전송할 명령어 @exception
     */
    public String sendCommand(String command) {
        try {
            write(command);
            return readUntil(prompt + " ");
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return null;
    }
 
    /**
     * Telnet 접속을 해제한다.
     */
    public void disconnect() {
        try {
            telnet.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
cs


source 02) Main.java

1
2
3
4
5
6
7
8
9
10
11
12
package com.aimir.schedule.command;
 
public class Main {
    public static void main(String[] args) {
 
        TelnetSample telnet = new TelnetSample("127.0.0.1""root""password");
        telnet.sendCommand("pwd");
        telnet.sendCommand("cd ..");
        telnet.disconnect();
    }
}
 
cs




- 출처 : http://jin32.tistory.com/3

반응형

공유

댓글