"telnetlib" --- 텔넷 클라이언트
*******************************

**소스 코드:** Lib/telnetlib.py

======================================================================

"telnetlib" 모듈은 텔넷 프로토콜을 구현하는 "Telnet" 클래스를 제공합니
다. 프로토콜에 대한 자세한 내용은 **RFC 854**를 참조하십시오. 또한, 프
로토콜 문자(아래를 보십시오)와 텔넷 옵션을 위한 기호 상수를 제공합니다
. 텔넷 옵션의 기호 이름은 "arpa/telnet.h"의 정의를 따르며, 선행
"TELOPT_"는 제거됩니다. 전통적으로 "arpa/telnet.h"에 포함되지 않는 옵
션의 기호 이름에 대해서는 모듈 소스 자체를 참조하십시오.

텔넷 명령을 위한 기호 상수는 다음과 같습니다: IAC, DONT, DO, WONT,
WILL, SE (Subnegotiation End), NOP (No Operation), DM (Data Mark), BRK
(Break), IP (Interrupt process), AO (Abort output), AYT (Are You
There), EC (Erase Character), EL (Erase Line), GA (Go Ahead), SB
(Subnegotiation Begin).

class telnetlib.Telnet(host=None, port=0[, timeout])

   "Telnet" represents a connection to a Telnet server. The instance
   is initially not connected by default; the "open()" method must be
   used to establish a connection.  Alternatively, the host name and
   optional port number can be passed to the constructor too, in which
   case the connection to the server will be established before the
   constructor returns.  The optional *timeout* parameter specifies a
   timeout in seconds for blocking operations like the connection
   attempt (if not specified, the global default timeout setting will
   be used).

   이미 연결된 인스턴스를 다시 열지 마십시오.

   이 클래스에는 많은 "read_*()" 메서드가 있습니다. 이들 중 일부는 연
   결의 끝을 읽을 때 "EOFError"를 발생시킴에 유의하십시오. 다른 이유로
   빈 문자열을 반환할 수 있기 때문입니다. 아래의 개별 설명을 참조하십
   시오.

   "Telnet" 객체는 컨텍스트 관리자이며 "with" 문에서 사용할 수 있습니
   다. "with" 블록이 끝날 때, "close()" 메서드가 호출됩니다:

      >>> from telnetlib import Telnet
      >>> with Telnet('localhost', 23) as tn:
      ...     tn.interact()
      ...

   버전 3.6에서 변경: 컨텍스트 관리자 지원을 추가했습니다

더 보기:

  **RFC 854** - Telnet Protocol Specification
     텔넷 프로토콜의 정의.


텔넷 객체
=========

"Telnet" 인스턴스에는 다음과 같은 메서드가 있습니다.:

Telnet.read_until(expected, timeout=None)

   주어진 바이트열 *expected*를 만나거나 *timeout* 초가 경과 할 때까지
   읽습니다.

   일치하는 것을 찾을 수 없으면, 사용 가능한 것을 대신 반환합니다. 빈
   바이트열도 가능합니다. 연결이 닫혀 있고 사용할 수 있는 요리된 데이
   터가 없으면 "EOFError"를 발생시킵니다.

Telnet.read_all()

   EOF까지 모든 데이터를 바이트열로 읽습니다; 연결이 닫힐 때까지 블록
   합니다.

Telnet.read_some()

   EOF를 만나지 않으면 적어도 1바이트의 요리된 데이터를 읽습니다. EOF
   를 만나면 "b''"를 반환합니다. 즉시 사용할 수 있는 데이터가 없으면
   블록합니다.

Telnet.read_very_eager()

   I/O에서 블록하지 않고 읽을 수 있는 모든 것을 읽습니다 (eager).

   연결이 닫혀 있고 사용할 수 있는 요리된 데이터가 없으면 "EOFError"를
   발생시킵니다. 그렇지 않고 사용할 수 있는 요리된 데이터가 없으면
   "b''"를 반환합니다. IAC 시퀀스의 중간에 있지 않으면 블록하지 않습니
   다.

Telnet.read_eager()

   쉽게 사용할 수 있는 데이터를 읽습니다.

   연결이 닫혀 있고 사용할 수 있는 요리된 데이터가 없으면 "EOFError"를
   발생시킵니다. 그렇지 않고 사용할 수 있는 요리된 데이터가 없으면
   "b''"를 반환합니다. IAC 시퀀스의 중간에 있지 않으면 블록하지 않습니
   다.

Telnet.read_lazy()

   이미 큐에 있는 데이터를 처리하고 반환합니다 (lazy).

   연결이 닫혀 있고 사용할 수 있는 데이터가 없으면 "EOFError"를 발생시
   킵니다. 그렇지 않고 사용할 수 있는 요리된 데이터가 없으면 "b''"를
   반환합니다. IAC 시퀀스의 중간에 있지 않으면 블록하지 않습니다.

