参考
SSH(Secure Shell)是一种加密的远程登录协议, 常用于服务器运维、远程命令执行、文件传输及端口转发
配置
安装
# Debian / Ubuntu
sudo apt install openssh-server
# Alpine Linux
sudo apk add openssh
服务管理
开启服务
sudo service ssh start
sudo service ssh enable
停止服务
sudo service ssh stop
重启服务
sudo service ssh restart
# 或
sudo systemctl restart sshd
密钥
SSH 密钥认证是一种非对称加密认证方式, 由两部分组成:
-
私钥(id_rsa): 仅保存在本地主机
-
公钥(id_rsa.pub): 放在远程主机
登录时:
客户端用私钥签名
服务端用公钥验证
验证成功即可登录, 无需密码
生成密钥
ssh-keygen -t rsa -b 4096 -C "邮箱"
- 示例, 为dmjcb@proton.me生成密钥, 默认无密码
ssh-keygen -t rsa -b 4096 -C "dmjcb@proton.me"
终端有类似显示
Generating public/private rsa key pair.
Enter file in which to save the key (/home/dmjcb/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/dmjcb/.ssh/id_rsa
Your public key has been saved in /home/dmjcb/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:krLr7tw3dLvwQLeDmyEhyYTQqVmVals6x/HBpZQPoWs dmjcb@proton.me
The key's randomart image is:
+---[RSA 4096]----+
|.. o...o |
| .+...+ . |
| +..oo = |
|o oooo+.. |
| . =Eo+.S . |
| +.o+.+.o.. |
| o. ..=.o. |
| . o .oB.. |
| +* ..o.o. |
+----[SHA256]-----+
提示输入文件保存位置(默认是~/.ssh/id_rsa)和密钥密码(可选), 执行后在$HOME/下生成.ssh/
graph LR;
S(.ssh/)
S-->A(authorized_keys)-->A1(存储其他主机公钥)
S-->B(id_rsa)-->B1(本机私钥)
S-->C(id_rsa.pub)-->C1(本机公钥)
S-->D(know_hosts)-->D1(存储已认证主机host key)
清除密钥
当远程主机重装系统时, 可能出现 host key mismatch
ssh-keygen -R 远程主机IP
配置文件
路径/etc/ssh/sshd_config
禁用密码登陆(可选)
在禁用密码前, 请务必确认: 1. 密钥已成功配置; 2. 可以正常使用密钥登录; 否则可能被锁在服务器外
仅允许密钥登录, 可有效防止暴力破解
修改配置项如下
# 禁用密码认证
PasswordAuthentication no
# 启用公钥认证(通常是默认启用)
PubkeyAuthentication yes
# 允许挑战响应认证(如果不需要也可以禁用)
ChallengeResponseAuthentication no
# 还可考虑禁用GSSAPI认证(如果不需要)
GSSAPIAuthentication no
操作
连接
密码登录
默认端口
默认端口22
ssh 用户名@远程主机IP
- 示例, 连接dmjcb用户, 地址192.168.3.3, 默认22端口
ssh dmjcb@192.168.3.3
指定端口
ssh 用户名@远程主机IP -p 端口
- 示例, 连接dmjcb用户, 地址192.168.3.3, 指定9999端口
ssh dmjcb@192.168.3.3 -p 9999
密钥登录
手动复制
将本地id_rsa.pub 追加到远程 .ssh/authorized_keys里
ssh-copy-id
若是windows系统, 需先于powershell中执行,
function ssh-copy-id([string]$userAtMachine, $args){
$publicKey = "$ENV:USERPROFILE" + "/.ssh/id_rsa.pub"
if (!(Test-Path "$publicKey")){
Write-Error "ERROR: failed to open ID file '$publicKey': No such file"
} else {
& cat "$publicKey" | ssh $args $userAtMachine "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"
}
}
之后执行
ssh-copy-id -i 公钥路径(一般是.ssh/id_rsa.pub) 用户名@远程主机IP
- 示例, 设置密钥, 连接dmjcb用户, 主机192.168.3.3
ssh-copy-id -i ~/.ssh/id_rsa.pub dmjcb@192.168.3.3
保持 SSH 长连接
服务端设置(推荐)
修改配置文件如下表
.....
# server每隔60秒发送一次请求给client, 然后client响应, 从而保持连接
ClientAliveInterval 60
# server发出请求后, 客户端没有响应得次数达到3, 就自动断开连接, 正常情况下, client不会不响应
ClientAliveCountMax 3
......
客户端参数
连接时添加ServerAliveInterval
ssh -o ServerAliveInterval=60 用户名@远程主机IP
远程操作
执行指令
ssh 用户名@远程主机IP '命令'
- 示例, 远程执行
ls -la
ssh dmjcb@192.168.3.3 'ls -la'
文件传输(SCP)
SCP(Secure Copy)是SSH一个内置命令, 用于本地和远程机器之间传输文件
上传
scp 本地路径 (-r, 表示目录) 用户名@远程主机IP:远程路径
- 示例, 上传本地self_assets/到远程home/ubuntu/Documents/下
scp -r .self_assets/ dmjcb@192.168.1.128:/home/ubuntu/Documents
下载
scp 用户名@远程主机IP:远程路径 本地路径
- 示例, 下载远程主机/home/ubuntu/a.txt
scp dmjcb@192.168.1.128:/home/ubuntu/a.txt
端口转发
通过SSH可以进行端口转发, 将本地机器上端口映射到远程机器上, 或者将远程机器上端口映射到本地机器上
本地端口转发
ssh -L本地端口:目标地址:目标端口 用户名@远程主机IP
远程端口转发
ssh -R远程端口:目标地址:目标端口 用户名@远程主机IP
动态端口转发
ssh -D本地端口 用户名@远程主机IP
X11转发
SSH支持X11转发, 可在远程机器上运行图形化程序, 并在本地机器上显示
ssh -X 用户名@远程主机IP