Linux-Debian-Ubuntu如何设置或删除swap

Linux-Debian-Ubuntu如何设置或删除swap

Linux-Debian-Ubuntu如何设置或删除swap虚拟内存

虚拟内存 swap 简单的说就是将硬盘当内存用,用于解决内存容量不足的情况。

swap交换空间其实就是硬盘上一个特定的文件,只不过这个文件只有内存在读写。

查看当前系统是否设置了 swap

root@mbapp1a:~# free -m
total used free shared buff/cache available
Mem: 1982 755 66 2 1160 1040
Swap: 2047 22 2025

如果 swap 栏都是 0 0 0 表示没有设置过。

free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。

有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数:

$ free -h -s 3

主要命令如下:

1
2
3
4
5
6
7
8
sudo dd if=/dev/zero of=swapfile bs=1M count=2048
sudo mkswap swapfile
sudo chmod 600 swapfile
sudo swapon swapfile
cat /proc/swaps
swapon -s
sudo swapon --show
sudo free -h

如何设置swap?

一般物理内存小于2GB就设置为内存的两倍,小于8GB设置为等于内存,大于8GB的设置小于4GB

1、创建swap文件

格式: sudo dd if=/dev/zero of=swapfile count=4096 bs=1M

ls -al swapfile

1
2
3
4
5
6
7
8
9
10
11
# 创建一个 swap 目录,方便管理
mkdir swap
cd swap

# 创建swap文件
sudo dd if=/dev/zero of=swapfile bs=1M count=2048

sudo dd if=/dev/zero of=swapfile bs=1M count=4096

# 查看swap文件是否创建好了
ls -al swapfile

count=4096 bs=1M 表示创建 4GB 的虚拟内存,单位是 M

该命令中 count 即代表swap文件大小,我这里设置的是2Gb,你可以换成自己想设置的大小

$ sudo dd if=/dev/zero of=swapfile bs=1M count=2048
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 18.5132 s, 116 MB/s

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

参数注释:

if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
bs=bytes:同时设置读入/输出的块大小为bytes个字节。

count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。

3、激活 Swap 文件

mkswap 命令,用于在一个文件或者设备上建立交换分区。

sudo mkswap swapfile
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=1fd2cb84-ae10-4ef0-9ec3-13059528f395

使用 swapon 命令激活交换文件:

sudo swapon swapfile
swapon: /root/swap/swapfile: insecure permissions 0644, 0600 suggested.
swapon: /root/swap/swapfile: read swap header failed

$ ls -al
total 2097164
drwxr-xr-x 2 root root 4096 Jun 22 20:31 .
drwx—— 7 root root 4096 Jun 22 20:30 ..
-rw-r–r– 1 root root 2147483648 Jun 22 20:31 swapfile

$ sudo chmod 600 swapfile

$ sudo mkswap swapfile
mkswap: /swapfile: warning: wiping old swap signature.
Setting up swapspace version 1, size = 947.2 MiB (993243136 bytes)
no label, UUID=383a444c-3a78-45b6-91a2-4f8df078689d

  1. 查看现有的swap
1
2
3
4
5
6
7
root@mbapp1a:~# cat /proc/swaps
Filename Type Size Used Priority
/root/swapfile file 2097148 22784 -2

root@mbapp1a:~# swapon -s
Filename Type Size Used Priority
/root/swapfile file 2097148 22784 -2

sudo swapon –show

1
2
3
root@mbapp1a:~# sudo swapon --show  
NAME TYPE SIZE USED PRIO
/root/swapfile file 2G 22.3M -2

使用 free -h 命令查看:

1
2
3
4
root@mbapp1a:~# free -h
total used free shared buff/cache available
Mem: 1.9Gi 753Mi 82Mi 2.0Mi 1.1Gi 1.0Gi
Swap: 2.0Gi 22Mi 2.0Gi

设置系统启动时自动开启 Swap

修改 /etc/fstab 文件:

1
2
3
4
5
6
7
# 编辑fsta文件
$ sudo vim /etc/fstab

# 在最后添加
/swapfile none swap sw 0 0

# 保存文件(:wq)

如何删除swap?

首先输入以下命令停用 SWAP 空间:

sudo swapoff -v swapfile

