系统管理员必备的 SSH 命令
引言
安全外壳(SSH)是服务器和网络设备安全远程管理的基础。对于系统管理员来说,掌握 SSH 不仅仅是一项技能,更是高效安全管理基础设施的根本需求。SSH 通过使用强大的加密技术,在不安全的网络上提供安全通道,确保所有通信,包括密码、命令和文件传输,都保持机密并免受窃听。
本文旨在为系统管理员提供一份全面的指南,介绍他们应该了解的最基本 SSH 命令和概念。我们将深入探讨从基本连接方法和安全文件传输到端口转发和持久连接等高级技术。通过理解和实施这些命令及最佳实践,您可以显著增强远程服务器管理能力,简化工作流程,并在您的环境中保持强大的安全态势。
建立基本的 SSH 连接
SSH 最基本的作用是与远程服务器建立安全的交互式 Shell 会话。其基本语法非常直接,允许您指定用户和目标主机。
连接到远程服务器
使用您当前的本地用户名连接到远程服务器:
ssh hostname_or_IP_address
如果您的远程服务器用户名与本地用户名不同,您需要指定它:
ssh username@hostname_or_IP_address
示例:
ssh [email protected]
ssh [email protected]
指定自定义端口
默认情况下,SSH 使用端口 22。然而,出于安全原因或特定的网络配置,服务器通常会监听不同的端口。您可以使用 -p 标志指定自定义端口:
ssh -p 2222 username@hostname_or_IP_address
提示: 更改默认 SSH 端口(端口 22)是一种常见的安全做法,旨在减少自动化攻击尝试,但这并不能替代强大的认证。
基于 SSH 密钥的认证
虽然密码认证很常见,但基于密钥的认证是 SSH 推荐的更安全的方法。它使用一对加密密钥:一个私钥(保存在您的本地机器上)和一个公钥(放置在远程服务器上)。
生成 SSH 密钥对
使用 ssh-keygen 生成新的密钥对。建议为您的私钥使用一个强密码短语。
ssh-keygen -t rsa -b 4096
此命令生成一个 4096 位的 RSA 密钥对。私钥(id_rsa)和公钥(id_rsa.pub)通常存储在 ~/.ssh/ 中。
将您的公钥复制到远程服务器
要启用基于密钥的认证,您的公钥必须放置在远程服务器上的 ~/.ssh/authorized_keys 文件中。ssh-copy-id 工具可自动化此过程:
ssh-copy-id username@hostname_or_IP_address
此命令会提示您输入远程用户的密码一次,然后复制您的公钥并设置正确的权限。之后,您应该能够无需密码连接(如果您设置了私钥密码短语,则会提示您输入)。
警告: 绝不要与任何人共享您的私钥。它应该具有严格的文件权限(chmod 600 ~/.ssh/id_rsa)。
管理 SSH 连接和配置
远程执行单个命令
SSH 不仅仅用于交互式 Shell。您可以直接在远程服务器上执行单个命令,并将其输出返回到本地终端。
ssh username@hostname_or_IP_address 'command_to_execute'
示例:
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
ForwardAgent yes
Host devbox
Hostname dev.mydomain.com
User developer
Port 22
IdentityFile ~/.ssh/id_rsa_dev
配置完成后,您只需使用别名即可连接:
ssh webserver
ssh devbox
最佳实践: 始终使用 ~/.ssh/config 文件来管理复杂的 SSH 连接。它提高了可读性,减少了输入错误,并集中了您的配置。
使用 SSH 安全传输文件
SSH 提供了两种主要的安全文件传输工具:scp 和 sftp。
scp (安全复制协议)
scp 用于在本地和远程主机之间复制文件和目录。它使用与 SSH 相同的认证和安全机制。
将文件从本地复制到远程
scp /path/to/local/file username@hostname_or_IP_address:/path/to/remote/directory/
示例:
scp my_app.tar.gz admin@webserver:/var/www/html/
将文件从远程复制到本地
scp username@hostname_or_IP_address:/path/to/remote/file /path/to/local/directory/
示例:
scp admin@webserver:/var/log/nginx/access.log ~/logs/
递归复制目录
对于目录,使用 -r 标志:
rscp -r /path/to/local/dir username@hostname_or_IP_address:/path/to/remote/parent_dir/
保留文件属性
要保留修改时间、访问时间和模式,请使用 -p 标志:
scp -p localfile user@remotehost:/remotepath/
sftp (SSH 文件传输协议)
sftp 提供了一个交互式文件传输程序,类似于 FTP 但由 SSH 保护。它非常适合管理多个文件或执行复杂的目录操作。
连接到 SFTP 服务器
sftp username@hostname_or_IP_address
连接后,您会看到 sftp> 提示符。常用命令包括:
ls: 列出远程目录内容lls: 列出本地目录内容cd remote_directory: 更改远程目录lcd local_directory: 更改本地目录get remote_file: 下载文件put local_file: 上传文件mget remote_files: 下载多个文件(支持通配符)mput local_files: 上传多个文件(支持通配符)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 [local_port]:[remote_host]:[remote_port] username@ssh_server
示例: 通过跳板机 ssh_server,从本地机器的端口 9000 访问私有网络上的数据库服务器(端口 3306)。
ssh -L 9000:db.private.net:3306 [email protected]
现在,您可以在本地机器上连接到 localhost:9000,该连接将通过 jumphost.com 安全地转发到 db.private.net:3306。
远程端口转发(-R)
远程转发使您本地机器(或本地网络)上的服务可从远程服务器访问,并可能供远程服务器网络上的客户端使用。
ssh -R [remote_port]:[local_host]:[local_port] username@ssh_server
示例: 使本地 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 [local_port] username@ssh_server
示例: 通过 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_rsa
ssh-add ~/.ssh/id_rsa_web # 对于特定的密钥
当在 ~/.ssh/config 中使用 ForwardAgent yes 时,ssh-agent 至关重要,它允许您使用本地密钥从跳板机向后续服务器进行认证,而无需将您的私钥放置在跳板机上。
持久 SSH 连接 (ControlMaster)
为了更快的连接和减少开销,~/.ssh/config 中的 ControlMaster 允许多个 SSH 会话共享一个网络连接。
Host *
ControlMaster auto
ControlPath ~/.ssh/control/%r@%h:%p
ControlPersist 4h
此配置为第一个连接创建了一个控制套接字(ControlMaster auto),后续连接到同一主机将重用此套接字,最长可达 4 小时(ControlPersist 4h)。
SSH 问题排查
- 权限拒绝 (Permission Denied):检查私钥(
chmod 600 ~/.ssh/id_rsa)、公钥(chmod 644 ~/.ssh/id_rsa.pub)和.ssh目录(chmod 700 ~/.ssh)的文件权限。在服务器上,确保~/.ssh/authorized_keys具有chmod 600权限,~/.ssh具有chmod 700权限。 - 连接超时 (Connection Timed Out):服务器可能已关闭,防火墙阻止了端口 22(或自定义端口),或 IP 地址不正确。
- 详细输出 (Verbose Output):使用
ssh的-v、-vv或-vvv标志获取详细的调试信息。
bash ssh -vvv [email protected]
结论
SSH 是系统管理员不可或缺的工具,提供安全高效的远程访问、命令执行和文件传输功能。通过掌握本文讨论的命令和技术——从基本连接和基于密钥的认证到高级隧道和配置管理——您可以显著提高生产力并维护服务器基础设施的安全性。
定期审查您的 SSH 配置,利用基于密钥的认证,并充分利用 ~/.ssh/config 和 ssh-agent 等强大功能来简化您的日常任务。有了这些必备的 SSH 命令,您将能够自信而精准地管理远程系统。持续实践并探索其广泛功能,以在您的管理工作中解锁更高的效率。