Telnet.read_very_lazy()

   요리된 큐에 있는 모든 데이터를 반환합니다 (very lazy).

   연결이 닫혀 있고 사용할 수 있는 데이터가 없으면 "EOFError"를 발생시
   킵니다. 그렇지 않고 사용할 수 있는 요리된 데이터가 없으면 "b''"를
   반환합니다. 이 메서드는 절대 블록하지 않습니다.

Telnet.read_sb_data()

   SB/SE 쌍(suboption begin/end)간에 수집된 데이터를 반환합니다. "SE"
   명령으로 호출되었을 때 콜백은 이 데이터에 액세스해야 합니다. 이 방
   법은 절대 블록하지 않습니다.

Telnet.open(host, port=0[, timeout])

   호스트에 연결합니다. 선택적 두 번째 인자는 포트 번호이며, 기본값은
   표준 텔넷 포트(23)입니다. 선택적 *timeout* 매개 변수는 연결 시도와
   같은 블로킹 연산에 대한 시간제한을 초로 지정합니다 (지정하지 않으면
   , 전역 기본 시간제한 설정이 사용됩니다).

   이미 연결된 인스턴스를 다시 열려고 하지 마십시오.

Telnet.msg(msg, *args)

   디버그 수준이 ">" 0 일 때 디버그 메시지를 인쇄합니다. 추가 인자가
   있으면, 표준 문자열 포매팅 연산자를 사용하여 메시지에 치환됩니다.

Telnet.set_debuglevel(debuglevel)

   디버그 수준을 설정합니다. *debuglevel*의 값이 클수록, 더 많은 디버
   그 출력을 얻을 수 있습니다 ("sys.stdout"으로).

Telnet.close()

   연결을 닫습니다.

Telnet.get_socket()

   내부적으로 사용되는 소켓 객체를 반환합니다.

Telnet.fileno()

   내부적으로 사용되는 소켓 객체의 파일 기술자를 반환합니다.

Telnet.write(buffer)

   IAC 문자를 중복(doubling)해서 소켓에 바이트열을 기록합니다. 연결이
   블록 되면 블록 할 수 있습니다. 연결이 닫히면 "OSError"가 발생할 수
   있습니다.

   버전 3.3에서 변경: 이 메서드는 방법은 "socket.error"를 발생시켰습니
   다. 이제는 "OSError"의 별칭입니다.

Telnet.interact()

   상호 작용 함수, 매우 단순한 텔넷 클라이언트를 에뮬레이션합니다.

Telnet.mt_interact()

   "interact()"의 다중 스레드 버전.

Telnet.expect(list, timeout=None)

   정규식 리스트 중 하나가 일치할 때까지 읽습니다.

   첫 번째 인자는 컴파일되었거나 (정규식 객체) 컴파일되지 않은 (바이트
   열) 정규식의 리스트입니다. 선택적 두 번째 인자는 초 단위의 시간제한
   입니다; 기본값은 무기한 블록 하는 것입니다.

   세 항목의 튜플을 반환합니다: 일치하는 첫 번째 정규식의 리스트 인덱
   스; 반환된 일치 객체; 그리고 일치를 포함해서 그때까지 읽은 바이트열
   .

   파일의 끝이 발견되고 아무런 바이트도 읽히지 않았으면, "EOFError"를
   발생시킵니다. 그렇지 않으면, 아무것도 일치하지 않을 때, "(-1, None,
   data)"를 반환합니다. 여기서 *data*는 지금까지 받은 바이트열입니다 (
   시간 초과가 발생하면 빈 바이트열일 수 있습니다).

   정규식이 탐욕적인 일치(가령 ".*")로 끝나거나 둘 이상의 정규식이 같
   은 입력과 일치 할 수 있으면, 결과는 비결정적이며, I/O 타이밍에 따라
   달라질 수 있습니다.

Telnet.set_option_negotiation_callback(callback)

   입력 흐름에서 텔넷 옵션을 읽을 때마다, 이 *callback*(설정되었다면)
   은 다음과 같은 매개 변수로 호출됩니다: callback(telnet socket,
   command (DO/DONT/WILL/WONT), option). telnetlib은 나중에 다른 작업
   을 수행하지 않습니다.


텔넷 예제
=========

일반적인 사용을 보여주는 간단한 예제:

   import getpass
   import telnetlib

   HOST = "localhost"
   user = input("Enter your remote account: ")
   password = getpass.getpass()

   tn = telnetlib.Telnet(HOST)

   tn.read_until(b"login: ")
   tn.write(user.encode('ascii') + b"\n")
   if password:
       tn.read_until(b"Password: ")
       tn.write(password.encode('ascii') + b"\n")

   tn.write(b"ls\n")
   tn.write(b"exit\n")

   print(tn.read_all().decode('ascii'))
