페싱코드 파이썬 코드

윈도우에서 파이썬을 이용한 리눅스 원격 접속 및 명령 실행

정과장하루살이 2025. 7. 7. 13:56
반응형

윈도우 환경에서 파이썬을 이용해 리눅스 컴퓨터에 원격으로 접속하고 폴더 이동 및 명령을 실행하려면 paramiko 라이브러리를 사용하는 것이 가장 일반적이고 효과적인 방법입니다. paramiko는 SSHv2 프로토콜을 구현한 파이썬 라이브러리로, 원격 서버에 안전하게 접속하여 명령을 실행하고 파일을 전송하는 기능을 제공합니다.

 

import paramiko

def run_remote_commands(hostname, port, username, password, commands):
    """
    원격 리눅스 서버에 접속하여 지정된 명령들을 실행합니다.

    Args:
        hostname (str): 리눅스 서버의 IP 주소 또는 호스트 이름.
        port (int): SSH 포트 (기본값: 22).
        username (str): SSH 접속 사용자 이름.
        password (str): SSH 접속 비밀번호.
        commands (list): 실행할 명령들을 담은 리스트.
    """
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 처음 연결 시 호스트 키 자동 추가

    try:
        # SSH 서버에 연결
        print(f"Connecting to {username}@{hostname}:{port}...")
        client.connect(hostname, port, username, password)
        print("Connected successfully!")

        for cmd in commands:
            print(f"\nExecuting command: '{cmd}'")
            stdin, stdout, stderr = client.exec_command(cmd)

            # 표준 출력 및 에러 출력 읽기
            output = stdout.read().decode('utf-8').strip()
            error = stderr.read().decode('utf-8').strip()

            if output:
                print(f"Output:\n{output}")
            if error:
                print(f"Error:\n{error}")

    except paramiko.AuthenticationException:
        print("Authentication failed. Please check your username and password.")
    except paramiko.SSHException as e:
        print(f"SSH connection error: {e}")
    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        # 연결 종료
        if client:
            client.close()
            print("\nConnection closed.")

if __name__ == "__main__":
    # --- 설정 값 변경 필요 ---
    # 실제 리눅스 서버 정보로 변경하세요.
    REMOTE_HOST = 'your_linux_server_ip'  # 예: '192.168.1.100'
    SSH_PORT = 22
    SSH_USERNAME = 'your_username'        # 예: 'ubuntu'
    SSH_PASSWORD = 'your_password'        # 예: 'mysecretpassword'
    # -----------------------

    # 실행할 명령 리스트
    # 'cd /path/to/your/directory' 명령으로 폴더 이동 후, 해당 폴더에서 ls -l 명령 실행
    # 여러 명령을 실행할 경우, 각 명령을 리스트의 요소로 추가합니다.
    commands_to_execute = [
        "cd /home/your_username/test_folder",  # 원하는 리눅스 폴더 경로로 변경
        "ls -l",                              # 폴더 이동 후 파일 목록 확인
        "echo 'Hello from Python on Windows!'" # 간단한 명령 실행 예시
        #"mkdir new_directory"                # 새 디렉토리 생성 (주석 해제 후 사용)
    ]

    run_remote_commands(REMOTE_HOST, SSH_PORT, SSH_USERNAME, SSH_PASSWORD, commands_to_execute)

 

코드 설명

  1. paramiko.SSHClient(): SSH 클라이언트 객체를 생성합니다.
  2. client.set_missing_host_key_policy(paramiko.AutoAddPolicy()): 이 정책은 원격 서버의 호스트 키가 로컬 known_hosts 파일에 없는 경우 자동으로 추가하도록 설정합니다. 보안에 민감한 환경에서는 paramiko.WarningPolicy() 또는 paramiko.RejectPolicy()를 사용하고 호스트 키를 수동으로 확인하는 것이 좋습니다.
  3. client.connect(hostname, port, username, password): 지정된 IP 주소, 포트, 사용자 이름, 비밀번호를 사용하여 원격 리눅스 서버에 SSH 연결을 시도합니다.
  4. client.exec_command(cmd): 원격 서버에서 명령을 실행합니다. 이 함수는 세 개의 파일 객체(stdin, stdout, stderr)를 반환합니다.
    • stdin: 명령에 입력할 데이터를 보낼 때 사용합니다.
    • stdout: 명령의 표준 출력을 읽을 때 사용합니다.
    • stderr: 명령의 표준 에러 출력을 읽을 때 사용합니다.
  5. stdout.read().decode('utf-8').strip(): stdout에서 데이터를 읽고 UTF-8로 디코딩한 후, 앞뒤 공백을 제거합니다.
  6. 에러 핸들링: try-except 블록을 사용하여 paramiko.AuthenticationException (인증 실패) 및 paramiko.SSHException (SSH 연결 관련 에러)를 처리합니다.
  7. client.close(): 모든 작업이 완료되면 SSH 연결을 닫습니다.

 

반응형