프로젝트를 하나 하고 있는데 이미지 전송을 서버끼리 할 필요가 있어서 적용해본 김에 정리합니다.
vscode에서 drag and drop으로 옮기거나, filezilla 등의 gui 툴을 이용할 수 있지만 cli가 적응하면 훨씬 편하고 vscode 같은 경우엔 전송 속도가 너무 느려서 불편합니다. command를 알아보고 테스트하면서 깨달은 바를 나름대로 정리했습니다.
잘못된 정보가 있을 경우에는 댓글로 알려주세요!
[참고]
제가 테스트한 환경은 local은 windows os이고, key파일을 통해 linux 서버에 접속하도록 되어 있습니다.
이 글에서는 파일 전송 명령어를 정리해놓은 것으로 자세한 개념정리 블로그는 아래에 링크 달아두겠습니다.
https://nhj12311.tistory.com/76
SCP
기본적으로 서버에 authentication하는 방식이 key파일을 통해서 이루어지는 방식입니다. 따라서 key파일이 없으면 warning message를 받게 되지만 password를 통해서도 scp가 가능합니다.
1. 로컬-서버 간 파일 전송
로컬에서 서버로 파일 업로드
scp -P <port 번호> <local file path> <username>@<ip>:<path>
로컬 cmd에서 위와 같은 command를 입력해야 합니다. 포트 번호 디폴트는 22이지만 22가 아닌 다른 포트 번호를 사용할 경우 포트 번호를 지정해줘야 합니다.
서버에서 로컬로 파일 다운로드
scp -P <port 번호> <username>@<ip>:<path> <local file path>
upload, download의 순서만 바꿔주면 됩니다. 서버 먼저 local 다음. 마찬가지로 로컬 cmd에서 위와 같은 command를 입력해야 합니다.
위의 코드는 단일 파일 전송의 경우로, 디렉토리 전체를 전송하고 싶다면 -r 옵션을 주면 됩니다.
scp -r -P <port 번호> ...
2. 서버 간 파일 전송
로컬-서버 간 전송과는 크게 다를 것이 없습니다. 다만, serverA에서 serverB로 파일을 전송하거나 하는 경우에는 serverB에 authentication을 build해야 합니다. 따라서, serverB의 password를 알고 있어야 합니다. (처음엔 key파일이 존재하지 않는 것 관련하여 warning이 뜨고 여기서 yes를 누르게 되면, 이후 password를 요구합니다. 따라서 팀원들 간 unix password를 공유해야 합니다.)
엄청 보안이 좋은 방향인지는 확신할 수는 없으나...팀프로젝트 용도로는 얼추 사용 가능할 듯 싶습니다.
vscode 든 뭐든 ssh로 내 서버(serverA)에 접속 후, 다른 서버(serverB)로 데이터를 전송하고자 한다면 다음과 같이 scp 명령어를 사용하면 됩니다.
scp -P <port 번호> <serverA file path> <serverB_username>@<ip>:<path>
잘 보면 명령어는 동일합니다.다만 command를 내리는 환경이 로컬에서 서버로 바뀌었을 뿐입니다.
업로드 이외에도 다운로드도 서버 to 로컬 cmd와 동일합니다.
scp -P <port 번호> <serverB_username>@<ip>:<path> <serverA file path>
SFTP
ssh의 파일 전송 버전으로 sftp 명령어를 통해 수행할 수 있습니다. 포트 번호는 22로 디폴트 지정되어 있습니다. 역시 다른 포트 번호를 사용한다면 -P 옵션을 통해 포트 번호를 지정해야 합니다.
1. 로컬-서버
로컬 cmd에서 다음의 command를 입력합니다.
put (로컬에서 업로드)
sftp -P <port_num> <username>@<ip>
put <filename_to_upload>
get (로컬로 다운로드)
sftp -P <port_num> <username>@<ip>
get <filename_to_download>
2. 서버 간 파일 전송
ssh로 serverA(나의 서버)에 접속 후 다음의 command를 입력합니다.
sftp -P <port_num> <serverB_username>@<ip>
put과 get을 통해 업로드, 다운로드 하는 것은 똑같습니다. 다만 local 환경이 현재 내가 접속하고 있는 서버로 변경되었다고 생각하시면 됩니다.
개인적으로 sftp의 장점은
- 한 번 접속하면 업로드와 다운로드를 한번에 수행할 수 있다는 점 (scp의 경우에는 일회성? 이라는 느낌을 강하게 받았습니다)
- local과 target의 디렉토리 변경과 디렉토리 확인 등의 작업을 동시에 수행할 수 있기 때문에 편리하다는 점을 꼽을 수 있을 것 같습니다.
위에 언급한 장점 2의 경우에는 아래의 코드를 통해 조금 더 이해하기 수월할 것 같습니다.
ssh <serverA_username>@<ip> # serverA에 ssh 접속
sftp -P <port_num> <serverB_username>@<ip> # serverA에서 serverB로 sftp 접속
lls # serverA 환경의 ls를 수행
lcd <path># serverA 환경에서 cd를 수행
ls # serverB 환경의 ls를 수행
cd <path> # serverB 환경에서 cd를 수행
마무리
파일 전송 속도를 테스트해본 결과 대략 90MB/s (업로드)로 scp나 sftp 간 큰 차이는 없었습니다 (근소하게 sftp가 더 빠른 듯하지만, 오차범위 내라고 생각합니다).
어려운 건 없습니다. scp의 경우에는 파일 전송을 일방향으로만 해주기 때문에 업로드와 다운로드 모두 scp 의 구조입니다. 로컬과 서버 간 전송인가 서버와 서버 간 전송인가는 어떤 환경에서 scp command를 날려주느냐의 문제입니다. 또한 서버 간 파일 공유를 위해서는 키파일 혹은 password를 공유해야 할 것입니다.
sftp의 경우에는 파일 전송을 원하는 서버에 sftp 접속을 해준 후, put/get 등의 명령어를 통해 해당 서버와 파일을 주고 받을 수 있습니다. 다만, 로컬에서 파일 전송을 원한다면 로컬에서 sftp 접속을 해주면 될 것이고 서버에서 다른 서버로 파일 전송을 원한다면 서버에서 다른 서버로의 sftp 접속을 해주면 될 것입니다.
어디에서 file transfer 명령을 날려주느냐의 문제인 것 같습니다!