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 응용 프로그램이 연결을 통해 명령을 실행하고 응답을 검색할 수 있습니다.
and close() 메서드는 StartShell open() 디바이스와의 SSH 연결을 설정하고 종료합니다. 따라서 클라이언트 응용 프로그램이 셸에만 액세스해야 하는 경우 and close() 메서드에 대한 Device open() 호출을 생략할 수 있습니다.
Junos PyEZ 릴리스 2.6.7 및 이전 버전에서 인스턴스는 StartShell 기본 SSH 포트 22에 연결됩니다. Junos PyEZ 릴리스 2.6.8 StartShell 부터 인스턴스는 쉘 연결이 여전히 포트 22를 사용하는 다음과 같은 경우를 제외하고는 인스턴스에 Device 정의된 동일한 포트에 연결됩니다.
-
Devicehost'localhost'로 설정됩니다. -
Deviceport830으로 설정됩니다. -
Deviceport정의되지 않았습니다.
쉘에서 명령 실행
메서드는 StartShell run() 셸 명령을 실행하고 응답을 기다립니다. 기본적으로 이 메서드는 명령 출력을 반환하기 전에 기본 셸 프롬프트(%, #, > 또는 $) 중 하나를 기다립니다. 또는 인수를 특정 문자열로 설정할 this="string" 수 있으며 메서드는 명령 출력을 반환하기 전에 예상되는 문자열 또는 패턴을 기다립니다.
반환 값은 튜플입니다. 첫 번째 항목은 종료 코드가 0인 경우와 False 그렇지 않은 경우입니다True. 두 번째 항목은 명령의 출력입니다.
다음 예제는 호스트에 연결하고 쉘에서 두 개의 운영 모드 명령을 실행합니다. 스크립트는 먼저 명령을 실행 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 인스턴스는 컨텍스트 관리자로도 사용할 수 있습니다. 이 경우 and 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)입니다. Bourne 스타일 쉘(애쉬)을 시작하도록 지정할 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
from pprint import pprint
dev = Device(host='router1.example.net')
tables = ['inet.0', 'inet6.0']
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 정의된 동일한 포트에 연결됩니다.