느리지만 단단한 IT 인프라 이야기

Coding/Python

[Python] Nemiko를 통한 Axgate 자동 로그인 & 단일 명령어 전송

바둑이 아저씨 2026. 1. 14. 22:49

 

python netmiko ( 출처 : moisio.fr )

 

UTM 장비를 자주 다루다 보면 CLI 명령어를 반복 입력하는 일이 많습니다.

이번 포스팅에서는 Python + Netmiko 라이브러리를 활용해 AXGATE 장비에 자동으로 로그인하고 명령어를 전송하는 방법을 소개합니다.

특히 AXGATE는 표준 vendor 지원이 없기 때문에 generic_termserver device_type을 사용하고, 로그인 과정을 수동으로 제어하는 방식으로 구현했습니다.


사용 환경 및 준비물

  • Python 3.8 이상
  • pip install netmiko
  • AXGATE SSH 포트 (기본 22번이 아닌 2222번 등 비표준 포트 사용 예시)
  • session_log 활성화 → 디버깅 유용하게 활용 가능

전체 코드 예시

import time
from netmiko import ConnectHandler

axgate_device = {
    'device_type': 'generic_termserver',
    'host': '192.168.100.1',
    'username': 'axadmin',
    'password': 'Admin12#$',
    'port': 2222,
    'session_log': 'axgate_log.txt',
}

net_connect = None  # 초기화

try:
    print(f"Connecting to {axgate_device['host']}...")
    net_connect = ConnectHandler(**axgate_device)
    time.sleep(2)
   
    # Step 1: 프롬프트에 username 먼저 전송
    print("Step 1: Username 전송 중...")
    net_connect.write_channel(axgate_device['username'] + "\n")
    time.sleep(1)
   
    # Step 2: Password 전송
    print("Step 2: Password 전송 중...")
    net_connect.write_channel(axgate_device['password'] + "\n")
    time.sleep(2)
   
    # Step 3: 로그인 성공 여부 확인 (프롬프트 '#' 포함 여부)
    output = net_connect.read_channel()
    print(f"--- 수신된 데이터 ---\n{output}\n-------------------")
   
    if "#" in output or ">" in output:
        print("로그인 성공!")
        # 명령어 전송 (timing 방식 사용 - AXGATE 프롬프트 패턴이 불규칙할 때 안정적)
        res = net_connect.send_command_timing("sh os list", last_read=3.0)
        print(f"명령어 결과:\n{res}")
    else:
        print("프롬프트(#)를 찾지 못했습니다. axgate_log.txt를 확인하세요.")
   
except Exception as e:
    print(f"오류 발생: {e}")
   
finally:
    if net_connect:
        net_connect.disconnect()
        print("세션 종료.")

주요 포인트 설명

  1. device_type = 'generic_termserver'
    AXGATE는 Netmiko에 공식 지원되지 않으므로 generic_termserver를 사용합니다. 자동 로그인 기능을 비활성화하고 직접 write_channel로 제어합니다.

  2. write_channel + time.sleep
    AXGATE 로그인 프롬프트 순서가  Username     Password 순서로 나오는 경우가 많아, 수동으로 채널에 데이터를 넣어줍니다.

  3. read_channel()로 즉시 확인
    로그인 후 출력된 내용을 바로 읽어 프롬프트( # 또는 > )가 있는지 확인 → 성공 여부 판단

  4. send_command_timing()
    send_command() 대신 timing 방식을 사용합니다. AXGATE의 프롬프트가 가끔 불규칙하거나 더블 프롬프트가 나올 때 안정적입니다. last_read=3.0초로 여유롭게 설정.

  5. session_log = 'axgate_log.txt'
    모든 입출력이 파일로 기록되므로 디버깅할 때 매우 유용합니다. (문제 발생 시 꼭 확인!)

※ 실제 환경에서는 username/password를 코드에 하드코딩하지 말고 .env 파일이나 getpass 모듈을 통한 관리가 권장됩니다.


주의 사항

  • time.sleep 값은 네트워크 지연, 장비 응답 속도에 따라 조정 필요
  • 포트가 22번이 아닌 경우 반드시 'port' 키 추가
  • 로그인 실패 시 session_log 파일을 열어 실제 프롬프트 순서를 확인하세요
  • 운영 환경에서는 예외처리 강화 + 재시도 로직 추가 추천

이상으로 Netmiko를 이용한 AXGATE 자동 접속 & 기본 명령어 실행 방법을 알아보았습니다.

다음 포스팅에서는 command.txt 파일에서 명령어 목록을 읽어와 순차적으로 실행하는 방법을 다뤄보겠습니다.
러 장비에 동일한 설정을 한 번에 적용하거나, 점검 명령어를 자동화할 때 매우 유용합니다.


궁금한 점이나 관련하여 궁금하신 부분이 있다면 댓글로 부탁드립니다.
감사합니다!