SSH & SFTP & RSync

Sunwoo Pi·2023년 6월 11일
post-thumbnail

SSH(Secure Shell) 연결 및 연결 종료

ssh -p [PORT] [USER]@[HOSTNAME]
exit

ssh -p 8001 psw@230.238.22.132 # SSH 연결

exit # 연결 종료

# -p : Port 번호
# -p를 명시하지 않는다면 Default Port 22가 적용
# -X : X11 Forwarding 허용
# -C : 압축 활성화 (Data 전송 시간 단축)

SSH Config 설정을 통해 SSH 연결을 편하게.

SSH Config File 위치

Windows

C:\사용자\[User]\.ssh\config

Linux & MacOS

/Users/[User]/.ssh/config

SSH Config File 형식

Host [Name]
    User [HostName]
    User [User]
    Port [Port 번호]

Host MyFirstServer
    HostName 230.238.22.132
    User psw
    Port 8001
    
Host MySecondServer
    HostName 201.223.14.247
    User psw
    Port 8001

SSH 연결

ssh [Name]

ssh MyFirstServer

SSH Key를 통해 비밀번호 없이 SSH 접속하기.

(Visual Studio Code에서) 매번 SSH를 접속 할 때, 비밀번호 입력하는 것을 생략하기 위해 SSH로 접속하려는 Server에 공개키를 등록할 수 있습니다.

SSH Key 발급

# Local의 Terminal 이용

ssh-keygen -t rsa
ssh-keygen -t ed25519 # 보안과 성능 면에서 RSA 기반 Key보다 더 좋음. (사용 방식은 RSA 기반 Key와 동일)

다음 명령어를 통해 현재 Local에서 SSH Key를 발급 받을 수 있습니다.

  1. Key 저장 경로 (Default : $HOME/.ssh/id_rsa)
  2. passphrase (추가로 사용할 암호, Default : 없음)
  3. passphrase 재확인

보통 Default로 그대로 두기 위해 공백 상태에서 Enter를 쳐서 모든 단계를 넘깁니다.
그러면 위의 SSH Config File이 있는 위치에 Key가 발급됩니다.

SSH Key를 Server에 등록

발급된 공개키인 id_rsa.pub의 내용을 복사하여 Server에 등록해줍니다.

  1. $Home에 .ssh Directory를 생성해줍니다. (이미 있다면 생략 가능)
mkdir ~/.ssh
  1. 만든 Directory 내에 autorized_keys File을 생성해줍니다. (이미 있다면 생략 가능)
touch ~/.ssh/authorized_keys
  1. 발급된 Local의 공개키인 id_rsa.pub의 내용을 복사하여 Server의 authorized_keys에 붙여 넣어줍니다. vim이나 nano 혹은 VSCode의 Text Editor 이용 가능.
    (id_rsa.pub이 열리지 않을 경우, 연결 프로그램을 메모장으로 선택)

SFTP(SSH File Transfer Protocol)를 이용한 File 전송

구형 SCP(Secure Copy)보다 더 유연하고 개선된 File 전송 방식

1. 전송할 File이 있는 or 전송 받은 File을 위치 시킬 Directory로 Local의 위치 이동

cd /path/to/Dir1 # Local의 위치 이동

2. File을 주고받을 Remote Server와의 SFTP 연결 및 연결 종료

sftp -P 8001 psw@230.238.22.132 # sftp로 Remote에 연결 된 경우 Terminal의 상태가 "sftp>"로 변경
sftp MySecondServer # SSH Config를 이용한 SFTP 연결

sftp> exit # sftp 연결 종료

# -P : Port 번호
# File을 주고 받을 장소가 Remote와 Remote인 경우
ssh MyFirstServer # Remote에 SSH 연결
cd ~/psw/Dir1 # Remote의 위치 이동 후 
sftp MySecondServer # 2번째 Remote와 sftp 연결

3. Remote Server에서의 위치 이동

# 대부분의 POSIX 계열 Command를 그대로 사용 가능
sftp> ls # Dir1, Dir2
sftp> cd Dir2
sftp> ls # ETC
sftp> cd ETC # Remote의 위치 이동
sftp> pwd # Remote working directory: /home/psw/Dir2/ETC

4. File 전송

Local의 home/psw/Dir1 위치와 Remote의 /home/psw/Dir2/ETC 위치에서 서로 File을 주고 받을 수 있는 상태

sftp> put practice.py # Local의 home/psw/Dir1에 위치한 practice.py를 MySecondServer의 /home/psw/Dir2/ETC 위치로 전송
sftp> put practice.py /home/psw/Dir6/ # Local의 home/psw/Dir1에 위치한 practice.py를 MySecondServer의 /home/psw/Dir6 위치로 전송 (전송 장소 직접 명시 가능)

