ssh
(Secure Shell)是一个用于远程登录和管理服务器的网络协议和工具。它通过加密的方式提供安全的通信,可以远程登录、执行命令、传输文件等,是系统管理员和开发人员日常工作中非常重要的工具。
ssh
命令的基本语法
1 | ssh [选项] [用户@]主机 [命令] |
- 用户:远程主机上的用户名(可选,默认使用本地用户名)。
- 主机:目标服务器的 IP 地址或主机名。
- 命令:可选,如果指定,会在远程主机上执行该命令并退出。
基本用法
连接远程服务器
1 | ssh user@host |
-
示例:
1
ssh root@192.168.1.10
- 连接 IP 为
192.168.1.10
的主机,使用用户名root
。 - 如果未指定用户,则使用当前登录用户。例如:
1
ssh 192.168.1.10
- 连接 IP 为
指定端口
1 | ssh -p [端口号] user@host |
-
默认情况下,
ssh
使用端口22
。如果远程服务器使用了非默认端口,可以通过-p
指定端口号。 -
示例:
1
ssh -p 2222 root@192.168.1.10
- 使用端口
2222
连接远程服务器。
- 使用端口
执行远程命令
1 | ssh user@host [命令] |
-
直接在远程主机上执行命令,执行完成后退出。
-
示例:
1
ssh root@192.168.1.10 "ls -l /var/www"
- 在远程服务器上列出
/var/www
目录的内容。
- 在远程服务器上列出
使用密钥认证
ssh
支持通过密钥认证方式登录,无需输入密码,安全性更高。
生成 SSH 密钥
1 | ssh-keygen -t rsa |
- 按提示保存密钥对。生成的密钥文件默认存储在
~/.ssh/id_rsa
(私钥)和~/.ssh/id_rsa.pub
(公钥)。
将公钥复制到远程主机
1 | ssh-copy-id user@host |
-
示例:
1
ssh-copy-id root@192.168.1.10
-
这会将公钥添加到远程主机的
~/.ssh/authorized_keys
中,之后可以通过密钥登录。
使用密钥登录
1 | ssh -i /path/to/private_key user@host |
- 示例:
1
ssh -i ~/.ssh/id_rsa root@192.168.1.10
端口转发
本地端口转发
将远程服务器的某个端口转发到本地。
1 | ssh -L [本地端口]:[目标地址]:[远程端口] user@host |
-
示例:
1
ssh -L 8080:127.0.0.1:3306 root@192.168.1.10
- 将本地的
8080
端口映射到远程192.168.1.10
的3306
端口(通常是 MySQL 服务)。
- 将本地的
远程端口转发
将本地的某个端口转发到远程服务器。
1 | ssh -R [远程端口]:[目标地址]:[本地端口] user@host |
-
示例:
1
ssh -R 8080:127.0.0.1:80 root@192.168.1.10
- 将远程服务器上的
8080
端口映射到本地的80
端口。
- 将远程服务器上的
代理转发
允许通过跳板机访问目标服务器。
1 | ssh -J user@jump_server user@target_server |
-
示例:
1
ssh -J user@jumpserver.com root@192.168.1.10
- 通过
jumpserver.com
跳板服务器连接目标服务器192.168.1.10
。
- 通过
保持连接(防止超时断开)
通过配置 ServerAliveInterval
和 ServerAliveCountMax
参数,防止 SSH 会话因长时间无操作而断开。
1 | ssh -o ServerAliveInterval=60 user@host |
ServerAliveInterval=60
:每 60 秒发送一个心跳包。
使用配置文件简化连接
通过修改 ~/.ssh/config
文件,可以为常用的主机设置别名和默认选项,简化连接命令。
编辑配置文件
1 | nano ~/.ssh/config |
添加以下内容:
1 | Host myserver |
Host
:别名。HostName
:目标主机 IP 或域名。User
:默认用户名。Port
:默认端口。IdentityFile
:指定私钥文件。
使用别名连接
1 | ssh myserver |
复制文件(scp
和 rsync
)
使用 scp
通过 SSH 传输文件。
1 | scp /local/path/file user@host:/remote/path/ |
- 从本地复制到远程:
1
scp file.txt root@192.168.1.10:/var/www/
- 从远程复制到本地:
1
scp root@192.168.1.10:/var/www/file.txt /local/path/
使用 rsync
同步文件或目录,支持断点续传。
1 | rsync -avz /local/path/ user@host:/remote/path/ |
- 示例:
1
rsync -avz file.txt root@192.168.1.10:/var/www/
常用选项
选项 | 功能 |
---|---|
-p [端口号] |
指定远程主机的端口号(默认是 22)。 |
-i [私钥路径] |
使用指定的私钥文件进行认证。 |
-L [本地转发] |
配置本地端口转发。 |
-R [远程转发] |
配置远程端口转发。 |
-J [跳板机] |
配置跳板机代理转发。 |
-o [选项] |
设置 SSH 配置参数(如 ServerAliveInterval 等)。 |
-X 或 -Y |
启用 X11 图形转发,允许运行远程图形界面程序(需要 X11 环境)。 |
-C |
启用压缩,提高低带宽网络的传输速度。 |
-f |
在后台运行 SSH 会话(常用于端口转发)。 |
-q |
安静模式,不显示任何输出信息。 |
常见问题与解决
连接超时或拒绝连接
-
原因:
- 目标主机 SSH 服务未启动。
- 防火墙阻止了 SSH 端口。
- 使用了错误的端口号。
-
解决方法:
- 确认目标主机 SSH 服务是否运行:
1
sudo systemctl status ssh
- 检查防火墙规则:
1
sudo ufw allow 22
- 确认目标主机 SSH 服务是否运行:
公钥认证失败
-
原因:
- 公钥未正确添加到远程主机。
- 权限问题(
~/.ssh
目录或文件权限不正确)。
-
解决方法:
- 检查公钥是否已复制:
1
cat ~/.ssh/authorized_keys
- 修复权限:
1
2chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
- 检查公钥是否已复制:
断开后无法重新连接
-
原因:
- SSH 会话未正确关闭,导致僵尸会话。
-
解决方法:
- 在本地清理已知主机的缓存:
1
ssh-keygen -R [host]
- 在本地清理已知主机的缓存:
总结
- 基本连接:
ssh user@host
- 执行远程命令:
ssh user@host "command"
- 密钥登录:
ssh-keygen
->ssh-copy-id
- 简化配置:使用
~/.ssh/config
- 文件传输:
scp
或rsync
ssh
是一个强大且灵活的工具,熟练掌握它可以极大提升远程管理和协作的效率。