SSH를 통해 한 서버에서 다른 서버로 파일을 복사하는 가장 간단한 방법은 scp 명령어를 사용하는 것입니다. 파이썬에서 scp 명령어를 호출하려면 subprocess 모듈이 필요합니다.
방법 1: subprocess 모듈로 scp 명령어 실행
import subprocess p = subprocess.Popen(["scp", "my_file.txt", "username@server:path"]) sts = os.waitpid(p.pid, 0)
waitpid 호출은 파일 복사 작업이 완료될 때까지 대기하기 위해 반드시 필요합니다. 이 호출이 없으면 복사가 끝나기 전에 스크립트가 종료될 수 있으므로 주의해야 합니다.
방법 2: paramiko와 scp 라이브러리 활용
또 다른 방법은 SSH 연결을 직접 열고 scp 모듈을 사용하는 것입니다. 이 방식은 외부 프로세스를 실행하지 않고 순수 파이썬 코드 내에서 처리할 수 있어 더 유연한 제어가 가능합니다.
from paramiko import SSHClient
from scp import SCPClient
ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect('user@server:path')
with SCPClient(ssh.get_transport()) as scp:
scp.put('my_file.txt', 'my_file.txt') # my_file.txt를 서버로 복사위 예제에서 paramiko는 파이썬으로 SSH 프로토콜을 구현한 라이브러리이며, SCPClient는 해당 연결 위에서 파일 전송을 담당합니다. put() 메서드로 로컬 파일을 서버에 업로드하고, 반대로 서버에서 로컬로 가져올 때는 get() 메서드를 사용하면 됩니다.
사전 준비 사항
두 번째 방법을 사용하려면 먼저 필요한 라이브러리를 설치해야 합니다.
pip install paramiko scp
두 방법의 비교
- subprocess 방식: 구현이 간단하고 시스템에 설치된 ssh/scp 도구를 그대로 활용하지만, OS 환경에 의존적입니다.
- paramiko + scp 방식: 순수 파이썬으로 동작하여 크로스 플랫폼 호환성이 뛰어나고, 진행 상황 콜백 등 세부적인 제어가 가능합니다.
간단한 일회성 복사라면 subprocess 방식으로 충분하고, 반복적인 자동화 작업이나 오류 처리가 중요한 환경이라면 paramiko 기반 방식을 권장합니다.