sftp> put practice.py hello.py # Local의 home/psw/Dir1에 위치한 practice.py를 MySecondServer의 /home/psw/Dir2/ETC 위치로 hello.py라는 이름으로 전송
sftp> put -r LocalSampleDir # Local의 home/psw/Dir1에 위치한 LocalSampleDir Directory를 MySecondServer의 /home/psw/Dir2/ETC 위치로 전송

# mput을 통해 2개 이상의 File 전송 가능 (Directory는 불가능)
sftp> mput practice.py hello.py # practice.py, hello.py 두 File을 모두 Local to MySecondServer로 전송
sftp> get sample.py # MySecondServer의 /home/psw/Dir2/ETC에 위치한 sample.py를 Local의 home/psw/Dir1 위치로 전송
sftp> get sample.py /home/psw/Dir5/ # MySecondServer의 /home/psw/Dir2/ETC에 위치한 sample.py를 Local의 home/psw/Dir5 위치로 전송 (전송 장소 직접 명시 가능)

sftp> get sample.py bye.py # MySecondServer의 /home/psw/Dir2/ETC에 위치한 sample.py를 Local의 home/psw/Dir1 위치로 bye.py라는 이름으로 전송
sftp> get -r RemoteSampleDir # MySecondServer의 /home/psw/Dir2/ETC에 위치한 RemoteSampleDir를 Local의 home/psw/Dir1 위치로 전송

# mget을 통해 2개 이상의 File 전송 가능 (Directory는 불가능)
sftp> mget sample.py bye.py # sample.py, hello.py 두 File을 모두 MySecondServer to Local로 전송

RSync(Remote Sync)를 이용한 File 및 Directory 동기화

SFTP보다 효율적이고 강력한 동기화 방식, 특히 대용량 데이터 및 반복 작업에 최적화

기본 사용법 및 핵심 옵션

rsyncsftp와 달리 한 번의 명령어로 동기화 작업을 수행

rsync [OPTIONS] SOURCE DESTINATION

# -a : Archive 모드. 권한, 시간, 소유권 등 모든 속성을 보존하며 하위 디렉토리까지 재귀적으로 동기화
# -v : 동기화 진행 과정을 자세하게 출력
# -z : 데이터를 압축하여 전송. 텍스트 파일 등에서 전송 속도를 높일 수 있음.
# -h : 파일 크기 등을 K, M, G와 같이 사람이 읽기 편한 단위로 표시
# --progress : 파일별 전송 진행률(%)과 속도, 남은 시간을 실시간으로 표시
# --stats: 완료 후 전체 통계 표시

# -e : Port 번호 지정 (-e 'ssh -p [Port 번호]')

# --exclude : 동기화할 필요가 없는 대상을 제외 (--exclude '.git' --exclude 'venv/' --exclude '*.py')
# --delete : SOURCE에는 없는데 DESTINATION에만 있는 파일을 삭제하여 두 디렉토리를 완전히 동기화 (주의해서 사용)
# --dry-run : 실제로 동기화하지 않고, 어떤 파일이 어떻게 변경될지 시뮬레이션 결과만 표시 (안전장치)

동기화 방향에 따른 사용법

Local --> Server로 동기화 (Upload)

rsync -avzh --progress -e 'ssh -p 8000' /path/to/local_project/ username@230.238.22.132:/path/to/remote_workspace/

# SSH Config에 등록된 별명(MyFirstServer) 사용 가능
rsync -avzh --progress /path/to/local_project/ MyFirstServer:/path/to/remote_workspace/

Server --> Local로 동기화 (Download)

# SOURCE와 DESTINATION의 위치만 변경
rsync -avzh --progress username@230.238.22.132:/path/to/remote_results/ /path/to/local_backup/

# SSH Config 활용
rsync -avzh --progress MyFirstServer:/path/to/remote_results/ /path/to/local_backup/

경로(Path) 지정 시 핵심 : 끝에 붙는 슬래시(/)

소스 경로 끝에 /가 있는 경우 (source_dir/)

source_dir 안의 내용물(contents)을 목적지로 복사

# /path/to/source_dir/ 안의 파일과 디렉토리들이 /path/to/dest_dir/ 안으로 복사됨
rsync -av /path/to/source_dir/ /path/to/dest_dir/

소스 경로 끝에 /가 없는 경우 (source_dir)

source_dir 디렉토리 자체(itself)를 목적지 안으로 복사

# /path/to/dest_dir/ 안에 source_dir 라는 디렉토리가 생성되고 그 안에 내용물이 복사됨
rsync -av /path/to/source_dir /path/to/dest_dir/
profile
어려운 게 제일 싫어😝

0개의 댓글