AI-chan-projects / super-app-tutorials

basic application ideations & implementations
MIT License
0 stars 0 forks source link

터미널 인터페이스 구현하기 #5

Open AI-chan-projects opened 6 months ago

AI-chan-projects commented 6 months ago

터미널 인터페이스 구현 프로세스

  1. 채널 열기
  2. 터미널 입력 및 출력(IO) 처리
  3. 사용자 입력 대기

터미널 인터페이스 예제

import paramiko
import sys

# 서버 정보 설정
hostname = "example.com"
port = 22
username = "username"
password = "password"

# SSH 클라이언트 생성
client = paramiko.SSHClient()

# 호스트 키 자동 승인 설정
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 비밀번호 인증을 사용하여 원격 서버에 연결
client.connect(hostname, port=port, username=username, password=password)

# 원격 서버에 터미널 세션을 열기
channel = client.invoke_shell()

print("터미널 세션에 연결되었습니다. 명령을 입력하세요.")

# 터미널 입력 및 출력 처리
while True:
    # 사용자가 입력한 명령을 채널에 보내기
    command = input("$ ")
    if command.lower() in ['exit', 'quit']:
        break
    channel.send(command + "\n")

    # 원격 서버에서 응답을 받기
    while not channel.recv_ready():
        pass  # 응답 대기
    output = channel.recv(1024).decode()

    # 원격 서버 응답 출력
    print(output)

# 채널 및 SSH 연결 종료
channel.close()
client.close()
print("터미널 세션이 종료되었습니다.")
AI-chan-projects commented 6 months ago
터미널 세션에 연결되었습니다. 명령을 입력하세요.
$

상태로 엔터를 쳐야 Welcome 메시지가 출력됨.

초기 상태에서 Welcome 메시지가 출력되도록 변경

import paramiko
import logging
from getpass import getpass
import argparse  # argparse 모듈 추가

# 로깅 설정
logging.basicConfig(level=logging.INFO)  # 로그 레벨을 INFO로 설정
logger = logging.getLogger(__name__)

# argparse를 사용하여 명령줄 인자를 처리
parser = argparse.ArgumentParser(description="Remote SSH Access Script")
parser.add_argument("--hostname", type=str, required=True, help="Hostname of the remote server")
parser.add_argument("--port", type=int, default=22, help="Port number of the remote server")
parser.add_argument("--username", type=str, required=True, help="Username for remote server")
parser.add_argument("--pkey", type=str, help="Path to private key file for public key authentication")

args = parser.parse_args()  # 명령줄 인자 파싱

hostname = args.hostname
port = args.port
username = args.username
pkey_path = args.pkey  # 공개 키 경로를 가져옴

# SSH 클라이언트 생성
client = paramiko.SSHClient()

# 기본 설정: 호스트 키 자동 승인
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 인증 방식 설정
if pkey_path:
    # 공개 키 인증 사용
    private_key = paramiko.RSAKey.from_private_key_file(pkey_path)
    client.connect(hostname, port=port, username=username, pkey=private_key)
else:
    # 공개 키 인증이 아닌 경우, 비밀번호를 getpass로 안전하게 입력받음
    password = getpass("password: ")
    client.connect(hostname, port=port, username=username, password=password)

# 원격 서버에 터미널 세션을 열기
channel = client.invoke_shell()

print("터미널 세션에 연결되었습니다. 명령을 입력하세요.")

# 접속 직후 Welcome 메시지 출력
# 채널에서 데이터를 즉시 수신하고 출력
while not channel.recv_ready():
    pass  # 응답 대기
output = channel.recv(1024).decode()
print(output)

# 터미널 입력 및 출력 처리
while True:
    # 사용자가 입력한 명령을 채널에 보내기
    command = input("$ ")
    if command.lower() in ['exit', 'quit']:
        break
    channel.send(command + "\n")

    # 원격 서버에서 응답을 받기
    while not channel.recv_ready():
        pass  # 응답 대기
    output = channel.recv(1024).decode()

    # 원격 서버 응답 출력
    print(output)

# 채널 및 SSH 연결 종료
channel.close()
client.close()
print("터미널 세션이 종료되었습니다.")
skwwnl commented 6 months ago

터미널 UI는 VScode를 사용 중이신가요?