개요
리눅스에서 파일 전송 로직을 자동화하기 위해 scp 명령어를 사용하던 도중 폴더 이동 관련 이슈가 발생하여 기록한다.
scp 명령어란?
scp(secure copy)는 로컬 시스템과 원격 서버 간에 파일 및 폴더를 복사하는 명령어로 SSH(보안 쉘) 프로토콜을 사용하여 데이터를 암호화하고 전송한다.
scp 명령어는 다음과 같은 형식으로 사용된다.
# remote_host의 destination_folder로 example.txt 파일 전송
scp example.txt username@remote_host:/destination_folder
폴더를 복사하고 싶을 땐 -r 옵션을 통해 아래와 같이 사용할 수 있다.
# remote_host의 destination_folder로 example_folder 폴더 전송
scp -r example_folder username@remote_host:/destination_folder
주의할 점
위에서 설명한 내용 중 폴더 복사의 경우 목적지 폴더의 존재 유무에 따라 동작이 달라지므로 주의가 필요하다.
- 원격 서버에 목적지 폴더가 없는 경우 : 목적지 폴더 생성 및 로컬 폴더의 내용물을 목적지 폴더에 복사
- 원격 서버에 목적지 폴더가 있는 경우 : 목적지 폴더에 로컬 폴더 폴더 통째로 복사
위의 방식으로 동작하기 때문에 자동화 배포 등으로 인해 동일한 폴더 복사 명령어를 계속 사용하도록 구축할 때,
최초에 원격 서버에 목적지 폴더가 없다면,
최초에는 목적지 폴더가 생성되고 그 안에 로컬 폴더의 내용물이 들어가고,
이후에는 목적지 폴더 안에 로컬 폴더가 그대로 들어가게 된다.
해당 동작은 파일 이동 명령어인 mv 명령어와도 동작 방식이 비슷하다.
mv 명령어로 폴더를 다른 폴더로 이동할 때,
목적지 폴더가 없으면 로컬 폴더의 이름이 목적지 폴더로 바뀌면서 그 폴더 내에 내용물이 담긴다.
이러한 동작 방식으로 인해 mv 명령어는 폴더 및 파일의 이름 변경 목적으로 주로 사용되기도 한다.
하지만 목적지 폴더가 있는 경우에는 그 목적지 폴더 안에 로컬 폴더가 그대로 이동된다.
mv example_folder destination_folder
해결 방안
위의 경우처럼 폴더의 존재 여부에 따라 달리 동작하는 경우를 방지하고 싶을 땐 아래와 같이 로컬 폴더의 내용물을 목적지 폴더로 복사하도록 수정할 수 있다.
# remote_host의 destination_folder로 example_folder 폴더의 내용물 전송
scp -r example_folder/* username@remote_host:/destination_folder
위의 명령어로 변경하여 실행하면 목적지 폴더가 없는 경우 폴더가 없다고 에러를 발생시키므로 기능을 구현할 때 해당 이슈를 확인하고 수정할 수 있게 된다.
추후 스크립트로 자동화하는 경우 전송 전에 목적지 폴더가 없을 때 폴더를 생성하는 명령어를 추가하여 폴더 유무와 상관없이 동일한 동작이 진행되도록 설정할 수 있다.
# destination_folder가 존재하지 않는 경우 생성
if [ ! -d "destination_folder" ]; then mkdir "destination_folder"; fi
'Linux' 카테고리의 다른 글
[Linux] pem key로 서버 접속하기 (0) | 2023.07.19 |
---|