在 /etc/fstab 文件中删除有效 swap 的行

最后执行以下命令删除 swapfile 文件:

sudo rm swapfile

可以使用 top 命令查看运行情况

1
2
3
4
5
6
7
8
9
10
root@mbapp1a:~# top

top - 23:31:13 up 7 days, 23:53, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 110 total, 1 running, 109 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.5 sy, 0.0 ni, 99.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1982.1 total, 81.6 free, 753.4 used, 1147.1 buff/cache
MiB Swap: 2048.0 total, 2025.7 free, 22.2 used. 1043.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5533 root 20 0 1033224 66000 11520 S 0.7 3.3 119:34.35 YDService
9 root 20 0 1305080 17772 4404 S 0.3 0.9 2:30.60 YDLive

新买的移动硬盘无法分区,该怎么选择分区方案和文件系统格式呢?

新买的移动硬盘无法分区,该怎么选择分区方案和文件系统格式呢?

问题:

移动硬盘在使用Mac【磁盘工具】App时,进行格式化【抹掉】可以正常进行,但是【分区】按钮却显示为灰色,无法进行分区。鼠标放在【分区】图标上,提示“无法将包含主引导记录分区图的磁盘进行分区”。

查找:

对比一下系统内置的硬盘,【分区】图标是正常的,注意到硬盘图标旁边的提示是“PCI内置物理磁盘 • GUID分区图”。 而外置的这个硬盘,硬盘图标旁边的提示是“USB外置物理磁盘 • 主引导记录”。网上一搜,原来是分区方案的问题,找到问题了。

解决:

重新抹掉该硬盘,抹掉方案选择“GUID分区图”接口。

拓展内容

抹掉操作

打开“磁盘工具” App,点击【抹掉】磁盘,会有以下内容的弹窗提示:

1
2
3
4
5
6
7
要抹掉“External USB 3.0 Media”吗?

抹掉“External USB 3.0 Media”将永久抹掉储存在上面的所有数据。您无法撤销此操作。

· 名称:未命名
· 格式:Apple、 Mac OS 扩展、MS Dos(FAT)、ExFat
· 方案:GUID分区图、主引导记录、Apple分区图

这个格式和方案,该怎么选择呢?

先来看分区:

目前,磁盘工具支持以下3中分区图方案:

(1)GUID 分区图:为基于 Intel 的所有 Mac 电脑选取此选项。
(1)主引导记录:为格式化为 MS-DOS (FAT) 或 ExFAT 的 Windows 分区选取此选项。
(3)Apple 分区图:为兼容基于 PowerPC 的早期 Mac 电脑选取此选项。

该选择哪一个分区方案呢?
答: 直接选择【GUID 分区图】 即可。

再看看格式:

Mac 上的“磁盘工具”支持多种文件系统格式,主要分为这3类:

(1)Apple 文件系统 (APFS):macOS 10.13 或后续版本使用的文件系统。
(2)Mac OS 扩展:macOS 10.12 或之前版本使用的文件系统。
(3)MS-DOS (FAT) 和 ExFAT:与 Windows 兼容的文件系统。

该选择哪一个文件系统格式呢?

答:直接选择【ExFAT】 即可。如果只在苹果机器上使用,也可以选择默认的【Mac OS 扩展(日志式)】。

为什么要选择【ExFAT】格式?

对于移动硬盘,一般都推荐选择 ExFAT 格式,因为 ExFAT 是 FAT32 的64位升级版(也称 FAT64),三大主流操作系统(Linux、Mac、Windows)都支持。

Windows 主要的三种文件系统格式: FAT32、NTFS、exFAT。目前 NTFS 是 Windows 系统默认的文件系统。

参考链接:

磁盘工具使用手册 https://support.apple.com/zh-cn/guide/disk-utility/welcome/mac

https://ruanyifeng.com/blog/2018/10/exfat.html

https://zhuanlan.zhihu.com/p/165421806

安装MySQL的问题-ERROR 1044 (42000) Access denied for user

安装MySQL的问题:ERROR 1044 (42000): Access denied for user

安装MySQL的一些问题:

安装版本:Mac OS X 10.9 (x86, 64-bit), DMG Archive 5.6.24 167.6M
(mysql-5.6.24-osx10.9-x86_64.dmg)
下载地址:http://dev.mysql.com/downloads/mysql/

