目录
-
基础连接
(图片来源网络,侵删)- 基本语法
- 指定端口
- 指定用户名
- 结合使用
-
安全密钥登录 (推荐)
- 生成密钥对
- 将公钥复制到远程服务器
- 使用密钥登录
- 配置 SSH 客户端
-
文件传输
scp- 安全复制sftp- 安全文件传输协议
-
高级 SSH 使用技巧
- 端口转发 (隧道)
- 本地端口转发
- 远程端口转发
- 动态端口转发 (SOCKS 代理)
ssh-agent- 密钥代理~/.ssh/config配置文件 (简化命令)
- 端口转发 (隧道)
-
实用命令
(图片来源网络,侵删)- 查看版本
- 调试连接问题
- 执行远程命令
-
安全建议
基础连接
基本语法
ssh [用户名]@[服务器IP或域名]
连接到 user@example.com:
ssh user@example.com
首次连接时,系统会提示你确认服务器的指纹(这是为了防止中间人攻击),输入 yes 即可。
指定端口
SSH 服务运行在非标准的 22 端口,使用 -p 选项。
ssh -p 2222 user@example.com
指定用户名
如果用户名与本地用户名不同,必须指定。
ssh admin@192.168.1.100
结合使用
将选项和用户名、地址组合在一起。
ssh -p 2222 admin@192.168.1.100
安全密钥登录 (推荐)
使用密钥对比密码更安全,也更方便。
生成密钥对
在本地机器上执行,如果已有密钥,可以跳过此步。
# 使用 Ed25519 算法(推荐,现代且高效) ssh-keygen -t ed25519 # 或者使用传统的 RSA 算法 # ssh-keygen -t rsa -b 4096
命令会提示你保存密钥的位置(默认 ~/.ssh/id_ed25519)和设置密码(可选,但更安全)。
将公钥复制到远程服务器
使用 ssh-copy-id 命令可以轻松完成。
ssh-copy-id -p 2222 user@example.com
此命令会将你 ~/.ssh/id_*.pub 文件中的公钥内容追加到远程服务器 ~/.ssh/authorized_keys 文件的末尾。
使用密钥登录
配置完成后,再次登录就不需要输入密码了。
ssh user@example.com
如果生成密钥时设置了密码,系统会要求你输入密钥的密码。
文件传输
scp - 安全复制
scp 的语法和 cp 类似,但需要在源或目标地址前加上 [user@]host:。
从本地复制到远程
# 复制单个文件 scp local_file.txt user@example.com:/remote/path/ # 复制整个目录 scp -r /local/directory user@example.com:/remote/path/ # 指定端口 scp -P 2222 local_file.txt user@example.com:/remote/path/
注意: -P (大写) 用于 scp 指定端口,而 -p (小写) 用于保留文件的时间戳等属性。
从远程复制到本地
# 复制单个文件 scp user@example.com:/remote/path/remote_file.txt ./local_directory/ # 复制整个目录 scp -r user@example.com:/remote/path/ ./local_directory/
sftp - 安全文件传输协议
sftp 提供了一个交互式的 shell,类似 ftp,但连接是加密的。
sftp user@example.com
连接后,你会进入一个 sftp> 提示符,可以使用以下命令:
| 命令 | 描述 | 示例 |
|---|---|---|
ls |
列出远程目录内容 | ls -l |
cd |
切换远程目录 | cd /var/log |
get |
下载文件到本地 | get remote_file.txt |
put |
上传本地文件到远程 | put local_file.txt |
mkdir |
在远程创建目录 | mkdir new_dir |
rm |
删除远程文件 | rm old_file.txt |
rmdir |
删除远程空目录 | rmdir empty_dir |
exit |
退出 sftp 会话 | exit 或 bye |
高级 SSH 使用技巧
端口转发 (隧道)
通过 SSH 隧道,可以安全地访问被防火墙阻挡的服务。
本地端口转发
将本地机器的一个端口流量转发到远程服务器的一个端口。
场景: 你想从家里访问公司内网的数据库服务(db_server:3306),但公司只允许通过堡垒机(bastion_host)访问。
# 将本地 3307 端口的流量,通过 bastion_host 转发到 db_server 的 3306 端口 ssh -L 3307:db_server:3306 user@bastion_host
在你的本地机器上,连接 localhost:3307 就等同于连接公司内网的 db_server:3306。
远程端口转发
将远程服务器的一个端口流量转发到本地机器的一个端口。
场景: 你在办公室,想让家里的电脑能访问你办公室电脑上的一个 Web 服务(localhost:8080)。
# 在办公室电脑上执行,将远程服务器 (home_server) 的 8080 端口流量转发到本地 8080 端口 ssh -R 8080:localhost:8080 user@home_server
在你的 home_server 上,访问 localhost:8080 就等同于访问你办公室电脑的 localhost:8080。
动态端口转发 (SOCKS 代理)
创建一个 SOCKS5 代理,可以代理所有通过指定端口的 TCP 流量。 场景: 你想通过一个远程服务器安全地浏览互联网,访问所有网站都通过该服务器中转。
# 在本地机器上执行,创建一个监听本地 1080 端口的 SOCKS 代理 ssh -D 1080 user@example.com
配置你的浏览器(如 Firefox、Chrome)使用 localhost:1080 作为 SOCKS 代理,所有网络流量都会加密并通过 example.com 跳转。
ssh-agent - 密钥代理
ssh-agent 是一个后台程序,用于持有你的私钥,一旦你将密钥添加到 ssh-agent,在当前会话中,所有 SSH 连接都可以使用该密钥而无需重复输入密码。
# 启动 ssh-agent (通常在 shell 启动脚本中配置) eval "$(ssh-agent -s)" # 将私钥添加到 agent ssh-add ~/.ssh/id_ed25519 # 如果设置了密码,此时需要输入一次
添加后,你打开新的终端窗口,ssh 命令将自动使用 agent 中的密钥。
~/.ssh/config 配置文件
这个文件可以让你为不同的主机创建别名,简化命令。
编辑 ~/.ssh/config 文件:
# ~/.ssh/config
# 公司服务器配置
Host company-bastion
HostName 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/company_key
# GitHub 配置 (使用密钥)
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
# 个人服务器配置
Host personal-server
HostName example.com
User myuser
ForwardX11 yes # 启用 X11 转发
配置后,连接变得非常简单:
ssh company-bastion ssh personal-server
实用命令
查看版本
ssh -V
调试连接问题
使用 -v (verbose) 选项可以查看详细的连接过程,对排查问题非常有用。
ssh -v user@example.com
使用 -vv 或 -vvv 可以获得更详细的信息。
执行远程命令
无需登录到远程 shell,直接在远程执行命令并返回结果。
# 获取远程服务器的磁盘使用情况 ssh user@example.com 'df -h' # 在远程服务器上创建一个目录 ssh user@example.com 'mkdir -p /tmp/my_project' # 结合管道,将本地文件内容通过 SSH 写入远程文件 cat local_file.txt | ssh user@example.com 'cat > /remote/path/remote_file.txt'
安全建议
- 优先使用密钥登录:禁用密码登录,只允许密钥登录。
- 使用强密码:如果必须使用密码,请确保密码足够复杂。
- 更改默认端口:将 SSH 服务的端口从 22 改为一个非标准的、高数字的端口。
- 禁用 root 登录:在服务器配置中,禁止
root用户直接通过 SSH 登录。 - 使用
Fail2ban:部署Fail2ban工具,自动封禁多次登录失败的 IP 地址。 - 定期更新 OpenSSH:保持你的 OpenSSH 软件是最新版本,以获得最新的安全补丁。
- 使用
AllowUsers或AllowGroups:在 SSH 服务器配置文件 (sshd_config) 中,只允许特定的用户或用户组通过 SSH 登录。
希望这份指南对你有帮助!SSH 是一个非常强大的工具,熟练掌握它能极大地提升你的工作效率。
