로컬 서버에서 다른 원격 서버로 파일을 복사하려고 했더니, 아래와 같이 No such file or directory 에러가 발생했다.
No such file or directory 메시지가 발생하는 원인은 여러 가지가 있지만 여기에서는 원격지에 /home/test_user/python_mail이라는 디렉터리가 없어서 발생했다.
즉, 원격지에 /home/test_user/scp_test/python_mail이라는 경로의 디렉터리를 생성해주면 해결된다.
다만 이 글에서는 자동화 등의 이유로 다른 세션으로 원격지에 직접 접속하지 않고 sshpass를 이용해서 이 문제를 해결하고자 한다.
sshpass를 이용하므로 원격지에서 사용할 계정 정보를 가지고 있어야 하며, ssh 접속을 허용하고 있어야 한다.
해결 방법
1. 원격지에 복사 위치의 경로가 존재하는지 확인
sshpass -p 'PASSWORD' ssh USERNAME@IP "[ ! -d /REMOTE/DIRECTORY/PATH ] && echo 'not exist'"
# 예시
sshpass -p 'PASSWORD' ssh -o StrictHostKeyChecking=no test_user@13.125.2.123 "[ ! -d /home/test_user/scp_test/python_mail ] && echo 'not exist'"
2. 경로가 존재하지 않으면 생성
mkdir -p는 생성하고자하는 디렉터리의 중간 경로가 없을 때 자동으로 생성해주는 옵션이다.
sshpass -p 'PASSWORD' ssh USERNAME@IP "[ ! -d /REMOTE/DIRECTORY/PATH ] && mkdir -p /REMOTE/DIRECTORY/PATH"
# 예시
sshpass -p 'PASSWORD' ssh -o StrictHostKeyChecking=no test_user@localhost "[ ! -d /home/test_user/scp_test/python_mail ] && mkdir -p /home/test_user/scp_test/python_mail"
# 경로 존재 확인
sshpass -p 'PASSWORD' ssh USERNAME@IP "[ -d /REMOTE/DIRECTORY/PATH ] && echo 'exist'"
# 예시
sshpass -p 'PASSWORD' ssh -o StrictHostKeyChecking=no test_user@13.125.2.123 "[ -d /home/test_user/scp_test/python_mail ] && echo 'exist'"
3. 파일 복사
scp /LOCAL/FILE/PATH/FILENAME.example USERNAME@IP:/REMOTE/DIR/PATH/FILENAME.example
#예시
scp ./python_mail/mail_sender.py test_user@13.125.2.123:~/scp_test/python_mail/mail_sender.py
실제로 경로도 잘 생성되었고, 파일도 잘 복사가 된 것을 확인할 수 있다.
위 과정을 스크립트로 작성
로컬 서버에 복사할 파일의 디렉터리를 첫번째 매개변수로, 그리고 파일의 이름을 두 번째 매개변수로 받아서 실행하는 스크립트다.
scp도 sshpass를 이용해 실행한다.
#!/bin/bash
USERNAME='원격지 사용자명'
PASSWD='비밀번호'
REMOTE_HOST='원격지 IP 주소'
REMOTE_DIR='원격지 복사 위치'
sshpass -p $PASSWD ssh $USERNAME@$REMOTE_HOST "[ ! -d $REMOTE_DIR/$1 ] && mkdir -p $REMOTE_DIR/$1"
sshpass -p $PASSWD scp ./$1/$2 $USERNAME@$REMOTE_HOST:$REMOTE_DIR/$1/$2
실행 방법
./scp.sh '로컬 파일 경로' '로컬 파일명'
#예시
./scp.sh python_mail mail_sender.py