| 양쪽 이전 판 이전 판 다음 판 | 이전 판 |
| openssh:ssh [2024/12/16 06:25] – writer | openssh:ssh [2026/07/27 04:09] (현재) – 바깥 편집 127.0.0.1 |
|---|
| {{tag>[ssh openssh cli]}} | {{tag>[cli ssh openssh remote-login tunneling]}} |
| |
| ====== ssh ====== | ====== ssh ====== |
| | ''ssh''는 암호화된 SSH 연결로 원격 시스템에 로그인하거나 명령을 실행하고, TCP·Unix socket·X11 연결을 전달하는 OpenSSH 클라이언트다. |
| | |
| | ===== Summary ===== |
| | 접속 대상은 보통 ''[user@]hostname''으로 지정한다. 반복해서 쓰는 사용자, 포트, 키, jump host 설정은 [[openssh:ssh_config|~/.ssh/config]]에 두면 명령을 짧게 유지할 수 있다. |
| | |
| | <note important> |
| | 처음 보는 host key fingerprint는 서버 관리자나 별도의 신뢰할 수 있는 채널로 확인한다. 경고를 피하려고 ''StrictHostKeyChecking=no'' 또는 ''UserKnownHostsFile=/dev/null''을 상시 사용하는 방식은 중간자 공격 탐지를 약화하므로 기본 예제로 사용하지 않는다. |
| | </note> |
| | |
| | ===== Installation ===== |
| | ==== Debian / Ubuntu ==== |
| | OpenSSH 클라이언트 패키지만 설치한다. |
| |
| ===== USAGE ===== | |
| <code bash> | <code bash> |
| usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] | sudo apt update |
| [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] | sudo apt install openssh-client |
| [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] | </code> |
| [-i identity_file] [-J [user@]host[:port]] [-L address] | |
| [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] | |
| [-Q query_option] [-R address] [-S ctl_path] [-W host:port] | |
| [-w local_tun[:remote_tun]] destination [command] | |
| |
| | ==== RHEL / Fedora ==== |
| | <code bash> |
| | sudo dnf install openssh-clients |
| | </code> |
| | |
| | ==== macOS ==== |
| | macOS에는 시스템 SSH 클라이언트가 포함되어 있다. Homebrew 버전이 별도로 필요하면 공식 ''openssh'' formula를 설치한다. |
| | |
| | <code bash> |
| | brew install openssh |
| | </code> |
| | |
| | ==== Windows ==== |
| | Windows 10 build 1809 이상과 지원되는 Windows Server에서는 OpenSSH Client를 Optional Feature로 설치할 수 있다. 관리자 PowerShell에서 실행한다. |
| | |
| | <code powershell> |
| | Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Client*' |
| | Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 |
| | </code> |
| | |
| | Microsoft의 안정 OpenSSH 설치 가이드는 ''winget'' 대신 Windows Optional Feature 방식을 안내한다. 검색되는 beta 패키지를 일반 클라이언트 설치 경로로 대체하지 않는다. |
| | |
| | ==== Verification ==== |
| | <code bash> |
| | ssh -V |
| | </code> |
| | |
| | <note tip> |
| | ''ssh -V''는 구현과 버전에 따라 version 문자열을 standard error로 출력할 수 있다. |
| | </note> |
| | |
| | ===== Usage ===== |
| | <code bash> |
| | ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] |
| | [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] |
| | [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] |
| | [-i identity_file] [-J destination] [-L address] |
| | [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] |
| | [-P tag] [-p port] [-R address] [-S ctl_path] |
| | [-W host:port] [-w local_tun[:remote_tun]] |
| | destination [command [argument ...]] |
| | ssh -Q query_option |
| | </code> |
| | |
| | * ''<color #c3c3c3>**ssh**</color> <color #22b14c>[<switches>...]</color> <color #7092be>destination [command [argument ...]]</color>'' |
| | * ''<color #7092be>destination</color>'': ''[user@]hostname'' 또는 ''ssh://[user@]hostname[:port]'' 형식의 접속 대상 |
| | * ''<color #7092be>command [argument ...]</color>'': 로그인 shell 대신 원격에서 실행할 명령과 인자 |
| | |
| | ===== Options ===== |
| | ==== Connection and identity ==== |
| | * ''<color #22b14c>**-p** port</color>'': 원격 SSH server port 지정 |
| | * ''<color #22b14c>**-l** login_name</color>'': 로그인 사용자 지정 |
| | * ''<color #22b14c>**-i** identity_file</color>'': public key 인증에 사용할 identity file 지정 |
| | * ''<color #22b14c>**-F** configfile</color>'': 기본 사용자 config 대신 별도 client config 사용 |
| | * ''<color #22b14c>**-o** option</color>'': ''ssh_config'' keyword를 명령행에서 지정 |
| | * ''<color #22b14c>**-J** destination</color>'': jump host를 거쳐 최종 대상에 연결 |
| | * ''<color #22b14c>**-4**</color>'', ''<color #22b14c>**-6**</color>'': IPv4 또는 IPv6만 사용 |
| | |
| | ==== Session behavior ==== |
| | * ''<color #22b14c>**-t**</color>'': pseudo-terminal 강제 할당. 여러 번 쓰면 local terminal이 없어도 강제 |
| | * ''<color #22b14c>**-T**</color>'': pseudo-terminal 할당 비활성화 |
| | * ''<color #22b14c>**-N**</color>'': 원격 명령을 실행하지 않음. port forwarding 전용 연결에 유용 |
| | * ''<color #22b14c>**-n**</color>'': standard input을 ''/dev/null''로 연결 |
| | * ''<color #22b14c>**-f**</color>'': 명령 실행 직전에 background로 전환 |
| | * ''<color #22b14c>**-v**</color>'': 진단 로그를 자세히 출력. 최대 ''-vvv'' |
| | * ''<color #22b14c>**-q**</color>'': warning과 diagnostic message를 줄임 |
| | * ''<color #22b14c>**-C**</color>'': compression 요청 |
| | * ''<color #22b14c>**-A**</color>'': authentication agent forwarding 활성화 |
| | * ''<color #22b14c>**-X**</color>'', ''<color #22b14c>**-Y**</color>'': X11 forwarding 활성화 |
| | |
| | ==== Port forwarding ==== |
| | * ''<color #22b14c>**-L** [bind_address:]port:host:hostport</color>'': local listener로 들어온 연결을 SSH server 쪽에서 ''host:hostport''로 연결 |
| | * ''<color #22b14c>**-R** [bind_address:]port:host:hostport</color>'': SSH server의 remote listener로 들어온 연결을 client 쪽에서 ''host:hostport''로 연결 |
| | * ''<color #22b14c>**-D** [bind_address:]port</color>'': local dynamic application-level port forwarding. SOCKS4/SOCKS5 proxy처럼 동작 |
| | * ''<color #22b14c>**-W** host:port</color>'': client standard input/output을 SSH channel을 통해 ''host:port''로 전달 |
| | * ''<color #22b14c>**-w** local_tun[:remote_tun]</color>'': client/server의 tunnel device forwarding 요청 |
| | |
| | <note warning> |
| | forwarding listener를 ''0.0.0.0'' 또는 ''::''에 bind하면 다른 host에서도 접근할 수 있다. 방화벽, server의 ''GatewayPorts'' 정책, 대상 서비스 인증을 확인하고 필요한 interface에만 노출한다. |
| | </note> |
| | |
| | ==== Inspection and connection sharing ==== |
| | * ''<color #22b14c>**-G**</color>'': ''Host''와 ''Match'' 평가 후 최종 client configuration 출력 |
| | * ''<color #22b14c>**-Q** query_option</color>'': 지원하는 cipher, key, MAC 등 algorithm 목록 질의 |
| | * ''<color #22b14c>**-O** ctl_cmd</color>'': multiplexing master process에 ''check'', ''forward'', ''cancel'', ''exit'', ''stop'' 등의 control command 전달 |
| | * ''<color #22b14c>**-S** ctl_path</color>'': connection sharing control socket 경로 지정 |
| | |
| | ===== Examples ===== |
| | ==== Basic connection ==== |
| | <code bash> |
| | # 현재 사용자 이름으로 접속 |
| | ssh server.example.com |
| | |
| | # 사용자와 port 지정 |
| | ssh -p 2222 [email protected] |
| | |
| | # 별도 identity file 사용 |
| | ssh -i ~/.ssh/id_ed25519_work [email protected] |
| | |
| | # 원격 명령 실행 |
| | ssh [email protected] uname -a |
| | </code> |
| | |
| | ==== Jump host ==== |
| | <code bash> |
| | ssh -J [email protected] [email protected] |
| | </code> |
| | |
| | 같은 경로를 반복해서 사용한다면 [[openssh:ssh_config|~/.ssh/config]]에 ''ProxyJump''를 지정한다. |
| | |
| | ==== Local forwarding ==== |
| | 로컬 ''127.0.0.1:8080'' 접속을 SSH server가 접근할 수 있는 ''db.internal.example:80''으로 전달한다. |
| | |
| | <code bash> |
| | ssh -N -L 127.0.0.1:8080:db.internal.example:80 [email protected] |
| | </code> |
| | |
| | 기존에 사용하던 일반 표기: |
| | |
| | <code bash> |
| ssh -L PORT1:HOSTNAME:PORT2 user@hostB | ssh -L PORT1:HOSTNAME:PORT2 user@hostB |
| </code> | </code> |
| |
| * ''<color #c3c3c3>**ssh**</color> <color #22b14c>[<switches>...]</color> <color #7092be>desitination</color> <color #ff7f27>[command]</color>'' | 여기서 ''PORT1''은 local listening port이고, ''HOSTNAME:PORT2''는 ''hostB'' 쪽에서 연결할 목적지다. |
| * ''<color #7092be>destination</color>'': IP/DNS 지정 | |
| * ''<color #7092be>id@destination</color>'': 로그인 아이디 지정. (없으면 현재 사용자) | |
| |
| ===== HELP ===== | ==== Remote forwarding ==== |
| | SSH server의 loopback ''8022'' 접속을 local network의 ''service.internal.example:22''로 전달한다. |
| |
| ++++ ssh | | <code bash> |
| | ssh -N -R 127.0.0.1:8022:service.internal.example:22 [email protected] |
| | </code> |
| | |
| | 기존에 사용하던 일반 표기: |
| | |
| | <code bash> |
| | ssh -R local_port:target_host:target_port user@server |
| | </code> |
| | |
| | 이 표기의 ''local_port''는 실제로 SSH server 쪽에서 listen하는 remote port이므로, 새 문서에서는 ''remote_port''로 부르는 편이 명확하다. |
| | |
| | ==== Dynamic forwarding ==== |
| | local loopback에 SOCKS proxy를 열고 SSH server를 통해 목적지에 연결한다. |
| | |
| | <code bash> |
| | ssh -N -D 127.0.0.1:1080 [email protected] |
| | </code> |
| | |
| | 기존 ''ssh -N -D port'' 형식도 동작하지만, 의도하지 않은 외부 노출을 피하려면 ''127.0.0.1:port''처럼 bind address를 명시한다. |
| | |
| | ==== Effective configuration and algorithms ==== |
| | <code bash> |
| | # 별칭에 적용될 최종 설정 확인 |
| | ssh -G production.example.com |
| | |
| | # 지원 public key algorithm 확인 |
| | ssh -Q key |
| | |
| | # 자세한 연결 진단 |
| | ssh -vvv [email protected] |
| | </code> |
| | |
| | ===== Configuration ===== |
| | * 사용자별 설정: ''~/.ssh/config'' |
| | * 시스템 전역 설정: ''/etc/ssh/ssh_config'' |
| | * Windows 사용자 설정: ''%USERPROFILE%\.ssh\config'' |
| | * Windows 시스템 전역 설정: ''%PROGRAMDATA%\ssh\ssh_config'' |
| | * 작성법, precedence, ''ProxyJump'', keepalive, connection multiplexing: [[openssh:ssh_config|ssh_config / ~/.ssh/config]] |
| | |
| | ===== Security Notes ===== |
| | * private key에는 passphrase를 설정하고, 필요하면 ''ssh-agent''로 반복 입력을 줄인다. |
| | * ''-A'' agent forwarding은 원격 host가 agent socket에 접근할 수 있게 한다. 신뢰하지 않는 중간 host에서는 피하고, 가능하면 ''-J''/''ProxyJump''를 사용한다. |
| | * host key 변경 경고가 나오면 서버 재설치나 key rotation 여부를 먼저 확인한다. 확인 없이 ''known_hosts'' 항목을 삭제하지 않는다. |
| | * remote command에 local 변수나 신뢰할 수 없는 문자열을 결합하면 local shell과 remote shell의 quoting이 겹칠 수 있다. 자동화에서는 인자를 제한하고 quoting을 검토한다. |
| | |
| | ===== Troubleshooting ===== |
| | * ''Connection timed out'': DNS, route, 방화벽, VPN, port 번호를 확인 |
| | * ''Connection refused'': 대상 host에는 도달했지만 해당 port에서 ''sshd''가 listen 중인지 확인 |
| | * ''Permission denied (publickey)'': ''-vvv''로 선택된 사용자와 identity file을 확인하고, server의 ''authorized_keys''와 권한을 점검 |
| | * ''REMOTE HOST IDENTIFICATION HAS CHANGED'': 새 host key fingerprint를 별도 채널로 검증한 뒤 [[openssh:ssh-keygen|ssh-keygen -R]]로 오래된 항목을 정리 |
| | * config가 예상과 다르면 ''ssh -G destination''으로 최종 해석 결과 확인 |
| | * forwarding이 열리지 않으면 local port 충돌, server의 ''AllowTcpForwarding''/''PermitOpen''/''GatewayPorts'', 방화벽을 확인 |
| | |
| | ===== Compatibility ===== |
| | * 배포판과 운영체제가 제공하는 OpenSSH version에 따라 지원 option과 기본 algorithm이 다르다. |
| | * 최신 upstream synopsis의 ''-P tag''처럼 오래된 client에 없는 option이 있을 수 있다. 배포 자동화 전 대상 host의 ''ssh -V''와 option 지원 여부를 확인한다. |
| | * 오래된 server가 ''ssh-rsa'' 또는 구형 key exchange만 제공할 때 client가 연결을 거부할 수 있다. 전역으로 약한 algorithm을 재활성화하지 말고, 교체 계획이 있는 특정 ''Host'' block에만 제한적으로 적용한다. |
| | * Windows OpenSSH는 기본 경로와 agent/service 관리 방식이 Unix 계열과 다르지만, 일반적인 ''ssh'' 접속 option과 config keyword는 대부분 공통이다. |
| | |
| | ===== Help ===== |
| | 아래 내용은 이 저장소 작업 환경의 ''OpenSSH_8.0p1''에서 ''ssh -?''로 확인한 usage다. 최신 upstream manual의 synopsis와 차이가 있을 수 있다. |
| | |
| | ++++ ssh -? | |
| <code text> | <code text> |
| | unknown option -- ? |
| usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] | usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] |
| [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] | [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] |
| </code> | </code> |
| ++++ | ++++ |
| | |
| | ===== See Also ===== |
| | * [[openssh:ssh_config|ssh_config / ~/.ssh/config]] |
| | * [[openssh:ssh-keygen]] |
| | * [[openssh:ssh-copy-id]] |
| | * [[ssh-add]] |
| | * [[sshd:config:sshd_config]] |
| | * [[windows:cmd:ssh|Windows SSH]] |
| | * [[https://man.openbsd.org/ssh.1|OpenBSD ssh(1) manual]] |
| | * [[https://www.openssh.com/portable.html|OpenSSH Portable]] |
| | * [[https://learn.microsoft.com/windows-server/administration/openssh/openssh_install_firstuse|Install OpenSSH for Windows]] |
| | * [[https://packages.ubuntu.com/noble/openssh-client|Ubuntu openssh-client package]] |
| | * [[https://packages.fedoraproject.org/pkgs/openssh/openssh-clients/|Fedora openssh-clients package]] |
| | * [[https://formulae.brew.sh/formula/openssh|Homebrew openssh formula]] |
| | |
| | ===== History ===== |
| | * codex:: 2026-07-27 Added current installation guidance, connection and forwarding options, safe examples, configuration links, diagnostics, compatibility notes, and verified local help while preserving existing tunnel command records. |
| | |
| | {{indexmenu>openssh:ssh:#1|js}} |
| | |