Linux

[scp] 원격지 업로드 시 No such file or directory

비번변경 2021. 12. 31. 17:21

로컬 서버에서 다른 원격 서버로 파일을 복사하려고 했더니, 아래와 같이 No such file or directory 에러가 발생했다.

scp 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
728x90