精通 SSH:您的必备命令行指南
安全外壳(SSH)协议是 Linux、macOS 和类 Unix 环境中安全远程管理的核心。它提供了一个加密通道用于网络服务,允许用户安全地登录远程系统、执行命令和传输文件,而无需暴露敏感数据。
虽然 SSH 无处不在,但掌握其核心命令和配置选项可以极大地提高远程服务器管理工作流的效率、安全性和可靠性。本指南是一个全面的资源,涵盖了安全登录、高效文件处理以及端口转发等强大网络技术所需的基本命令。
1. 建立安全远程登录
SSH 最常见的用途是保护到远程服务器的终端连接。基本语法很简单,但有关键选项可用于增强安全性和可用性。
基本连接语法
标准命令需要指定远程用户和主机地址(IP 或域名):
ssh [用户]@[主机]
# 示例:
ssh [email protected]
指定非标准端口
出于安全原因,许多管理员会更改默认的 SSH 端口(端口 22)。使用 -p 标志指定不同的端口号:
ssh -p 2222 [email protected]
执行单个远程命令
SSH 不仅限于打开交互式 shell。您可以远程执行单个命令,并将输出返回本地,这对于脚本编写和快速检查非常有用。
# 在远程服务器的 /var/log 目录下运行 'ls -l'
ssh user@host 'ls -l /var/log'
# 检查服务器的正常运行时间
ssh user@host uptime
2. 使用 SSH 密钥管理身份验证
密码身份验证容易受到暴力破解攻击。SSH 密钥——由私钥(保存在您的机器上)和公钥(放置在远程服务器上)组成的加密对——提供了一种更安全得多的身份验证方法。
生成密钥对
如果您还没有密钥对,可以使用 ssh-keygen 生成一个。最佳实践是使用强密码短语来保护您的私钥。
ssh-keygen -t rsa -b 4096
将公钥复制到服务器
ssh-copy-id 实用程序是将本地公钥(~/.ssh/id_rsa.pub)安装到远程用户 ~/.ssh/authorized_keys 文件中的最简单方法,从而实现无密码登录。
# 将默认公钥复制到服务器并设置正确的权限
ssh-copy-id user@host
提示:使用私钥
如果您的私钥不在默认位置(~/.ssh/id_rsa),则在连接时必须使用-i标志指定其路径:
bash ssh -i ~/.ssh/my_custom_key user@host
3. 安全文件传输
SSH 提供了两种主要的安全文件传输工具:scp(安全复制)和 sftp(安全文件传输协议)。
A. 使用安全复制 (scp)
scp 非常适合简单、快速、一次性的文件传输,它提供了一个模仿标准 Unix cp(复制)命令的命令行界面。
将本地文件传输到远程
# 语法:scp [本地文件] [用户]@[主机]:/[远程路径]
scp deployment.tar.gz user@webserver:/var/www/uploads/
将远程文件传输到本地
# 语法:scp [用户]@[主机]:/[远程文件] [本地路径]
scp user@dbserver:/var/log/backup.sql .
递归复制目录
使用 -r 标志复制整个目录结构。
scp -r ~/project_files/ user@buildserver:/home/user/builds/
B. 使用安全文件传输协议 (sftp)
sftp 建立一个交互式会话,类似于传统的 FTP 客户端,但通过 SSH 加密。它更适合在单个会话中导航远程目录、列出文件和执行多个传输。
启动 sftp 会话
sftp user@host
常见的 sftp 会话命令
| 命令 | 描述 |
|---|---|
ls |
列出远程文件 |
lls |
列出本地文件 |
get filename |
从远程服务器下载文件 |
put filename |
上传文件到远程服务器 |
cd /path/ |
更改远程目录 |
lcd /path/ |
更改本地目录 |
quit |
退出 sftp 会话 |
4. 高级技术:SSH 隧道(端口转发)
SSH 隧道,或称端口转发,允许您加密非安全协议的连接,或通过跳板主机访问内部网络上的服务。最常见的形式是本地端口转发。
本地端口转发 (-L)
本地转发将您本地机器上的端口流量通过 SSH 服务器转发到远程主机上的指定端口。这对于访问不直接暴露给公共互联网的内部数据库、Web 界面或专有服务非常有用。
场景: 您想访问私有内部 Web 服务器(只能从 jumpbox 访问)的 80 端口。
# 语法:ssh -L [本地端口]:[目标主机]:[目标端口] [用户]@[跳板主机]
ssh -L 8080:internal-web.lan:80 user@jumpbox -N
-L 8080:internal-web.lan:80:您本地机器上到达 8080 端口的流量将通过jumpbox转发到internal-web.lan的 80 端口。-N:告诉 SSH 不要执行远程命令;它仅用于建立隧道。
连接建立后,您可以通过在本地浏览器中导航到 http://localhost:8080 来访问内部站点。
5. 使用 SSH 配置文件提高效率
手动输入复杂的 SSH 命令(包括自定义端口、用户名和密钥路径)效率低下。SSH 配置文件(~/.ssh/config)允许您为经常访问的服务器定义别名和设置。
示例配置(~/.ssh/config)
创建或编辑文件 ~/.ssh/config,结构如下:
# 服务器 1:标准密钥,非标准端口
Host dev-web
HostName 10.0.0.50
User deployment_user
Port 2222
IdentityFile ~/.ssh/id_rsa_dev
# 服务器 2:需要密钥身份验证的跳板访问
Host production-db
HostName 203.0.113.10
User sysadmin
IdentityFile ~/.ssh/prod_key
LocalForward 54320 127.0.0.1:5432
使用别名连接
配置完成后,连接变得更加简单:
# 以 deployment_user 用户连接到 10.0.0.50 端口 2222
ssh dev-web
# 连接并自动设置端口转发(如果已配置)
ssh production-db
结论
SSH 是一个强大、灵活的工具,对于现代系统管理至关重要。通过超越基本的 ssh user@host 命令,采用基于密钥的身份验证,利用 scp 和 sftp 等安全文件传输工具,以及掌握配置文件,您可以解锁一个高效且安全的远程访问环境。持续练习这些基本命令可确保您能够有效地、安全地管理和与远程基础设施进行交互。