Development/파이썬 [Python]

[Python] 파이썬 ssh 를 통한 업무 자동화

요체크다 2020. 12. 31. 12:38
반응형

 ssh를 사용하는 환경(ex, Unix/Linux 서버)인 경우 파이썬에서 제공하는 "paramiko" 라이브러리를 설치하여 손쉽게 ssh 접속하여 원하는 작업을 자동화하여 사용할 수 있습니다. 물론 기존에도 쉘 스크립트를 통해 어느 정도 자동화가 가능하지만 파이썬에서 제공되는 자동화에 비하면 한계점(ex, 쉘 스크립트 최초 배포, 쉘 수정 시 배포 필요 등) 들이 있어 파이썬을 통한 업무 자동화를 개인적으로는 추천드립니다.

 

 기존에 ssh 접속하여 직접 Command를 실행하였던 작업들 또는 수작업으로 특정 파일을 업로드/다운로드하였던 부분들을 이젠 좀 더 쉽고 고급스럽게 자동화하여 사용이 가능합니다.

 이런 기능을 본인의 업무 환경에 맞게 잘 활용한다면 여러분들의 업무 효율성을 조금이나마 높을 수 있을 것이라고 생각합니다.

 

 우선 해당 기능을 사용하기 위해서는 늘 그래 왔듯이 paramiko 라이브러리가 사전에 설치가 되어 있어야 하며, 당연히 ssh 접속하고자 하는 대상 장비에 ssh가 설치 및 활성화되어 있어야 하는 점 참조 바랍니다.

 저 같은 경우 모든 작업을 파이참을 통해 이루어지다 보니 파이참을 통해 paramiko 2.5.0 버전을 설치하였습니다.

( ※ 파이참이 아닌 pip 명령어로 설치하는 경우 "pip install paramiko==2.5.0" 명령어를 통해 설치 진행하셔도 됩니다.)

[ paramiko 설치 화면 ]


1. ssh 접속하기

 ssh 접속은 아래와 같이 몇 줄 안 되는 코드로 통해 손쉽게 접속이 가능합니다.

import paramiko

try:
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
    ssh.connect("192.168.0.236", username="root", password="abc123")    # 대상IP, User명, 패스워드 입력
    print('ssh connected.')    # ssh 정상 접속 후 메시지 출력

    ssh.close()   # ssh 접속하여 모든 작업 후 ssh 접속 close 하기


except Exception as err:
    print(err)    # ssh 접속 실패 시 ssh 관련 에러 메시지 출력

 정상적으로 ssh 접속이 되는 경우 "ssh connected." 메시지가 출력 될 것이고, 만약 ssh 접속이 안 되는 경우는 아래와 같이 ssh 에러 메시지가 출력될 것입니다.

[ ssh 접속 에러 시 ]


2. 명령어 실행

 특정 명령어를 실행하는 경우 위 예제 코드에서 print('ssh connected.') 부분과 ssh.close() 사이에 아래 코드를 넣어 사용하시면 됩니다. 저 같은 경우에는 디렉토리 및 파일 리스트를 확인하는 예제이기 때문에 리스트 결과를 화면에 출력까지 하는 것이며, 만약 실행하고자 하는 명령어가 리턴 받을 내용이 없다고 하면 명령어(ssh.exec_command 부분)만 활용하셔도 됩니다.

 

stdin, stdout, stderr = ssh.exec_command("ls -l")   # ssh 접속한 경로에 디렉토리 및 파일 리스트 확인 명령어 실행
lines = stdout.readlines()
for i in lines:    # for문을 통해 명령어 결과값 출력.
    re = str(i).replace('\n', '')
    print(re)

 

[ 명령어 실행 결과 확인 ]


3. 파일 업로드/다운로드

 paramiko 라이브러리를 통해 작업하고자 하는 대상 장비에 sftp로 접속하여 파일을 업로드/다운로드가 가능합니다.

예제 코드는 아래와 같습니다. 저 같은 경우 프로젝트 디렉토리 내에 위치한 "upload_file.txt" 파일을 /tmp 디렉토리에 업로드하였습니다.

 

1) 업로드

import paramiko

try:
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
    ssh.connect("192.168.0.236", username="root", password="abc123")    # 대상 IP, User명, 패스워드 입력
    print('ssh connected.\n')

    # File Upload
    sftp = ssh.open_sftp()
    sftp.put('.\\upload_file.txt', '/tmp/upload_file.txt')
    print('sftp upload success.\n')

    ssh.close()

except Exception as err:
    print(err)

 파일이 정상적으로 업로드되면 아래와 "sftp upload success." 메시지가 출력이 될 것이며, 대상 서버에 접속해 보면 업로드한 파일이 업로드된 것을 확인할 수 있습니다.

[ 파일 업로드 완료 ]
[ 대상 서버에 파일 업로드 완료 ]

2) 다운로드

 파일을 다운로드하는 경우 위 예제 코드에서 "sftp.put('.\\upload_file.txt', '/tmp/upload_file.txt')" 이 부분을 아래와 같이 변경하여 사용하시면 됩니다.

 저 같은 경우에는 "/tmp/download_file.txt" 파일을 현재 프로젝트 디렉토리로 다운로드하도록 하겠습니다.

sftp.get('/tmp/download_file.txt', '.\\download_file.txt')

 

 

 

 

 

 

반응형