(1)自定义命令alias:
vim ~/.bashrc
添加两行记录:
alias mysql=/usr/local/mysql/bin/mysql
alias mysqladmin=/usr/local/mysql/bin/mysqladmin
source ~/.bashrc

(2)密码问题

在创建数据库时,如果没有设置密码,可能会出现的问题,更改mysql root账户密码就可以解决这个问题。

mysql> CREATE DATABASE test2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ERROR 1044 (42000): Access denied for user ‘‘@’localhost’ to database ‘test2’

是因为mysql数据库的user表里,存在用户名为空的账户即匿名账户,导致登录的时候是虽然用的是root,但实际是匿名登录的。

重新设置密码:
mysqladmin -u root password 新密码
再次创建数据库 test2, 成功:
mysql> CREATE DATABASE test2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

(OVER)

参考资料:
http://www.it165.net/database/html/201408/7795.html
http://www.cnblogs.com/macro-cheng/archive/2011/10/25/mysql-001.html
http://dev.mysql.com/downloads/mysql/
http://www.tuicool.com/articles/3myYrqm

如何在 Nginx 服务器中禁止恶意扫描与垃圾爬虫呢?

在查看网站日志时,会发下有许多的恶意扫描和垃圾爬虫,为了网站安全和减轻服务器压力,我们应该想办法阻止这些垃圾请求。

具体操作就是,先通过 Nginx 访问日志,查看哪些是垃圾请求,然后通过 Nginx 配置,屏蔽他们访问。

本人网站的 Nginx Access 日志在:/var/log/nginx/ 目录。

1
2
$ nginx -v
nginx version: nginx/1.18.0

屏蔽恶意IP地址

(1)使用 awk 命令查询访问最频繁的IP:

1
$ awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more

说明,使用 awk 命令拆分日志,打印第一列($1表示第一列,默认的 access日志,第一列是IP地址),排序和去重后查看。

(2)使用 deny 指令屏蔽 IP

获取到恶意访问的IP后,我们可以使用 deny 指令来屏蔽。

可以指定单个IP,也可以按照IP段进行屏蔽。以下是屏蔽示例:

1
2
3
4
5
6
7
8
9
http {

deny 108.179.194.35; # 扫描 wordpress
deny 159.203.31.171; # 扫描 wp-login
deny 158.69.243.0/24; # MJ12bot
deny 46.229.168.0/24; # SemRush
deny 54.36.148.0/24; # AhrefsBot
deny 54.36.149.0/24; # AhrefsBot
}

备注: deny 指令可以在 Nginx 的 http, server, location 上下文中指定。

(3)另外还有一个 allow 指令,指明哪些请求可以访问。

对于仅限特定用户访问的内容,我们可以指明其允许访问的IP。比如网站管理后台的链接,仅限指定的ip段访问。

1
2
3
4
5
6
location /admin {
allow 192.168.1.0/24;
allow 112.66.77.88;
allow 112.65.12.0/24;
deny all;
}

说明,这里配置的,除了指定的几个ip 或 ip段,剩下的全部拒绝访问。

根据客户端的请求链接屏蔽访问

(1)使用 awk 命令查询访问最频繁的链接

1
$ awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more

说明,本人网站的 access.log 第7列为 url 地址(Nginx默认配置),如果指明了nginx日志格式,可能会有不同。

(2)找出这些恶意的访问地址

这里列出一些访问比较多的恶意链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/wp-signin.php?dizo&ping
/wp-login.php
/wp-includes/css/wp-config.php
/wp-includes/wlwmanifest.xml
/.env
/phpMyAdmin-2.6.3/
/phpMyAdmin-2.6.2/
/root.rar
/bak.zip
/wang123.net1.rar
/wang123.net1.zip
/wang123.net2.rar
/wang123.net2.zip
/inc/config.asp
/config/AspCms_Config.asp
/.aws/.credentials.swp
/.aws/config

可以看到这是在扫描 WordPress 和 phpMyAdmin、下载网站的压缩包、扫描网站可能存在的配置。

在 Nginx 中,我们可以使用 $document_uri 来获取到请求 uri,根据 uri 我们来判断哪些后缀的请求我们拒绝其访问。

