Junos PyEZ를 사용하여 Junos 디바이스의 셸에 액세스
요약 Junos PyEZ를 사용하여 Junos 디바이스의 셸에 연결하고 명령을 실행합니다.
StartShell 개요
Junos CLI에는 많은 셸 명령에서 반환되는 정보와 유사한 정보를 반환하는 많은 운영 모드 명령이 있습니다. 따라서 Junos 디바이스의 UNIX 레벨 셸에 액세스할 필요는 없습니다. 그러나 경우에 따라 사용자 또는 애플리케이션이 셸에 액세스하여 셸 명령을 실행하거나 셸에서 CLI 명령을 실행해야 할 수 있습니다.
Junos PyEZ jnpr.junos.utils.start_shell
모듈은 클래스를 정의 StartShell
하며, 이를 통해 Junos PyEZ 애플리케이션이 Junos 디바이스에 대한 SSH 연결을 시작하고 셸에 액세스할 수 있습니다. StartShell
메서드를 사용하면 응용 프로그램에서 연결을 통해 명령을 실행하고 응답을 검색할 수 있습니다.
StartShell
open()
및 close()
메서드는 디바이스와의 SSH 연결을 설정하고 종료합니다. 따라서 클라이언트 응용 프로그램이 셸에만 액세스해야 하는 경우 및 close()
메서드에 Device
open()
대한 호출을 생략할 수 있습니다.
Junos PyEZ 릴리스 2.6.7 및 이전 StartShell
버전에서는 인스턴스가 기본 SSH 포트 22에 연결됩니다. Junos PyEZ 릴리스 2.6.8 StartShell
부터 인스턴스는 셸 연결이 여전히 포트 22를 사용하는 다음과 같은 경우를 제외하고 인스턴스에 정의된 Device
것과 동일한 포트에 연결됩니다.
-
Device
host
은(는) 'localhost'로 설정됩니다. -
Device
port
이 830으로 설정되어 있습니다. -
Device
port
이(가) 정의되지 않았습니다.
셸에서 명령 실행
이 StartShell
run()
메서드는 셸 명령을 실행하고 응답을 기다립니다. 기본적으로 메서드는 명령 출력을 반환하기 전에 기본 셸 프롬프트(%, #, > 또는 $) 중 하나를 기다립니다. 또는 인수를 this="string"
특정 문자열로 설정할 수 있으며, 메서드는 명령 출력을 반환하기 전에 예상되는 문자열이나 패턴을 기다립니다.
반환 값은 튜플입니다. 첫 번째 항목은 True
종료 코드가 0인 경우이고 False
, 그렇지 않은 경우입니다. 두 번째 항목은 명령의 출력입니다.
다음 예제에서는 호스트에 연결하고 셸에서 두 개의 작동 모드 명령을 실행합니다. 스크립트는 먼저 명령을 실행하고 request support information
출력을 파일에 저장합니다. 그런 다음 스크립트는 명령을 실행 show version
하고, 출력을 version
변수에 저장한 다음, 변수의 내용을 출력합니다.
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell dev = Device(host='router1.example.net') ss = StartShell(dev) ss.open() ss.run('cli -c "request support information | save /var/tmp/information.txt"') version = ss.run('cli -c "show version"') print (version) ss.close()
반환된 튜플에는 명령의 종료 코드와 명령의 명령 출력에 해당하는 부울이 show version
포함됩니다. 이 예제의 출력은 간결성을 위해 잘립니다.
(False, '\r \rHostname: router1\r\nModel: mx104\r\nJunos: 17.1R8\r\nJUNOS Base OS boot [17.1R1.8]\r\n ...)
클래스의 인스턴스를 StartShell
컨텍스트 관리자로 사용할 수도 있습니다. 이 경우 및 close()
메서드를 명시적으로 호출할 StartShell
open()
필요가 없습니다. 예를 들어:
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell dev = Device(host='router1.example.net') with StartShell(dev) as ss: ss.run('cli -c "request support information | save /var/tmp/information.txt"') version = ss.run('cli -c "show version"') print (version)
쉘 유형을 지정하는 방법
Junos PyEZ 릴리스 2.6.4 StartShell
부터 원격 스크립트 내에서 이 인수를 지원 shell_type
하여 셸 유형을 지정합니다. 는 다음 셸 유형을 지원합니다. StartShell
-
C 쉘(csh)
-
본식 쉘(재)
기본적으로 StartShell
인스턴스는 C 쉘(csh) 유형입니다. 본 스타일 쉘(ash)을 시작하도록 지정할 shell_type="sh"
수도 있습니다. 예를 들어:
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell dev = Device(host='router1.example.net') with StartShell(dev, shell_type="sh") as ss: version = ss.run('cli -c "show version"') print (version)
시간 제한을 지정하는 방법
인수를 StartShell
timeout
포함하여 시간이 초과되기 전에 유틸리티가 예상 문자열 또는 패턴을 기다려야 하는 시간(초)을 지정할 수 있습니다. 시간 제한을 지정하지 않으면 기본값은 30초입니다.
예상 문자열은 인수에 this
정의된 값입니다. 를 정의 this
하지 않으면 예상되는 문자열은 기본 쉘 프롬프트 중 하나입니다. 대신 특수 값을 this=None
설정하는 경우, 디바이스는 반환되지 않는 셸 명령 실행에 설명된 대로 명령 출력을 캡처하기 전에 시간 초과 기간 동안 대기합니다.
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell dev = Device(host='router1.example.net') with StartShell(dev) as ss: ss.run('cli -c "request support information | save /var/tmp/information.txt"', timeout=60) version = ss.run('cli -c "show version"') print (version)
명령 실행을 엇갈리게 하는 방법
경우에 따라 메서드에 대한 run()
여러 호출을 실행하거나 반복할 수 있습니다. 출력을 안정화하기 위해 인수를 지정할 수 있습니다 sleep
. 인수는 sleep
디바이스가 버퍼에서 데이터를 받기 전에 지정된 시간(초) 동안 대기하도록 지시합니다. 초 미만의 정밀도를 위해 부동 소수점 숫자로 정의할 sleep
수 있습니다.
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell dev = Device(host='router1.example.net') tables = ['inet.0', 'inet.6'] with StartShell(dev) as ss: for table in tables: command = 'cli -c "show route table ' + table + '"' rsp = ss.run(command, sleep=5) pprint (rsp)
반환되지 않는 셸 명령 실행
어떤 경우에는 로컬 라우팅 엔진에서 시작되거나 종료되는 트래픽을 표시하는 명령과 같이 monitor traffic
반환되지 않는 쉘 명령을 실행해야 할 수도 있습니다. Junos CLI monitor traffic
에서 명령은 사용자가 Ctrl+c 키보드 시퀀스를 전송하여 패킷 캡처를 중지할 때까지 실시간으로 정보를 표시합니다.
인수this=None
를 StartShell
run()
포함하여 메서드를 사용하여 반환되지 않는 셸 명령을 실행할 수 있습니다. 인수를 this=None
포함하면 메서드는 지정된 시간 제한 값이 될 때까지 기다렸다가 셸에서 모든 명령 출력을 검색하고 반환합니다. 이 경우 반환된 튜플의 첫 번째 항목은 실행된 셸 명령의 결과가 콘텐츠를 반환할 때이고 True
두 번째 항목은 명령 출력입니다. 인수를 this
생략하거나 특정 문자열 또는 패턴과 동일하게 설정하면 명령 출력 내에서 기본 프롬프트 또는 지정된 문자열 패턴이 발견될 경우 메서드가 반환되지 않는 명령에 대한 부분 출력을 반환할 수 있습니다.
다음 샘플 코드에서는 monitor traffic interface fxp0
명령을 실행하고 15초 동안 기다린 다음 명령 출력을 검색하여 반환합니다.
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell from pprint import pprint dev = Device(host='router1.example.net') with StartShell(dev) as ss: pprint(ss.run('cli -c "monitor traffic interface fxp0"', this=None, timeout=15))
변경 내역 테이블
기능 지원은 사용 중인 플랫폼 및 릴리스에 따라 결정됩니다. 기능 탐색기 를 사용하여 플랫폼에서 기능이 지원되는지 확인합니다.
StartShell
부터 인스턴스는 호스트가 localhost로 설정되거나 포트가 830 또는 정의되지 않은 경우를 제외하고 인스턴스에 정의된
Device
것과 동일한 포트에 연결됩니다.