系统管理员必备的SSH命令
学习远程登录、密钥、配置文件、文件传输、隧道、代理和故障排除的基本SSH命令。
系统管理员必备的SSH命令
安全外壳(SSH)是日常远程访问服务器和网络设备的工具。如果您管理Linux系统,您会使用SSH命令登录、复制文件、执行一次性命令、打开隧道以及调试连接故障。
本指南重点介绍在实际管理工作中最可能需要的命令和选项。
建立基本SSH连接
SSH最基本的用途是与远程服务器建立安全的交互式shell会话。基本语法简单明了,允许您指定用户和目标主机。
连接到远程服务器
使用当前本地用户名连接到远程服务器:
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的策略兼容时才使用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不仅用于交互式shell。您可以直接在远程服务器上执行单个命令,并将其输出返回到本地终端。
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(安全复制协议)
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服务器
示例: 使本地Web服务器(端口8000)在ssh_server上通过端口8080可访问。
ssh -R 8080:localhost:8000 admin@remote_server.com
现在,remote_server.com上的任何人都可以通过连接到remote_server.com上的localhost:8080来访问您的本地Web服务器。
动态端口转发(-D)
动态端口转发创建一个SOCKS代理,允许您通过SSH隧道路由所有流量(或特定应用程序的流量)。这对于绕过防火墙或保护浏览非常有用。
ssh -D [本地端口] 用户名@SSH服务器
示例: 在本地机器的端口1080上通过ssh_server创建一个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地址不正确。
- 详细输出:使用
-v、-vv或-vvv标志与ssh一起获取详细的调试信息。ssh -vvv [email protected]
要点
保持您的日常SSH工作流程简单:使用密钥认证,在~/.ssh/config中存储重复选项,使用scp或sftp复制文件,并在需要时使用-L、-R、-D或-J访问私有服务。当连接失败时,ssh -vvv通常是查看问题是DNS、路由、身份验证还是服务器策略的最快方法。