(3)现根据后缀名屏蔽掉一批请求:

1
2
3
4
# 屏蔽恶意访问
if ($document_uri ~* \.(php|asp|aspx|jsp|swp|git|env|yaml|yml|sql|db|bak|ini|docx|doc|rar|tar|gz|zip|log)$) {
return 404;
}

说明,这里使用 if 语句,匹配以 . 开始,以 php、asp 、jsp 、env 等后缀结尾的文件,如果存在,nginx 则直接返回 404 给客户端。

注意,这里的配置的后缀仅供参考,按需配置,比如你如果想让用户下载doc文件,就把 doc|docx 去掉。

Tips: 变量 $document_uri ($uri) 与 $request_uri 有什么不同?

1
2
3
4
5
比如访问链接是 https://wang123.net/posts/test.db?wd=test&limit=5

$document_uri 变量的值为:/posts/test.db

$request_uri 变量的值为: /posts/test.db?wd=test&limit=5

(3)在根据关键词屏蔽一批请求:

对于一些我们不能按照后缀进行屏蔽的链接,比如 /wp-includes/wlwmanifest.xml ,这个 xml 后缀不能屏蔽(因为网站其他地方有要用的xml链接,因此我们改用其他关键词进行屏蔽。

根据请求 uri 里的的关键词进行屏蔽,示例如下:

1
2
3
if ($document_uri ~* (wordpress|phpinfo|wlwmanifest|phpMyAdmin|xmlrpc)) {
return 404;
}

说明,这里匹配几个特定关键词,匹配上来直接返回 404 错误。再访问 /wp-includes/wlwmanifest.xml 会直接 404。

注意,这里的配置要谨慎,如果配置了,url链接里就不能有这些关键词了,否则 nginx 则直接返回 404 错误。

屏蔽恶意爬虫

浏览器或者爬虫工具访问,一般都会带有 User Agent (浏览器用户标识)。

我们根据一些关键词,屏蔽特定的爬虫或工具。

在 Ngxin 中,$http_user_agent 变量可以获取到 用户的 UA ,匹配到我们指定的关键词,直接返回 403 无权访问。

1
2
3
4
5
6
7
8
9
10
11
12
server {
# 禁止Scrapy等工具的抓取
if ($http_user_agent ~* (Scrapy|HttpClient|PostmanRuntime|ApacheBench|Java||python-requests|Python-urllib|node-fetch)) {
return 403;
}

# 禁止指定的 user agent 以及为空的访问
if ($http_user_agent ~ "Nimbostratus|MJ12bot|MegaIndex|YisouSpider|^$" ) {
return 403;
}

}

注意,这里仅列出来了部分爬虫的 UA 关键词,更多的可以去网上搜索“垃圾爬虫”。

有些爬虫也支持 robots 协议, 因为我们在网站根目录的 robots.txt 中也可以都加上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
User-agent:*
Disallow:/dashboard
Disallow:/admin
Disallow:/static
Disallow:/assets

User-Agent: AhrefsBot
Disallow: /
User-Agent: MJ12bot
Disallow: /
User-Agent: DotBot
Disallow: /
User-Agent: SemrushBot
Disallow: /
User-Agent: MauiBot
Disallow: /

对IP和服务进行限流


Nginx 提供了2个模块来处理限流,分别是 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块

这里我们使用 ngx_http_limit_conn_module 里的 limit_conn_zone 和 limit_conn 指令配置,限制请求的连接数。

1
2
3
4
5
6
7
8
http {
##### limit
limit_conn_zone $binary_remote_addr zone=perIP:10m;
limit_conn_zone $server_name zone=perServer:10m;
limit_conn perIP 10;
limit_conn perServer 200;
limit_conn_status 503;
}

limit_conn_zone 配置存在的连接的空间(zone),一个名字叫 perIP,一个名字叫 perServer,空间的大小都指定大小为 10m 。

limit_conn perip 10 作用的 key 是 $binary_remote_addr,表示限制单个IP同时最多能持有10个连接。

limit_conn perserver 200 作用的 key 是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数为 200。

limit_conn_status 表示,如果超出链接,直接返回 503 错误。

注意, limit_conn 的数值按需调整。上边的配置会对全站都生效。如果只是想对某个 uri 限流,可以将 limit_conn 写在 location 上下文里。

1
2
3
4
5
6
7
8
9
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
location /download/ {
limit_conn addr 1;
}
}
}

