시스템 관리자를 위한 필수 SSH 명령어
원격 로그인, 키, 설정 파일, 파일 전송, 터널링, 에이전트 및 문제 해결을 위한 필수 SSH 명령어를 알아보세요.
시스템 관리자를 위한 필수 SSH 명령어
Secure Shell(SSH)은 서버와 네트워크 장치에 원격으로 접속하는 데 사용되는 일상적인 도구입니다. Linux 시스템을 관리한다면 SSH 명령어를 사용하여 로그인하고, 파일을 복사하고, 일회성 명령을 실행하고, 터널을 열고, 연결 실패를 디버깅하게 됩니다.
이 가이드는 실제 관리 작업 중에 가장 필요할 가능성이 높은 명령어와 옵션에 중점을 둡니다.
기본 SSH 연결 설정
SSH의 가장 기본적인 용도는 원격 서버와 안전한 대화형 셸 세션을 설정하는 것입니다. 기본 구문은 간단하며, 사용자와 대상 호스트를 지정할 수 있습니다.
원격 서버에 연결
현재 로컬 사용자 이름을 사용하여 원격 서버에 연결하려면:
ssh 호스트명_또는_IP_주소
원격 서버의 사용자 이름이 로컬 사용자 이름과 다른 경우 이를 지정해야 합니다:
ssh 사용자명@호스트명_또는_IP_주소
예시:
ssh [email protected]
ssh [email protected]
사용자 지정 포트 지정
기본적으로 SSH는 포트 22를 사용합니다. 그러나 보안상의 이유나 특정 네트워크 구성으로 인해 서버가 다른 포트에서 수신 대기하는 경우가 많습니다. -p 플래그를 사용하여 사용자 지정 포트를 지정할 수 있습니다:
ssh -p 2222 사용자명@호스트명_또는_IP_주소
팁: 기본 SSH 포트(포트 22)를 변경하는 것은 자동화된 공격 시도를 줄이기 위한 일반적인 보안 관행이지만, 강력한 인증을 대체하지는 않습니다.
SSH 키 기반 인증
암호 인증이 일반적이지만, 키 기반 인증이 SSH에 권장되는 더 안전한 방법입니다. 이는 암호화 키 쌍(로컬 시스템에 비밀로 유지되는 개인 키와 원격 서버에 배치되는 공개 키)을 사용합니다.
SSH 키 쌍 생성
ssh-keygen을 사용하여 새 키 쌍을 생성합니다. 최신 OpenSSH 설정의 경우 Ed25519 키가 좋은 기본값입니다. 이전 시스템이나 정책과의 호환성이 필요한 경우에만 RSA를 사용하세요.
ssh-keygen -t ed25519 -a 100
이 명령은 Ed25519 키 쌍을 생성하고 개인 키 암호를 보호하는 데 사용되는 키 파생 라운드를 증가시킵니다. 개인 키(id_ed25519)와 공개 키(id_ed25519.pub)는 일반적으로 ~/.ssh/에 저장됩니다.
원격 서버에 공개 키 복사
키 기반 인증을 활성화하려면 공개 키를 원격 서버의 ~/.ssh/authorized_keys 파일에 배치해야 합니다. ssh-copy-id 유틸리티가 이 프로세스를 자동화합니다:
ssh-copy-id 사용자명@호스트명_또는_IP_주소
이 명령은 원격 사용자의 암호를 한 번 묻고, 공개 키를 복사한 후 올바른 권한을 설정합니다. 이후에는 암호 없이 연결할 수 있습니다(단, 개인 키 암호를 설정한 경우 암호를 묻습니다).
경고: 개인 키를 누구와도 공유하지 마십시오. chmod 600 ~/.ssh/id_ed25519와 같은 엄격한 파일 권한이 있어야 합니다.
SSH 연결 및 구성 관리
원격에서 단일 명령 실행
SSH는 대화형 셸 전용이 아닙니다. 원격 서버에서 단일 명령을 직접 실행하고 출력을 로컬 터미널로 반환할 수 있습니다.
ssh 사용자명@호스트명_또는_IP_주소 '실행할_명령어'
예시:
ssh [email protected] 'ls -l /var/log/'
ssh [email protected] 'sudo apt update && sudo apt upgrade -y'
SSH 구성 파일(~/.ssh/config) 사용
자주 연결하는 경우 ~/.ssh/config에서 호스트를 정의하면 시간을 절약하고 명령을 단순화할 수 있습니다. 이 파일을 사용하면 별칭을 설정하고, 사용자, 포트, 개인 키 및 기타 연결 옵션을 지정할 수 있습니다.
~/.ssh/config 항목 예시:
Host webserver
Hostname 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/id_rsa_web
IdentitiesOnly yes
Host devbox
Hostname dev.mydomain.com
User developer
Port 22
IdentityFile ~/.ssh/id_rsa_dev
구성 후에는 별칭을 사용하여 간단히 연결할 수 있습니다:
ssh webserver
ssh devbox
모범 사례: 반복 연결에는 ~/.ssh/config 파일을 사용하세요. 가독성을 높이고, 입력 오류를 줄이며, 연결 옵션을 한 곳에 유지합니다. 에이전트 전달을 전역적으로 활성화하지 말고, 실제로 필요한 호스트에 대해서만 켜십시오.
SSH를 통한 안전한 파일 전송
SSH는 안전한 파일 전송을 위한 두 가지 주요 도구인 scp와 sftp를 제공합니다.
scp (Secure Copy Protocol)
scp는 로컬 및 원격 호스트 간에 파일과 디렉터리를 복사하는 데 사용됩니다. SSH와 동일한 인증 및 보안 메커니즘을 사용합니다.
로컬에서 원격으로 파일 복사
scp /로컬/파일/경로 사용자명@호스트명_또는_IP_주소:/원격/디렉터리/경로/
예시:
scp my_app.tar.gz admin@webserver:/var/www/html/
원격에서 로컬로 파일 복사
scp 사용자명@호스트명_또는_IP_주소:/원격/파일/경로 /로컬/디렉터리/경로/
예시:
scp admin@webserver:/var/log/nginx/access.log ~/logs/
디렉터리 재귀적으로 복사
디렉터리의 경우 -r 플래그를 사용하세요:
scp -r /로컬/디렉터리/경로 사용자명@호스트명_또는_IP_주소:/원격/상위_디렉터리/경로/
파일 속성 유지
수정 시간, 액세스 시간 및 모드를 유지하려면 -p 플래그를 사용하세요:
scp -p 로컬파일 사용자@원격호스트:/원격경로/
sftp (SSH 파일 전송 프로토콜)
sftp는 FTP와 유사하지만 SSH로 보호되는 대화형 파일 전송 프로그램을 제공합니다. 여러 파일을 관리하거나 복잡한 디렉터리 작업을 수행하는 데 이상적입니다.
SFTP 서버에 연결
sftp 사용자명@호스트명_또는_IP_주소
연결되면 sftp> 프롬프트가 표시됩니다. 일반적인 명령은 다음과 같습니다:
ls: 원격 디렉터리 내용 나열lls: 로컬 디렉터리 내용 나열cd 원격_디렉터리: 원격 디렉터리 변경lcd 로컬_디렉터리: 로컬 디렉터리 변경get 원격_파일: 파일 다운로드put 로컬_파일: 파일 업로드mget 원격_파일들: 여러 파일 다운로드(와일드카드 지원)mput 로컬_파일들: 여러 파일 업로드(와일드카드 지원)exit또는bye: SFTP 세션 종료
SFTP 세션 예시:
sftp [email protected]
Connected to 192.168.1.100.
sftp> ls
config.ini data/ logs/ public_html/
sftp> cd public_html
sftp> get index.html
Fetching /public_html/index.html to index.html
sftp> put new_page.html
Uploading new_page.html to /public_html/new_page.html
sftp> bye
SSH 터널링 및 포트 포워딩
SSH 터널링(또는 포트 포워딩)을 사용하면 로컬 및 원격 포트 간에 안전한 연결을 생성하여 방화벽에 의해 차단되거나 직접 액세스할 수 없는 서비스에 액세스할 수 있습니다.
로컬 포트 포워딩 (-L)
로컬 포워딩을 사용하면 로컬 시스템에서 마치 로컬에서 실행되는 것처럼 원격 네트워크(또는 원격 서버 자체)의 서비스에 액세스할 수 있습니다.
ssh -L [로컬_포트]:[원격_호스트]:[원격_포트] 사용자명@ssh_서버
예시: 점프 호스트 ssh_server를 통해 로컬 시스템의 포트 9000에서 개인 네트워크의 데이터베이스 서버(포트 3306)에 액세스합니다.
ssh -L 9000:db.private.net:3306 [email protected]
이제 로컬 시스템에서 localhost:9000에 연결하면 연결이 jumphost.com을 통해 db.private.net:3306으로 안전하게 전달됩니다.
원격 포트 포워딩 (-R)
원격 포워딩을 사용하면 로컬 시스템(또는 로컬 네트워크)의 서비스를 원격 서버에서, 그리고 잠재적으로 원격 서버 네트워크의 클라이언트에서 액세스할 수 있습니다.
ssh -R [원격_포트]:[로컬_호스트]:[로컬_포트] 사용자명@ssh_서버
예시: 로컬 웹 서버(포트 8000)를 ssh_server의 포트 8080에서 액세스할 수 있도록 만듭니다.
ssh -R 8080:localhost:8000 admin@remote_server.com
이제 remote_server.com의 모든 사용자는 remote_server.com의 localhost:8080에 연결하여 로컬 웹 서버에 액세스할 수 있습니다.
동적 포트 포워딩 (-D)
동적 포트 포워딩은 SOCKS 프록시를 생성하여 모든 트래픽(또는 애플리케이션별 트래픽)을 SSH 터널을 통해 라우팅할 수 있도록 합니다. 이는 방화벽을 우회하거나 브라우징을 보호하는 데 유용합니다.
ssh -D [로컬_포트] 사용자명@ssh_서버
예시: ssh_server를 통해 로컬 시스템의 포트 1080에 SOCKS 프록시를 생성합니다.
ssh -D 1080 [email protected]
브라우저 또는 애플리케이션을 localhost:1080을 SOCKS5 프록시로 사용하도록 구성하면 모든 네트워크 트래픽이 jumphost.com을 통해 터널링됩니다.
고급 SSH 사용법 및 팁
백그라운드에서 명령 실행
실행 후 분리되어야 하는 비대화형 명령의 경우 -f 플래그(명령 실행 전에 백그라운드로 전환)와 -N(원격 명령을 실행하지 않음)을 사용할 수 있습니다.
ssh -f -N -L 9000:db.private.net:3306 [email protected]
이 명령은 백그라운드에서 로컬 포트 포워드를 설정합니다.
SSH 에이전트 및 ssh-add
ssh-agent는 개인 키를 메모리에 보관하는 프로그램이므로 세션당 한 번만 암호를 입력하면 됩니다. ssh-add는 에이전트에 키를 추가합니다.
# 에이전트 시작(아직 실행 중이 아닌 경우)
eval "$(ssh-agent -s)"
# 에이전트에 키 추가
ssh-add ~/.ssh/id_ed25519
ssh-add ~/.ssh/id_ed25519_web # 특정 키의 경우
에이전트 전달을 사용하면 개인 키를 점프 호스트에 복사하지 않고도 점프 호스트에서 다른 서버로 인증할 수 있습니다. 드물게 사용하십시오. 손상된 점프 호스트는 세션이 활성화된 동안 전달된 에이전트를 사용할 수 있습니다. 베스천 호스트를 통과하기만 하면 되는 경우 ProxyJump를 선호하십시오.
ssh -J [email protected] [email protected]
영구 SSH 연결 (ControlMaster)
더 빠른 연결과 오버헤드 감소를 위해 ~/.ssh/config의 ControlMaster를 사용하면 여러 SSH 세션이 단일 네트워크 연결을 공유할 수 있습니다.
Host *
ControlMaster auto
ControlPath ~/.ssh/control/%C
ControlPersist 4h
이 구성은 첫 번째 연결에 대한 제어 소켓을 생성하고(ControlMaster auto), 동일한 호스트에 대한 후속 연결은 최대 4시간 동안 이 소켓을 재사용합니다(ControlPersist 4h).
SSH 문제 해결
- 권한 거부됨: 개인 키(
chmod 600 ~/.ssh/id_ed25519), 공개 키(chmod 644 ~/.ssh/id_ed25519.pub) 및.ssh디렉터리(chmod 700 ~/.ssh)의 파일 권한을 확인하십시오. 서버에서~/.ssh/authorized_keys가chmod 600이고~/.ssh가chmod 700인지 확인하십시오. - 연결 시간 초과: 서버가 다운되었거나, 방화벽이 포트 22(또는 사용자 지정 포트)를 차단하고 있거나, IP 주소가 잘못되었을 수 있습니다.
- 자세한 출력:
ssh와 함께-v,-vv또는-vvv플래그를 사용하여 자세한 디버깅 정보를 확인하십시오.ssh -vvv [email protected]
핵심 요약
일상적인 SSH 워크플로를 간단하게 유지하십시오. 키 기반 인증을 사용하고, 반복 옵션을 ~/.ssh/config에 저장하고, scp 또는 sftp로 파일을 복사하고, 필요할 때 -L, -R, -D 또는 -J로 개인 서비스에 도달하십시오. 연결이 실패하면 ssh -vvv가 일반적으로 문제가 DNS, 라우팅, 인증 또는 서버 정책 중 무엇인지 확인하는 가장 빠른 방법입니다.