• 2020. 8. 6.

    by. 윈썸지니

    반응형

    이번 포스팅은 파이썬을 사용하여 ssh 클라이언트 통신하는 방법에 대한 내용입니다.

     

    얼마전에 VPN 장비가 연결이 안되는 경우가 발생이되어 주기적으로 VPN 장비의 상태를 모니터링 하기 위한 프로그램이 필요하였습니다.

     

    VPN 장비는 ssh 로 접속하여 상태를 확인 할 수 있는 명령어를 실행하여 결과값으로 상태를 모니터링 할 수 있습니다.

    파이썬은 ssh 통신을 할 수 있는 라이브러리를 제공해 주므로 쉽게 ssh 통신을 할 수 있는 프로그램을 작성 할 수 있습니다.

    파이썬은 정말  좋네요.

     

    파이썬에서 ssh 통신을 하기 위한 라이브러리는 paramiko 입니다.

    paramiko를 사용하여 VPN에 접속 후 명령어를 실행하여 화면에 출력해 주는 결과 값을 변수로 받아오는 프로그램을 작성해 보겠습니다.

     

    먼저 일반적으로 사용하는 ssh 통신 방법을 알아봅니다.

    일반적인 사용법을 알아보고 이를 파이썬으로 개발해 봅니다.

     

    테스트 시스템은 ssh 서버 시스템은 리눅스 시스템 입니다.

     

    1. Putty 같은 프로그램으로 접속합니다.

     

    2. 계정과 패스워드를 입력하여 접속합니다.

     

    3. vmstat 1 3 을 입력하여 실행해 봅니다. 실제 예제 프로그램에서 사용 할 명령어 입니다.

        결과값도 확인합니다.

     

    파이썬에 paramilko 라이브러리는 기본 모듈이 아니기 때문에 아래와 같이 설치 합니다.

    C:\> pip3 install paramiko

     

    파이썬을 실행해서 아래와 같이 import 해 보면 현재 설치 되어 있는지 알 수 있습니다.

    처음엔 없다고 오류가 발생하고 설치 해 주고 나서 다시 import 하니 오류가 발생하지 않습니다.

    Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32

    Type "help", "copyright", "credits" or "license()" for more information.

    >>> import paramiko

    Traceback (most recent call last):

      File "<pyshell#0>", line 1, in <module>

        import paramiko

    ModuleNotFoundError: No module named 'paramiko'

    >>> import paramiko

    >>>

     

    간단한 예제를 작성하였습니다.  파일명은 test_ssh.py 라고 저장하였습니다.

    아래 예제는 ssh 로 통신하여 vmstat 1 3 이라는 명령어를 실행하고 화면으로 출력되는 결과 값을 라인 단위로 출력하는 프로그램입니다.

     

    참고로 vmstat 는 리눅스에서 메모리 사용량을 알아보는 명령어로 vmstat 1 3 이면 vmstat 1초 간격으로 3번 출력하라는 명령어 입니다.

    import paramiko

    def ssh_get( ):

        try:

            cli = paramiko.SSHClient()

            cli.set_missing_host_key_policy( paramiko.AutoAddPolicy())

            cli.connect( ‘192.xxx.xxx.xxxxx’, username=‘root’, password=‘xxxxx)

            ( stdin, stdout, stderr ) = cli.exec_command( ‘vmstat 1 3’ )

            for line in stdout:

                print(line)

            cli.close()

     

        except Exception as err:

            print( "프로그램에서 오류가 발생하여 종료합니다. " )

    try:

       

        ssh_get( )

    except Exception as err:

        print( "프로그램에서 오류가 발생하여 종료합니다. " )

    위의 소스코드를 실행하면 putty  터미널 창에서 실행했던 명령어의 결과 값을 받아 출력해 주는 것을 알 수 있습니다.

    C:\py_test>python test_ssh.py

    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

     0  0 144084 219956      0 1335208    0    0     0     5    1    1  1  1 98  0  0

     1  0 144084 219896      0 1335400    0    0     0    12  970 1344  2  1 97  0  0

     0  0 144084 219804      0 1335344    0    0     0     4  538  910  1  0 99  0  0

     

    위의 간단한 예제 소스를 설명합니다.

     

    ssh 클라이언트 객체를 생성합니다.

     cli = paramiko.SSHClient()

     

    처음 접근시 Host Key를 받아야 하는데 putty 를 사용할 때 처음 접속 시 팝업으로 host key를 받을 것인지 묻는 팝업 창이 뜹니다.

    우리는 습관적으로 그냥 “yes” 버튼을 누르는데 이것을 말합니다.

    yes 를 해야 하기 때문에 paramiko.AutoAddPolicy() 를 사용합니다.

     cli.set_missing_host_key_policy( paramiko.AutoAddPolicy())

     

    이제 호스트 키도 받았으므로 접속을 합니다. IP, 계정 ID, 패스워드 의 정보를 주고 접속합니다.

     cli.connect( ‘192.xxx.xxx.xxxxx’, username=‘root’, password=‘xxxxx)

     

    수행하는 명령어를 인수로 전달합니다.

    그러면 리턴 값이 stdin, stdout, strerr 튜플로 결과가 반환됩니다.

    화면에서 출려되는 결과 값은 strout 에 저장 됩니다.

    만약 오류가 발생하면 strerr 에 저장됩니다.

     ( stdin, stdout, stderr ) = cli.exec_command( ‘vmstat 1 3’ )

     

    접속을 했으니 접속을 끈어 주어야 합니다.  close() 로 접속을 종료합니다.

     cli.close()

     

    이상으로 파이썬으로 SSH 통신하는 방법을 간단히 알아보았습니다.

    반응형