总结

为了方便管理,我们创建两个配置文件,对ip和spider分别管理。

屏蔽IP访问 block_ips.conf

1
2
3
4
5
6
deny 108.179.194.35;   # 扫描 wordpress 
deny 159.203.31.171; # 扫描 wp-login
deny 158.69.243.0/24; # MJ12bot
deny 46.229.168.0/24; # SemRush
deny 54.36.148.0/24; # AhrefsBot
deny 54.36.149.0/24; # AhrefsBot

屏蔽UA访问 block_spiders.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 禁止Scrapy等工具的抓取
if ($http_user_agent ~* (Scrapy|HttpClient|PostmanRuntime|ApacheBench|Java||python-requests|Python-urllib|node-fetch)) {
return 403;
}

# 禁止指定的 user agent 以及为空的访问
if ($http_user_agent ~ "Nimbostratus|MJ12bot|MegaIndex|YisouSpider|^$" ) {
return 403;
}

# 屏蔽恶意访问
if ($document_uri ~* \.(php|asp|aspx|jsp|swp|git|env|yaml|yml|sql|db|bak|ini|docx|doc|rar|tar|gz|zip|log)$) {
return 404;
}

# 屏蔽指定关键词
if ($document_uri ~* (wordpress|phpinfo|wlwmanifest|phpMyAdmin|xmlrpc)) {
return 404;
}

这样在 nginx.conf 中就可以直接 include 进来了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
http {
include mime.types;
default_type text/html;

##### limit 限流
limit_conn_zone $binary_remote_addr zone=perIP:10m;
limit_conn_zone $server_name zone=perServer:10m;
limit_conn perIP 10;
limit_conn perServer 200;
limit_conn_status 503;

### 引入屏蔽规则
include /etc/nginx/block_ips.conf;
include /etc/nginx/block_spiders.conf;

### 其他配置
}

重启 nginx 即可生效。 (本机的nginx,是使用 apt 包安装的,可以直接 使用 systemctl 管理 nginx 服务)。

1
2
3
4
5
$ systemctl reload ngxin  # 重新加载
$ systemctl restart ngxin # 重启
$ systemctl status ngxin # 查看状态
$ systemctl start ngxin # 启动
$ systemctl stop ngxin # 停止

温馨提示,重启前记得测试 配置文件是否有错误。

1
2
3
$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

确保测试通过后再重启哦。

参考链接

https://nginx.org/en/docs/

https://ssrvps.org/archives/5370

Linux-如何使用 ssh 密钥登录服务器?

如何使用 ssh 密钥登录服务器?

在 Linux/macOS 系统上 SSH 是常用的系统工具,通过 SSH Client 我们可以连接到运行了 SSH Server 的远程机器上。

SSH 用户认证最基本的两种方式是密码认证和密钥认证。

$ ssh -V
OpenSSH_8.4p1 Debian-5+deb11u1, OpenSSL 1.1.1n 15 Mar 2022

修改 sshd_config 配置文件

配置文件路径为: /etc/ssh/sshd_config

$ vi /etc/ssh/sshd_config

(1)改变 ssh 网络端口

通常,默认的 SSH 网络监听端口号为 22,我们可以自己配置 SSH 服务监听端口号(比如修改成12201等其他的端口)。

1
2
3
4
# 默认为 22 端口
# Port 22

Port 20001

(2)禁止 X11 传输

一般,服务器上是不装 GUI 的。因此,应禁用 X11 方式远程连接登录。

由于使用 X11 转发的可能带来的风险,此指令默认值为”no”。

配置文件中找到:

X11Forwarding yes

改成:

X11Forwarding no

(3)禁止用户密码认证登录

SSH 密钥认证方式有效之后,应将用户密码认证登录禁用掉。配置文件中找到:

PasswordAuthentication yes

改变其值为 no 。

PasswordAuthentication no

(3)关闭空闲会话

空闲会话可能造成安全问题。记录一个连接用户不活动的时间是个好办法。

