SCP 로 서버에 파일 옮기기

scp 는 ssh 프로토콜을 기반으로 한, 파일이나 디렉토리 등을 로컬에서 서버로, 혹은 서버에서 로컬로 복사해오기 위해 사용하는 파일 전송 프로토콜이다.

두 호스트가 네트워크에 연결되어 있다면, ssh 에서 제공하는 포트를 사용해서(기본은 22 이지만, 관리자가 설정한 포트번호에 따라 바뀜) 파일을 주고받는다.

SCP

기본적으로 명령어 형식은 아래와 같다.

scp [옵션] [파일이 존재하는 경로] [파일을 보낼 경로]

# example
scp -r -P 1234 ../test/dirname username@10.0.0.1:~/test

예시 명령어는, 로컬 컴퓨터에 존재하는 작업 공간 이전 디렉토리의 test 디렉토리의 dirname 디렉토리(../test/dirname) 아래의 모든 파일들(-r)을 포트번호 1234(-P 1234)를 통해, 10.0.0.1 의 IP주소를 갖는 호스트의 username 계정의 홈디렉토리에 복사한다.(username@10.0.0.1:~)

이 때 파일명에 * 같은 와일드카드를 사용하여 여러 파일을 긁어올 수도 있다.


전송 방향

사실 로컬에서 원격지로 파일을 보내는 것이나, 원격지의 파일을 로컬로 가져오는 것이나 그 개념은 같다.

로컬 파일을 원격지로 보낼 때는 scp ./file root@10.0.0.1:~ 의 형식을 따르고, 원격지 파일을 로컬로 가져올 때는 scp root@10.0.0.1:~/file . 처럼 사용한다.

결국 [파일이 존재하는 경로][파일이 도착할 경로]에는 둘 다 사용자명, 아이피주소, : 이후에 이어지는 경로를 넣어줘야 하지만, 로컬 컴퓨터의 current working directory가 기본으로 명시되기 때문에 생략된다고 봐도 된다.

다시 한번 예를 들어서 본다면,

# 2222 포트를 통해,
# ssh 접속할때는 ~/.ssh/id_rsa 라는 ssh키를 사용하고,
# 로컬 컴퓨터의 홈 디렉토리 아래의 code 디렉토리에 있는 .py 로 끝나는 파일들을,
# 123.20.30.10 서버의 bconfiden2 유저의 ~/app/src 경로에 복사한다. 
scp -P 2222 -i ~/.ssh/id_rsa ~/code/*.py bconfiden2@123.20.30.10:~/app/src

# 3333 포트를 통해,
# 123.20.30.10 서버의 bconfiden2 유저의 ~/app 디렉토리 하위에 있는
# 모든 파일들을,
# 로컬의 ../test 디렉토리에 싹 복사한다
scp -P 3333 -r bconfiden2@123.20.30.10:~/app ../test


옵션

옵션은 다른 명령어에 비해 많지 않다. ssh 의 옵션과도 유사한데, 아래 명령어는 자주 사용되는 것들만 나열했다. 소문자 P 와 대문자 p 가 다르다는 점을 주의해야 한다.

-v : 통신 과정을 자세하게 찍어주는 verbose
-r : 하위 디렉토리의 파일들까지 재귀적으로 복사
-P : ssh 포트 지정
-i : ssh key 같은 IdentityFile 의 경로를 지정하여 접속

더 많은 옵션은 여기에서 확인할 수 있다.