파이썬 팁

paramiko example - invoke_shell 장시간 돌아가는 프로그램 원격 실행 방법-완료시점 자동모니터링-예제코드

gomming 2021. 2. 16. 01:41

python paramiko 라이브러리 이용 꿀팁입니다.

해당 코드는 아래의 경우 유용하게 사용될 수 있습니다.

1) paramiko를 사용하여 putty와 같이 하나의 세션에서 여러가지 명령어를 실행해야 하는 경우

2) 실행 되는 커맨드가 장시간 동작하며, 완료시간이 명확하지 않은 경우.

3) 커맨드의 작업이 완료되는 시간에 맞춰 자동으로 세션을 종료 시키고 싶은 경우.

자! 아래의 간단한 코드를 서버에서 돌릴 예정입니다.

이용되는 코드는 완료되는 시간을 명확히 알 수 있습니다.

하지만 제가 소개드리는 코드를 적용하면, 완료되는 시간이 명확하지 않은 경우에도 이용하실 수 있습니다.

import time 
for i in range(20):
	print ("Hello, gomming!") 
    time.sleep(1) 
print ('termination')

동작 시키면 일정시간 간격으로 문자열을 출력하도록 되어 있습니다.

 

 

그럼 해당 스크립트를 서버에 옮겨 놓고 원격으로 실행해보겠습니다.

사용되는 코드는 아래와 같습니다.

import paramiko, time

def waitStrems(chan): 
    time.sleep(1) 
    outdata=errdata = "" 
    while chan.recv_ready(): 
        outdata += str(chan.recv(1000))      
    while chan.recv_stderr_ready(): 
        errdata += str(chan.recv_stderr(1000)) 
    return outdata, errdata


passwd=input("pw:")

connection = paramiko.SSHClient()

connection.set_missing_host_key_policy(paramiko.AutoAddPolicy())

connection.connect('172.30.1.38', username='pi', password=passwd, look_for_keys=False, allow_agent=False)

channel = connection.invoke_shell()
channel.settimeout(9999)

channel.send("cd /home/pi/py\n")
outdata, errdata = waitStrems(channel)
print(outdata)

channel.send("python printing.py\n")
status='Normal'
while status!='End':
    time.sleep(1)
    resp = str(channel.recv(9999))
    print(resp)
    if resp.count('termination')>0:
        status='End'

print('Thank you!')

channel.close()

코드설명

실행하면 패스워드를 입력 받고 SSH접속하여,

스크립트가 있는 경로로 이동하여 실행합니다.

장시간 돌아가는 작업이라면 channel.settimeout(시간) 을 정의해줘야 합니다.

안그러면 중간에 timeout으로 종료 됩니다.

조건이 충족되면 종료되도록 할 것이기 때문에 아주 긴 시간을 적용해 주었습니다.

조건 충족 여부를 확인하기 위해 while 문을 이용하여 완료 신호를 검색 하도록 하였습니다.

status 변수는 처음에는 Normal이라는 문자열이지만 출력되는 응답에서 termination이라는 문자가 하나라도 포함되어 있으면 status를 End문자열로 변경하여 while문이 종료 됩니다.

while문이 종료되면 'Thank you!' 문자가 출력되고 세션이 종료 됩니다.

실행 결과 

 

 

잘 실행되는 것을 볼 수 있습니다.

후기

구글 검색 아무리해도 간결하게 나온 샘플이 없어 직접 작성해서 실무에 적용하게 되었는데요.

아무래도 위와 같은 상황이 많을 것이기 때문에 아주 간단하게 작성하여 소개드리면 도움이 되어 드릴 수 있으리라 생각 되었습니다.

질문이나 요청, 기타 의견 있으시면 언제나 댓글로 남겨 주시길 바랍니다.