Python으로 SSH를 제어하기
Python으로 SSH를 제어하기
Python으로 SSH를 제어하기 위한 라이브러리 가이드
Python을 사용하여 원격 서버에 SSH(Secure Shell) 연결을 통해 명령을 실행하거나 파일을 전송할 수 있습니다. 이 글에서는 paramiko
라이브러리를 사용하여 비밀번호를 통해 SSH 연결을 제어하는 방법을 예제와 함께 설명하겠습니다.
1. paramiko
라이브러리 소개
paramiko
는 Python에서 SSH 프로토콜을 사용하여 원격 서버와 통신할 수 있게 해주는 라이브러리입니다. 비밀번호 인증, 공개 키 인증 등 다양한 방식으로 SSH 연결을 할 수 있으며, 이를 통해 명령을 실행하거나 파일을 전송할 수 있습니다.
2. paramiko
설치
paramiko
라이브러리는 파이썬 패키지로 제공되며, pip
명령어를 통해 쉽게 설치할 수 있습니다.
pip install paramiko
3. 비밀번호를 사용한 SSH 연결 및 명령 실행
비밀번호를 사용하여 SSH 연결을 설정한 후, 원격 서버에서 명령어를 실행하는 기본적인 방법을 알아보겠습니다.
(1) SSH 연결 및 명령 실행
아래 예제에서는 비밀번호를 사용하여 원격 서버에 연결한 뒤, ls -l
명령어를 실행하고 결과를 출력하는 방법을 보여줍니다.
import paramiko
# SSH 클라이언트 객체 생성
= paramiko.SSHClient()
ssh
# 자동으로 서버의 SSH 키를 허용하도록 설정
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# SSH 연결 (호스트 주소, 사용자명, 비밀번호)
connect(hostname='example.com', username='your_username', password='your_password')
ssh.
# 원격 서버에서 명령 실행
= ssh.exec_command('ls -l')
stdin, stdout, stderr
# 명령어 실행 결과 출력
print(stdout.read().decode())
# SSH 연결 종료
ssh.close()
이 코드는 Python을 통해 SSH를 사용하여 ls -l
명령어를 원격 서버에서 실행하고, 그 결과를 콘솔에 출력합니다.
(2) 오류 처리
SSH 연결이나 명령 실행 중에 발생할 수 있는 오류를 처리하는 방법입니다. paramiko
는 다양한 예외 처리를 지원하여, 네트워크 문제나 인증 오류를 보다 안정적으로 처리할 수 있습니다.
import paramiko
try:
# SSH 클라이언트 객체 생성
= paramiko.SSHClient()
ssh
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# SSH 연결 (호스트 주소, 사용자명, 비밀번호)
connect(hostname='example.com', username='your_username', password='your_password')
ssh.
# 명령어 실행
= ssh.exec_command('uptime')
stdin, stdout, stderr
# 명령어 실행 결과 출력
print(stdout.read().decode())
except paramiko.AuthenticationException:
print("인증 실패: 사용자 이름 또는 비밀번호가 잘못되었습니다.")
except paramiko.SSHException as ssh_error:
print(f"SSH 오류 발생: {ssh_error}")
except Exception as e:
print(f"기타 오류 발생: {e}")
finally:
# 연결 종료
ssh.close()
주요 예외:
AuthenticationException
: 비밀번호나 사용자 이름이 잘못된 경우 발생SSHException
: SSH 연결이나 통신 중 문제가 발생한 경우- 기타 예외: 네트워크 오류 등
(3) 명령 실행 결과 및 오류 처리
명령어 실행 결과는 stdout
을 통해, 오류는 stderr
를 통해 받아볼 수 있습니다. 이를 통해 명령이 성공적으로 실행되었는지, 오류가 발생했는지 판단할 수 있습니다.
import paramiko
# SSH 클라이언트 객체 생성
= paramiko.SSHClient()
ssh
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())connect(hostname='example.com', username='your_username', password='your_password')
ssh.
# 명령 실행
= ssh.exec_command('ls /invalid_directory')
stdin, stdout, stderr
# 명령어 출력과 오류 메시지 확인
= stdout.read().decode()
output = stderr.read().decode()
error
if error:
print(f"명령 실행 중 오류 발생: {error}")
else:
print(f"명령 실행 결과: {output}")
ssh.close()
위 코드에서 stderr.read()
를 사용하여 명령 실행 중 발생한 오류 메시지를 출력할 수 있습니다.
4. SFTP를 사용한 파일 전송
SSH 연결을 사용하여 파일을 전송할 수 있는 SFTP(Secure File Transfer Protocol)를 활용하면, 로컬 파일을 원격 서버로 전송하거나 반대로 다운로드할 수 있습니다.
import paramiko
# SSH 클라이언트 객체 생성
= paramiko.SSHClient()
ssh
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())connect(hostname='example.com', username='your_username', password='your_password')
ssh.
# SFTP 세션 시작
= ssh.open_sftp()
sftp
# 로컬 파일을 원격 서버로 업로드
'/path/to/local/file.txt', '/path/to/remote/file.txt')
sftp.put(
# 원격 서버의 파일을 로컬로 다운로드
'/path/to/remote/file.txt', '/path/to/local/file.txt')
sftp.get(
# SFTP 및 SSH 연결 종료
sftp.close() ssh.close()
이 코드는 로컬에 있는 파일을 원격 서버로 전송하고, 원격 서버에 있는 파일을 로컬로 다운로드하는 작업을 보여줍니다.
5. 타임아웃 및 세부 설정
SSH 연결 시 타임아웃을 설정하여, 서버 응답이 너무 오래 걸리거나 네트워크 상태가 좋지 않을 때 오류를 처리할 수 있습니다.
import paramiko
try:
# SSH 클라이언트 객체 생성
= paramiko.SSHClient()
ssh
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# SSH 연결 (호스트 주소, 사용자명, 비밀번호, 타임아웃 설정)
connect(hostname='example.com', username='your_username', password='your_password', timeout=10)
ssh.
# 명령어 실행
= ssh.exec_command('whoami')
stdin, stdout, stderr
# 명령어 실행 결과 출력
print(stdout.read().decode())
except paramiko.AuthenticationException:
print("인증 실패: 사용자 이름 또는 비밀번호가 잘못되었습니다.")
except paramiko.SSHException as e:
print(f"SSH 오류: {e}")
except Exception as e:
print(f"기타 오류: {e}")
finally:
ssh.close()