본문 바로가기
웹 프로그래밍

scp : 로컬 환경에서 원격 서버로 파일 보내기 [ssh 인증키 관련 오류 해결]

by CSEGR 2024. 3. 12.
728x90

오늘은 로컬 환경에서 원격 서버로 파일을 보낼 때 발생한 문제를 해결한 것을 포스팅해보겠습니다. 

 

이 문제는 Google Cloud Platform(GCP)을 사용하여 가상 머신을 생성하고,

SSH 서버 상에 접속한 후 로컬에서 SSH서버로 이미지를 보내고자 하는 상황에서 발생하였습니다. 

 

✔️scp 명령어 왜 쓰지?

우선 scp명령어를 어떠한 상황에서 쓰이는지부터 설명하겠습니다.

 

1. 로컬 파일을 원격 서버로 복사: 로컬 시스템에 있는 파일을 원격 서버로 전송해야 할 때 사용됩니다. 예를 들어, 로컬 시스템에서 작업한 코드나 문서를 원격 서버로 업로드할 때 SCP를 가능.   => 저는 이 경우에 해당 

명령어 : scp /로컬파일경로/파일명 사용자명@원격서버주소:/원격/디렉토리/경로

 

2. 원격 서버에서 로컬로 파일 복사: 원격 서버에 있는 파일을 로컬 시스템으로 가져와야 할 때 사용됩니다. 이는 로컬 시스템에서 작업한 결과물을 가져오는 경우에 유용함.

명령어 : scp 사용자명@원격서버주소:/원격파일경로/파일명 /로컬디렉토리경로

 

3. 디렉토리 전체 복사: -r 옵션을 사용하여 디렉토리를 재귀적으로 복사합니다.

 

✔️문제 1 : Permission denied (publickey)

ssh(Secure Shell) 터미널에서 i 옵션 없이 scp를 사용할 때, 

위와 같이 ssh 키와 관련된 권한이 거절된다는 오류가 발생하였습니다. 이런 경우 scp -i 옵션을  써서 해결합니다.

➜ 문제 1 해결 : scp -i 옵션 사용

//명령어 
scp -i [private key 파일 경로 및 이름] [로컬 파일 경로 및 이름] [사용자명@원격서버주소:/저장하고자하는 원격경로]

//예시 
scp -i /Users/gyuri/.ssh/newwebproject 
/Users/gyuri/Desktop/webprogramming/assignment_week1/gyuri.jpg 
cofla30105@34.64.241.187:/var/www

 

scp 명령어에서 -i 옵션은 사용자가 지정한 특정한 ssh 개인 키 파일을 사용하여 접근 가능한 사용자 인지를 인증하는 데 사용됩니다.

 

기본적으로 scp는 ssh를 사용하여 원격 서버에 연결하고 파일을 전송하는데, 이때 ssh는 사용자의 로컬 시스템에 있는 ssh 개인 키를 사용하여 원격 서버에 인증합니다.

(ssh: 원격 서버에 안전하게 접속하고 명령을 실행하는 데 사용되는 프로토콜)

 

✔️문제 2 : Permission denied

//(실패)
gyuri@baggyuliui-MacBookPro .ssh % scp -i /Users/gyuri/.ssh/newwebproject 
/Users/gyuri/Desktop/webprogramming/assignment_week1/gyuri.jpg 
cofla30105@34.64.241.187:/var/www

Enter passphrase for key '/Users/gyuri/.ssh/newwebproject': 
scp: dest open "/var/www/gyuri.jpg": Permission denied
scp: failed to upload file /Users/gyuri/Desktop/webprogramming/assignment_week1/gyuri.jpg to /var/www

서버의 /var/www 경로에 로컬 이미지 gyuri.jpg 를 올리려고 하였으나 이번에도 Permission denied가 난 경우입니다. 

(Publickey) 오류가 사라졌고, 이번엔 key에 대한 passphrase까지 입력하였습니다. 

 

➜ 문제 2 해결 : 원격 저장 경로 권한 변경

서버에서 vi를 통해 파일을 쓰고 지울 때 계속 접근 권한 제한이 되었던 사실을 인지하였고,

/var/www 경로에 대한접근 권한 확인을 위하여 명령어 ls -l 을 사용하여 권한 확인을 진행하였습니다. 

명령어 ls -l의 결과는 파일 혹은 폴더의 종류와 권한을 나타냅니다.

여기서는 d로 시작하여 폴더임을 나타내고, 이어지는 rwxr-xr-x는 해당 폴더의 권한을 나타냅니다.

첫 번째 3개는 소유자의 권한을, 그 다음 3개는 그룹의 권한을, 마지막 3개는 다른 사용자들의 권한을 나타냅니다.

정리하자면,

  • 소유자(root): 읽기, 쓰기, 실행 권한(rwx)
  • 그룹(root): 읽기, 실행 권한(rx)
  • 다른 사용자들: 읽기, 실행 권한(rx)

이기 때문에 이미지를 받아오고 write 하는 권한이 없는 것을 확인하였습니다. 

따라서, chmod 명령어를 사용하여 경로 /var/www에 대한 권한을 변경하여줍니다. 

sudo chmod o+w /var/www 명령은 /var/www 폴더에 대해 다음과 같은 권한을 부여합니다:

  • o: 다른 사용자들에 대한 권한을 지정합니다. 여기서는 모든 다른 사용자를 나타냅니다.
  • +w: 쓰기 권한을 추가합니다.

아까와 같은 scp -i 명령어를 실행해주면 로컬이미지를 원격 서버로 성공적으로 전달하는 것을 확인 할 수 있습니다. 

//ssh 서버에서 진행
sudo chmod o+w [원격 경로]

 

✔️ 실행 결과 예시

//접근 권한 변경 후 서버에 저장할 경로 주지 않는 경우(성공)
gyuri@baggyuliui-MacBookPro .ssh % scp -i /Users/gyuri/.ssh/newwebproject 
/Users/gyuri/Desktop/webprogramming/assignment_week1/gyuri.jpg 
cofla30105@34.64.241.187:

Enter passphrase for key '/Users/gyuri/.ssh/newwebproject': 
gyuri.jpg                                     100%  174KB 105.8KB/s   00:01    


//접근 권한 변경 후 /var/www에 이미지 전송(성공)
gyuri@baggyuliui-MacBookPro .ssh % scp -i /Users/gyuri/.ssh/newwebproject 
/Users/gyuri/Desktop/webprogramming/assignment_week1/gyuri.jpg 
cofla30105@34.64.241.187:/var/www

Enter passphrase for key '/Users/gyuri/.ssh/newwebproject': 
gyuri.jpg                                     100%  174KB   3.1KB/s   00:56

 

 

728x90