
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("세션 종료.")
주요 포인트 설명
- device_type = 'generic_termserver'
AXGATE는 Netmiko에 공식 지원되지 않으므로 generic_termserver를 사용합니다. 자동 로그인 기능을 비활성화하고 직접 write_channel로 제어합니다. - write_channel + time.sleep
AXGATE 로그인 프롬프트 순서가 Username → Password 순서로 나오는 경우가 많아, 수동으로 채널에 데이터를 넣어줍니다. - read_channel()로 즉시 확인
로그인 후 출력된 내용을 바로 읽어 프롬프트( # 또는 > )가 있는지 확인 → 성공 여부 판단 - send_command_timing()
send_command() 대신 timing 방식을 사용합니다. AXGATE의 프롬프트가 가끔 불규칙하거나 더블 프롬프트가 나올 때 안정적입니다. last_read=3.0초로 여유롭게 설정. - session_log = 'axgate_log.txt'
모든 입출력이 파일로 기록되므로 디버깅할 때 매우 유용합니다. (문제 발생 시 꼭 확인!)
※ 실제 환경에서는 username/password를 코드에 하드코딩하지 말고 .env 파일이나 getpass 모듈을 통한 관리가 권장됩니다.
주의 사항
- time.sleep 값은 네트워크 지연, 장비 응답 속도에 따라 조정 필요
- 포트가 22번이 아닌 경우 반드시 'port' 키 추가
- 로그인 실패 시 session_log 파일을 열어 실제 프롬프트 순서를 확인하세요
- 운영 환경에서는 예외처리 강화 + 재시도 로직 추가 추천
이상으로 Netmiko를 이용한 AXGATE 자동 접속 & 기본 명령어 실행 방법을 알아보았습니다.
다음 포스팅에서는 command.txt 파일에서 명령어 목록을 읽어와 순차적으로 실행하는 방법을 다뤄보겠습니다.
러 장비에 동일한 설정을 한 번에 적용하거나, 점검 명령어를 자동화할 때 매우 유용합니다.
궁금한 점이나 관련하여 궁금하신 부분이 있다면 댓글로 부탁드립니다.
감사합니다!