ClientAliveInterval 的值记录的是服务器最后一次发送给客户端活动信息后未得到客户响应持续到现在的时间秒数。

下面例子是设置为每当客户在 5 分钟不响应,服务器发送询问,这样 2 次后将断开此会话。

ClientAliveInterval 300
ClientAliveCountMax 2

1
2
3
4
5
6
Port 20001

X11Forwarding no
PasswordAuthentication no
ClientAliveInterval 300
ClientAliveCountMax 3

重启 sshd 服务:

systemctl restart sshd

查看服务状态:

systemctl status sshd

查看已存在的公钥

$ ls -al ~/.ssh

id_rsa.pub
id_ecdsa.pub
id_ed25519.pub

创建一个新的ssh秘钥

创建一个新的ssh秘钥需要用到 ssh-keygen 命令,它是 OpenSSH 的组件,在 Linux 和 macOS 中一般都自带了。

在本地机器, 创建一个新的ssh秘钥,默认防止在 ~/.ssh 目录:

cd ~/.ssh

$ ssh-keygen -t ed25519 -C “your_email@example.com

$ ssh-keygen -t rsa -b 4096 -C “your_email@example.com“ (不推荐)

注意,Ed25519 是一个数字签名算法,签名和验证的性能都极高,这里使用 ed25519 算法,不要再使用 rsa 算法。

直接指定生成的文件名称(默认 id_ed25519):

ssh-keygen -t ed25519 -f id_ed25519 -C “test@wang1234.com

可以指定生成文件的名称,生产一个新的名称:

ssh-keygen -t ed25519 -f ssh_id_ed25519 -C “test@wang1234.com

生产了2个文件,一个私钥(放在本地机器),一个公钥(放在远程服务器)。

ssh_id_ed25519
ssh_id_ed25519.pub

Add your SSH private key to the ssh-agent.

如果您创建了不同名称的密钥,或者您要添加不同名称的现有密钥,请将命令中的 ssh_id_ed25519 替换为你自己的私钥文件的名称。

$ ssh-add ~/.ssh/ssh_id_ed25519

ssh_id_ed25519
ssh_id_ed25519.pub

ssh-add 命令是把专用密钥添加到 ssh-agent 的高速缓存中,从而提高 ssh 的认证速度。该命令位置在 /usr/bin/ssh-add。

在本机的 ~/.ssh/ 下创建 config 文件,并以如下格式编辑配置文件:

1
2
3
4
5
6
7
8
9
10
11
Host web1a
Hostname 124.223.106.211
Port 20001
User root
PreferredAuthentications publickey
IdentityFile ~/.ssh/ssh_id_ed25519

Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519

复制公钥到远程服务器

ssh-copy-id命令 – 复制公钥到远程服务器

在本地机器操作:

1
2
3
4
5
6
# 默认 22 端口
ssh-copy-id -i ~/.ssh/ssh_id_ed25519.pub root@124.223.106.211
ssh-copy-id -i ~/.ssh/ssh_id_ed25519.pub -p 22 root@124.223.106.211

# 如果服务器一句修改了ssh端口,可以使用-p指定端口
ssh-copy-id -i ~/.ssh/ssh_id_ed25519.pub -p 20001 root@124.223.106.211

ssh-copy-id命令 可以把本地主机的公钥复制到远程主机的 authorized_keys 文件上,ssh-copy-id 命令也会给远程主机的用户主目录(home)和/.ssh, 和/.ssh/authorized_keys设置合适的权限。

可以手动在 远程服务器 直接创建这个 authorized_keys 文件。

在远程服务器查看上传结果:

公钥会上传到 ~/.ssh/authorized_keys 文件中:

1
2
3
root@web1a:~/.ssh# 
root@web1a:~/.ssh# cat ~/.ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE… test@wang1234.com

注意,authorized_keys 文件的权限要设为644,即只有文件所有者才能写。如果权限设置不对,SSH 服务器可能会拒绝读取该文件。

$ chmod 644 ~/.ssh/authorized_keys

将公钥 ssh_id_ed25519.pub 的内容填写在里面。如果有多个公钥(多台电脑都想登录这个服务器),每行一个公钥。

测试效果

在本地终端直接使用 ssh 登陆服务器,不再需要密码:

1
2
$ ssh web1a
root@capp1a:~#