Repository navigation
Expand file tree
/
Copy pathcontent.json
More file actions
1 lines (1 loc) · 193 KB
/
Copy pathcontent.json
File metadata and controls
1 lines (1 loc) · 193 KB
1
{"pages":[{"title":"关于","text":"欢迎来到Bruce的个人博客!","link":"/about/index.html"}],"posts":[{"title":"Node.js在各系统的安装","text":"本文介绍 如何在各系统环境下安装Node.js运行环境 索引 索引 前言 Windows安装Node.js ubuntu安装/卸载Node.js 安装 卸载 CentOS7 安装Node.js 使用官方编译好的文件安装 前言 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 更多的介绍 在菜鸟网络上可以看到 本文主要介绍如何在各系统环境下安装Node.js 这里会随时添加各系统的安装方法 Windows安装Node.js 打开官网下载页 下载Windows安装包/二进制文件 运行下载的安装程序 按提示操作即可 配置环境变量 测试安装是否成功 如果出现版本号即为安装成功 $ node -v $ npm -v ubuntu安装/卸载Node.js安装 ubuntu安装Node.js有很多种方法可以通过官网提供的源码安装也可以通过官方提供的编译好的文件来安装 这里使用的是ubuntu的apt安装 检查可更新的软件 $ sudo apt-get update 使用apt工具安装低版本的node和npm $ sudo apt-get install nodejs $ sudo apt install nodejs-legacy $ sudo apt install npm 如果你的网络安装比较慢,可以使用淘宝的镜像 $ sudo npm config set registry https://registry.npm.taobao.org 安装更新版本的工具N $ sudo npm install n -g 使用N工具更新node的版本 $ sudo n stable 测试安装是否成功 如果出现版本号即为安装成功 $ node -v $ npm -v 卸载 卸载node.js $ sudo apt-get remove nodejs CentOS7 安装Node.js使用官方编译好的文件安装 打开官方下载地址找到 Linux Binaries(x64) 后面的 64-bit 获取下载地址 在命令行输入下载命令 如果没有安装wget, 使用 $ yum install -y wget 命令安装 $ wget https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.xz 找到下载的文件 执行命令 根据你下载包的文件名更改 $ xz -d node-v16.14.0-linux-x64.tar.xz $ tar -xf node-v16.14.0-linux-x64.tar 进入解压后的文件夹 执行下列命令 添加环境变量根据自己的路径修改 $ ln -s ~/node-v16.14.0-linux-x64/bin/node /usr/bin/node $ ln -s ~/node-v16.14.0-linux-x64/bin/npm /usr/bin/npm $ ln -s ~/node-v16.14.0-linux-x64/bin/npm /usr/bin/npx 以上步骤完成后 使用下列命令测试安装结果 $ note -v $ npm -v $ npx -v","link":"/2022/02/19/Dev/Nodejs/"},{"title":"MySql 安装 使用","text":"MySql安装 使用 MySql官网 yum安装官网下载页 索引 索引 前言 官网下载 安装MySql CentOS 安装MySql 使用 MySql 启动mysql服务 和 常用命令 获取 mysql 初始密码 配置文件 Mysql日志默认存放位置 Mysql数据库默认存放位置 登录MySql 查看默认端口 修改默认端口 开启 mysql 远程服务 使用授权的方式 创建用户 授权 更改数据库默认数据文件路径 修改默认日志文件 常用sql语句 数据库工具 SQLyog 工具 链接 前言 MySql安装 使用 MySql官网 yum安装官网下载页 官网下载 安装MySqlCentOS 安装MySql 在mysql官网下载repo源 centos的 yum 源中默认是没有mysql的,所以我们需要先去官网下载mysql的repo源并安装 mysql官网下载链接:mysql repo yum 下载地址 上传 repo 源到 centos服务器 将下载的mysql80-community-release-el7-5.noarch.rpm上传到centos服务器的:/usr/local/mysql目录中 安装yum repo文件并更新yum缓存 安装yum repo文件1234# 进入文件所在文件夹cd /usr/local/mysql# 安装yum repo文件rpm -ivh mysql80-community-release-el7-5.noarch.rpm 执行结果会在/etc/yum.repos.d/目录下生成两个repo文件:mysql-community.repo 和 mysql-community-source.repo 更新 yum 命令12yum clean allyum makecache 选择mysql的安装版本 当我们在使用yum安装mysql时,yum默认会从yum仓库中安装mysql最新的GA版本;如何选择自己的版本; 第一步: 查看mysql yum仓库中mysql版本,使用如下命令 yum repolist all | grep mysql 可以看到 MySQL 5.5 5.6 5.7为禁用状态 而MySQL 8.0为启用状态 或者可以编辑 mysql repo文件, cat /etc/yum.repos.d/mysql-community.repo 将相应版本下的enabled改成 1 即可 安装mysql yum install mysql-community-server 使用 MySql启动mysql服务 和 常用命令 //启动命令 systemctl start mysqld.service //重启命令 systemctl restart mysqld.service //停止命令 systemctl stop mysqld.serivce //开启mysql开机自启动 systemctl enable mysqld.service //关闭mysql开机自启动 systemctl disable mysqld.service 获取 mysql 初始密码 mysql在安装后会创建一个root@locahost账户,并且把初始的密码放到了/var/log/mysqld.log文件中; 123cat /var/log/mysqld.log |grep password[root@localhost mysql]# cat /var/log/mysqld.log |grep password2022-04-02T01:30:35.121174Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: a12LlkwlDe8:r 使用初始密码登录 mysql mysql -u root -p 修改初始密码将MyNewPass4!替换成你的新密码 注意:后面的;分号一定不能少 ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'; 配置文件 命令 123456[root@localhost mysql]# mysql --help|grep 'my.cnf'order of preference, my.cnf, $MYSQL_TCP_PORT,/etc/my.cnf/etc/mysql/my.cnf/usr/etc/my.cnf~/.my.cnf mysql会依次寻找配置文件 所以直接修改第一个 /etc/my.cnf 就可以了 Mysql日志默认存放位置 位置 /var/log/mysqld.log 也可以查看/etc/my.cnf文件的log-error= Mysql数据库默认存放位置 路径 /var/lib/mysql 也可以查看/etc/my.cnf文件的datadir= 登录MySql 命令 123456789101112131415[root@localhost mysql]# mysql -u root -pEnter password: #这里输入密码Welcome to the MySQL monitor. Commands end with ; or \\g.Your MySQL connection id is 9Server version: 8.0.28 MySQL Community Server - GPLCopyright (c) 2000, 2022, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.mysql> 查看默认端口 命令 1234567mysql> show global variables like 'port';+---------------+-------+| Variable_name | Value |+---------------+-------+| port | 3306 |+---------------+-------+1 row in set (0.00 sec) 修改默认端口 编辑文件 /etc/my.cnf /etc/my.cnf1234567891011121314151617181920212223242526272829303132# For advice on how to change settings please see# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the# *** default location during install, and will be replaced if you# *** upgrade to a newer version of MySQL.[mysqld]# 设置3306端口port=3306 #根据自己的需要修改端口# 设置mysql的安装目录basedir=L:\\1_mysql\\mysql-8.0.19-winx64 #根据自己的文件位置修改# 设置mysql数据库的数据的存放目录datadir=L:\\1_mysql\\mysql-8.0.19-winx64\\Data #根据自己的文件位置修改# 允许最大连接数max_connections=200# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统max_connect_errors=10# 服务端使用的字符集默认为UTF8character-set-server=utf8# 创建新表时将使用的默认存储引擎default-storage-engine=INNODB# 默认使用“mysql_native_password”插件认证default_authentication_plugin=mysql_native_passwordsql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'[mysql]# 设置mysql客户端默认字符集default-character-set=utf8[client]# 设置mysql客户端连接服务端时默认使用的端口port=3306 #根据自己的需要修改端口default-character-set=utf8# 设置此项很危险 会无密码访问数据库# skip-grant-tables 修改端口后启动mysql时 如果报错 Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details. 而且日志/var/log/mysqld.log里 报错 [ERROR] [A] [Server] Can't start server: Bind on TCP/IP port: Permission denied [ERROR] [A] [Server] Do you already have another mysqld server running on port: 3307 ? [ERROR] [A] [Server] Aborting 此问题是没关安全增强型Linux导致 修改/etc/selinux/config文件内容的 SELINUX=disabled vi /etc/selinux/config 修改好保存 重启服务器后 就可以启动MySql了 reboot 开启 mysql 远程服务 设置账号远程登录 可能你的帐号不允许从远程登陆,只能在localhost本地使用。 可以更改 mysql 数据库的 user 表的 host 项,从 localhost 改称 % 使用户可以通过远程登录执行如下命令 登录mysql数据库 12345678910111213#进入mysqlmysql -u root -p#输入密码#选择使用库名mysqlmysql> use mysql;//这条命令的作用 让root用户可以在远程使用//在user表的user列 中匹配关键字为root的项 并修改host项的值为% mysql> update user set host='%' where user='root';//如果改回只能本机使用 执行:mysql> update user set host='localhost' where user='root'; 选择查询 来自user表中的所有项 并显示出host列 和 user列中所有的数据 12345678910mysql> select host,user from user;+-----------+------------------+| host | user |+-----------+------------------+| % | root || localhost | mysql.infoschema || localhost | mysql.session || localhost | mysql.sys |+-----------+------------------+4 rows in set (0.00 sec) 使用授权的方式 赋予任何主机访问数据的权限 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; //给某用户所有权限 mysql> flush privileges; //刷新 如果想myuser用户使用mypassword密码从任何主机连接到mysql服务器的话。 mysql> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%'IDENTIFIED BY 'mypassword'; 如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码 mysql> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3'IDENTIFIED BY 'mypassword'; 创建用户 命令: mysql> CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用户名 host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符% password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器 例子: mysql> CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456'; mysql> CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456'; mysql> CREATE USER 'pig'@'%' IDENTIFIED BY '123456'; mysql> CREATE USER 'pig'@'%' IDENTIFIED BY ''; mysql> CREATE USER 'pig'@'%'; 授权 命令: GRANT privileges ON databasename.tablename TO 'username'@'host'; 说明: privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL databasename:数据库名 tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.* 例子: GRANT SELECT,INSERT,DELETE,CREATE ON test.user TO 'pig'@'%'; GRANT ALL ON *.* TO 'pig'@'%'; GRANT ALL ON maindataplus.* TO 'pig'@'%'; 注意: 用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令: GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION; 以上参考文章 更改数据库默认数据文件路径 进入mysql mysql -u root -p 输入mysql密码 查看数据库默认路径 mysql> show global variables like '%datadir%'; 停止mysql sudu systemctl stop mysqld.service 拷贝数据库到新的路径 (新路径不要使用/root/路径 否则无论你如何修改都解决不了权限问题 永远报error 13 大坑) cp -a -p /var/lib/mysql/* /mysql 更改新路径的归属为mysql用户 chown -hR mysql:mysql /mysql 更改新路径的权限 chmod 750 /mysql 修改配置文件 datadir和socket项为新路径 vi /etc/my.cnf datadir=/mysql socket=/mysql/mysql.sock 重新初始化配置文件 mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql 启动mysql sudu systemctl start mysqld.service 坑 遇到的大坑就是 千万别把新路径设置在 /root下面 否则权限问题搞死你 永远启动报错 无论权限怎么给 都一样 修改默认日志文件 和 修改数据库默认路径 基本相同 修改配置文件 log-error项为新路径 vi /etc/my.cnf log-error=/mysql/mysqld.log 重启mysql 就可以了 sudu systemctl restart mysqld.service 如果有权限问题 按 更改数据库默认数据文件路径 给权限就可以了 常用sql语句 退出mysql mysql> quit mysql> exit 查看mysql版本 mysql> select version(); 选择使用mysql这个库 mysql> use mysql; 删除来自user表单中 user列中匹配root而且host列中还需要匹配% 的项 mysql> delete from user where User="root" and Host="%"; 刷新 mysql> flush privileges; 数据库工具SQLyog 工具 当设置好了 远程访问mysql后可以使用SQLyog工具 来管理mysql包括用户管理 各个库的表单管理 SQLyog管理用户:建立连接后选择mysql – 工具 – 用户管理 权限授予 – 新建用户 – 删除用户 – 修改密码 – 每小时查询更新连接数目最大值 – 用户连接最大值 链接 如果有需要删除mysql原有版本 可以参考此文章","link":"/2022/04/02/Dev/mysql/"},{"title":"CentOS安装 .NET Core 运行环境 并运行 .NET Core 程序","text":"微软官网MSDN 在 Linux 上安装 .NET 在 CentOS 上安装 .NET SDK 或 .NET 运行时 索引 索引 CentOS7安装.Net Core 安装前准备 安装 使用 查看信息 运行 创建服务 实现开机启动 配置 nginx 反向代理到 asp.net core 程序 注意问题 在linux上运行asp.net core时需要注意 静态文件404看次文档 CentOS7安装.Net Core安装前准备 安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加 Microsoft 包存储库。 打开终端并运行以下命令 sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm 首先运行 升级所有包同时也升级软件和系统内核 sudo yum update 安装 如果你只是运行asp.net core的web程序 执行下面安装指令 只安装aspnetcore-runtime运行时 sudo yum install aspnetcore-runtime-3.1 如果你运行.net core应用程序 安装dotnet-runtime运行时 sudo yum install dotnet-runtime-3.1 如果你需要在centos上编译开发.net core应用则需要安装SDK sudo yum install dotnet-sdk-3.1 注:如果是服务器,安装运行环境,只需要安装aspnetcore-runtime和dotnet-runtime就可以了 使用查看信息123456789101112131415161718[root@localhost ~]# dotnet --infoIt was not possible to find any installed .NET Core SDKsDid you mean to run .NET Core SDK commands? Install a .NET Core SDK from: https://aka.ms/dotnet-downloadHost (useful for support):Version: 3.1.23Commit: 7af614fde0.NET Core SDKs installed:No SDKs were found..NET Core runtimes installed:Microsoft.AspNetCore.App 3.1.23 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]Microsoft.NETCore.App 3.1.23 [/usr/share/dotnet/shared/Microsoft.NETCore.App]To install additional .NET Core runtimes or SDKs:https://aka.ms/dotnet-download 运行 进入项目文件夹 运行 1234567891011[root@localhost dome2]# dotnet dome2.dllinfo: Microsoft.Hosting.Lifetime[0] Now listening on: http://localhost:5000info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down.info: Microsoft.Hosting.Lifetime[0] Hosting environment: Productioninfo: Microsoft.Hosting.Lifetime[0] Content root path: /root/dome2^Cinfo: Microsoft.Hosting.Lifetime[0] Application is shutting down... 进入上传的asp.net core程序所在文件夹 注意:运行dll程序是必须在当前文件夹运行 否者 会影响站点根目录路径 造成不可预计错误 如静态文件404 可以在后面增加参数来修改默认的5000端口 如: dotnet xxx.dll --urls http://localhost:4000 上面的指令表示:启动后监听所有可访问 域名或IP 的4000端口 增加参数来实现后台运行 如: nohup dotnet /路径/xxx.dll --urls http://localhost:4000 & 简单说明 nohup 表示不挂断的运行命令 后面的 & 表示这个命令放在后台执行 创建服务 实现开机启动 创建服务文件 vim /usr/lib/systemd/system/testApp.service 文件内容 123456789101112131415[Unit]Description=testApp for centos7[Service]WorkingDirectory=/home/testApp/ReleaseExecStart=/usr/bin/dotnet /home/testApp/Release/testApp.dllRestart=alwaysRestartSec=10 # Restart service after 10 seconds if dotnet service crashesSyslogIdentifier=dotnet-testAppUser=rootEnvironment=ASPNETCORE_ENVIRONMENT=ProductionEnvironment=DOTNET_PRINT_TELEMETRY_MESSAGE=false[Install]WantedBy=multi-user.target 常用命令 //设置开机启动testApp.service服务 systemctl enable testApp.service //开启服务 systemctl start testApp.service //查询服务状态 systemctl status testApp.service //停止服务 systemctl stop testApp.service //重启服务 systemctl restart testApp.service //修改service文件后 执行重载命令 systemctl daemon-reload 配置 nginx 反向代理到 asp.net core 程序 在命令行输入whereis nginx 找到nginx的安装目录 通常为:/usr/local/nginx/ 配置文件 找到配置文件/usr/local/nginx/conf/nginx.conf 编辑修改 可以使用vi 或则使用sftp工具编辑修改 找到需要配置反向代理的server块 添加下面反向代理参数 123456789101112131415161718192021server { listen 80; #此配置的是80端口 也可以配置443 ssl端口的HTTPS server_name 192.168.1.2; access_log /usr/local/nginx/localhost/logs/access.log; #自定义日志路径 error_log /usr/local/nginx/localhost/logs/error.log; #自定义日志路径 location / { # root abc.com; # index index.html index.htm; proxy_pass http://127.0.0.1:4000; #反向代理目标服务器 proxy_http_version 1.1; #版本 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } error_page 500 502 503 504 /50x.html; location = /50x.html { root localhost; }} 修改后保存 返回到/usr/local/nginx/目录 执行指令: ./sbin/nginx -s reload 加载修改后到 新配置 外网现在可以访问了 http://api.test.net 或 https:// api.test.net 注意问题在linux上运行asp.net core时需要注意 静态文件404看次文档 wwwroot是放静态文件的,Startup的配置里面要app.UseStaticFiles(); 在不同的目录下donet xxx.dll,其目录就作为基目录。 也就是说假如你在/root文件夹内执行dotnet MySite.dll,你站点就会把/root作为基目录, 而你的wwwroot是放在其他目录的 如:/usr/mysite/wwwroot 那你所有静态文件就404了。 正确的操作姿势是,需要cd 进入站点目录启动站点,再启动站点 更新站点的时候也要注意。与IIS不同,在Linux上dotnet不占用dll,更新站点可以直接删除/替换所有文件。但是站点需要重启,不然运行的还是更新前的","link":"/2022/03/29/Dev/netcore/"},{"title":"Next.js 笔记","text":"764b753dc15f1abe3f27e80cba5b0fb578af36984006df3064f4932eabc3d0a2a7bae90b850d031629304f8c9dd7525cdc46dfe6dbce0fe188d1a3b98adf68ae389146f50e400f150ab2453039c230c0d1213651c536a1fe512ce90dc5b9b66d9d3c9e244390cad6db1bd5ea7ecb58e615e385b6493c11727dbee8aeefe8cb8bc390ab05941eb1c1fc78a2237b760d00c6db8347b9b2944fc6291e2740ba84a35676883e34b584bcf22b46d6e21b8cb496ba0d81a117164cbfe1ce2f68a89d7a4639719fe45908da9f1ff922b0ebed4467f17f93afdc66a5d65cc3782b8dbede6de7ebc81edc13d50233f9cacdf8b0e154e0f13c672955fbd1138b3a5b4148b4105fb353d738c62d26f1fa8fd6d96c4622c66db0642668ea824f109a0bf064a14edb46dd4cc5ae11eacfea7cea13f66e8f8c089436fde78c07a5aeab0e141fbb4fdceab55b0a77a75c17ae340b0d828980c186efe8fa9266d100e6f777cd3443256bd6d5e72cc4a25eff211c5536084190ba0d1724955c98dda804cad245dd5c5695db5db3b64b5cbd075524ada3e70c0fc0cdca8b00814a7fa4d1298f892ae15041e6e679256e5ebba0b176bc4e5b8a584f24a36b2e7b9ce30514a85938c8bf4697ac1b562767b42722034a874b877cab88c1f76caf4a9b775502f46203a972485dbc8c97bdd288bfc81b3e5240f59e820dfac72e01fbb421c6d9b9d15f8f0dab3656c647545e22db5563762856eb05c13941d2f44bdc6c0cf32c30094a9e9d0fbeae466a01063b86d386b4bee3493cf3e749bdc658867ef5630ee272e4be9095f8f477f434d221fadf7cb4b710512123834f4499ebc8ae52257fd772afe2aecf3cd96c1118633997d59dfa3edd6e91639e5dc5d3d52dd7cb3320890379e21bd0003984fc638842fe3b2f45a3e07501ab12c6289acdff9d96c3c3c1046a8020afa156faea43829ea23d33e527ec477c85fa8376f2ce37b26ab52f87ed7bdfa738edaf2642658c516f390d8feaa8bcbb99abcf17210d452c3098a06113368ebeae73417f8bce13621ed50f3a6b09873aeb3d1fdb91a8a887fd8ccb41c95d3dcc06b45263beabddfa4fc88566da24c11b9e969e00034744b65f14a133dff3cb6b8c8def92733319338d4e996803976affb89939cf7ab2ebef7640acb9b05320897e69b22798a2268badc5aa74ebb9b1b1a84b8db249098ae9b222e562e421ab3b4bd53fea2c6d88bbb3b1d93a21bd7001236005ec947f346313254ac5a6b0096aa03d44b5e32a41cbdc746e3fc376fa533fce561d08ec95b2ca6b695dcb1affe4e5f6db14ddbf97a884d8a13385ea0c5e92cdb3dccd95e03c3f5f9c3b532bfaf8361bc44fae5efb7f32a99c5c7b4701130c6d51f6ba83c45689b2182531cdd6af551db729b24fdb45b77c8998227af576bc4db0256bfbebed8bb3ed93aac9942810c1ee6565042c1a1e423a9dea440b834ae24c5a8bcc2f62ca7bc778b8676ed19acb32e690f6a748433acd201ac061e15e105d1e300e9192dab1a531df42ab679aa3a2f99fc160a257e462c579c7a8a013d8f2045855a0df11502c87442600d6c593eaa58577c88e1de0e659b0ab5240c52e5d459e66fe835b46e294b4c3f6802db0a8a26211408f60b49e8cc1007f8ae264ec5c1fe9398c60084ee09455fa1f10ae7243e6c395fe6ae3175360e2e7fc3eaa0c378a2b01cb9ce3cf503817c8f0509d217508262e53588b2d196b6d51fc32965bf834898fdc21a2f99b1855311f5079fab18dfe95db7c65b57cc45a845e87b7967547f1ef5960f510f0d378a8d7437fbb0a95c5bf3fa40098abd5eb7f577e5dc3aa3e9bbbbcaadf1a1599c62b6e1489257a55c10f3165cc927a709530ac539f6571b433346c51d01a7f8a5a1f5f98989f1b4d8a3a6c6de0c84ee88f9749ae4f4011bf6c3eafa9143674473f1c87de1752683b2fa63fdd6f82d4476277bbf44d85c139b3059dada7bfd89e2cbaeca745855d40493951726f547d39b6b61f4d1a4c37f7ea51231ccb5e5b7bae33b08ba0735cb69cdadc8b86bf0bc6eb0c9f9be8683462a61e52d482ba214c3e37eda45ffc88827c2b240dbafb79e863d57c2ce24c55792bedc05d7f79dff59265a69647a4acf9626608896d86ef57bb188c27f56cd8a4ef5086d7ffff67852b7410c6500575500042b8dbecb3aea32f85d02f26d6bdad893ba2729213d317387ff4eee47667f7963eba82579701dae3339060142c607b88cfcee96c202f42c57fc45c45fed7c73c852e98c52504bcf065e653df0d094005a0419123eb4a23ca862d080e801dee34627b086ab0cc5a60ac45f2c41209c590cfe7bcef14ebb2800d96958ebd118e878f694d6b23908018e1cbde9a81f126be178c4d5ae145ca99d0946242a10dabfdb37ffb7653d437d1cc846d5838861273926283ecd9a3cc0a123b7b8fca7eba443ecec673f20e0c52b63cf543b66c67edce4ae5fc5c12c2ad5ee130b83024e70fdc2ecb12fd55237b2cd3f2efba5ce5b788c3d455cc3275cead275828f1d359c375b549e3d8afa06830bb29514f92f246f6e97557f1b56516bbff247ba68e7859246c8f6030e311a3990721bcfcdd697f21cef2348c15a05bc6ad915922b9f679d760df87ef8a0df3cd6c2696a1b24092184791f81bf36f02f5e29cc7452cf84cfccd658347d2c13bcf645d9abaf88cefb52e19077fd7051e8a1dfbf38b02cdd17dedf72f8e44928f335f150545f51fd3f1db55fcd255caedde66bb37cc1b447c480efe4ecb6d94d3329eda88d17dd1f6bacf5b95ebcb13fc80a1c4a5ca989810ec94c363a66eef6c78d8d7820146330cb2b3c889f97c8b48a72f4e2efab68784cb2784fcb355d59ea2282a308eb26288f8af2ec780e24b4435bb3b9c8ad0ea0d9e3137a4fec7395c39c4eda4b3c649b3b68b32a916ed2538bb45f59d85ff850cb033acb669bc8c841290f0b1b56f1ab0d11bc06510ef34845272e8bbc289c378a61ea2ad4926ed16c18935a2c0d7237fd28888d65f86b2df32db237f36f3e7f48249c81f4baf46b8c98c401f2810c1e81e3f21f34fba914963d565d7d29a8498bd514bc7054bb2b4a0ea38e0929b087b165e29ca9fd7867e7251fcc2183999f0d7f60baa464a7bb91b020e2558188cf99e30aa26e7bc94d0b7ff457e79d870ebaa6063d652a24c4a37aaa9a3b8f2714cb00698effbf29f5927a202ebfc3d306327e75d7ade90ca380051255ce177dc955b1381979ccc9c5f3a1836a8da24ca469d59591ccdc1d24f3711075a571ef9990506ec75af605d9b702bf66bbbcc7258e82cbc9738a8df0d2b7c96ade411cd036809acb00334805d58171b799b50d40582f678c3798fc68c536d8eab29e5188eeb64a7f7524f4e2c225c58e48f43e2a8515f28883870be3d2913e507f8b6e6950fa53482938566bd210af9b08f77ea3bab12b4b87360e8b4a121aa1257101b3bff8dac842f80341ac0136e6bbfcd4a5e39a0c345f56f5cfc4423919d2e9d1f007f32ccdd6e3677cad136de31d560f4c5604217c0d78a945b6c65fc2ef87dd5212f9803bb40fcaca12d12f5342624a2394c0415c0cde2356b34d4e542c1dc086e15ddd0e9c375cf58b97924c15461d28df1e08d8aa001699d2e325bb09867b815683d76d4b1237771d97c480dfb32711fe3b8aa9f8a8fcc09b8fa6c61876e4bb5d69b541ff1f86fd40c5dc0140c1773dac29498126e37803f5b05c440b9c2101cb16076e7270cd715a962617ea23376adc9c0baebd5a3b71a9e71c8f9691cf2973a1ded138fc9fa7d127bf1dd232b5a135137f79d4503f085c28d25c966c9d90282985e03234936bf495ca4616a9fd125fd88f361f29eada57e63b97455038a5ba1485b031f9fb54f2aae7078f4f00518e3e95a03434ce934340cc1616155ada98ca90e9b6dba0d47e708f82dfd6956f3d3e98f8c7db707a25838a33db8a4d606271935c877b7bd308cdaf7703c7decd5ba88f40534cc9507767dd0a65a82912ff6144815fa6d7becdace4ee5357782f2b68dc4c586094c1ee96ecf879566b8c9539d5281cfaebc6a6a2a6ebf35d2c7b6da14e3985df325bf8387293323450f91e9a93bcd8654821ac4bdfd257fa3eb10cbd9f9e68b86b801ed92c8b0f21e21f5b713d080a2a2e3c9503851404db77c1d0dc7c3a71ad0715f0abaae163b245f68da67d94b753038dd1a35bf93b9c54b288815ef5bfa9298da84eb0d06a227e2a3ca3fa79f52a951b43a9b1478a01a51a57039b530f72cbd88f6a9ac163dca531b844c8d414fa2155bfe8bdf5820448eb5727853832e0c597fef4a0c14a6edcb2d24982cacb2ac30c4b941ab393761ef52420a0460bb02931655fc916272adb38154f090e7f2cd30e6803b10a41ae1748d02f8f669ffd35348d020529240b279456794303b85c1b4e05d76c96513d65a1c3b4519b51131ccfec4a02c66df6af97dde4de4a7b379c53c422995fcf1cd02e06383f23527e3967cc2e7b7904148cfcd2c177f2b5a4f3e662d3b2738ba0135fad3fc11661d0521ce7f1a9de6dd6a93d213e4f77aa7b2e4bf885a20bb343322bbdaaf4bba79d1ac1f8986a2c33aa7a75471a5d3a8f5cd8e0090b8da074c633fceb3350d2fe479e1d370018cc85fe43c9458c6e2e000a4cc8730dc71b194198fdd12be147bc16cbe70d5369a62b0c160d61c3c8fd0966a3feb337eefa3bb16ea2e1433fce4640e9364b65cb7a4b3fdc8a3428f57ebe6d9b328093b4843451c3203e0e4ee62ff9e1c222b02f9d33eb626ce07c943acb4053123f8540e12719ad4ef1f218dee139a3b0538fc386116ac63ee53b2163dfa23752ab1a2512e7dfcffe1729f8f1b3565743cd516276cb15714f4ca83f26bb390596e98121f532a90a18997938a0c0d3d9ace213364550bb83f8e63a9ee55c1c563745e0fa3d6301525f9ba367896195cde8b50887a080ac83b6055b2201372a2d38d48062b5feae607c00445cac73998b93f687c017330dd6050c5d42614a5736cbec02f0da981d0fe29d4cb65d8807d62084d5e92c6cc9796aaa31776bb672f136db347fec2361755f324cb689a7d17a48fba8ef7ec11d2dfb05b52b5f3449f7bbaa6181cfd25252cdc12ce8701302ad658a4a0c87e3c68e065f30bc5f8e9e32fe841221db26ed2346d77fbecc41b8c3e899230a2c40c40cc60950d0782b83b6355361e4cd24bdb99053c049eff4bd6b147ced39ecd2e9e1024c923b7c5bfbb0b675309af305f46febe9983bc017c5fd41c38c1ed53cd016a793aae3de13946eb96f949d85cb44935d7cae17e5f150583d7a0d7138ea2ecbecb919be32246e26489baa52bfd7ada6bb1178795fe48e71b3c90f44c2f27fb3dc1e77850ae9d8082a7f70c78a5c9e7e6a6e2aabbb9a2d07c1c68ca0095342ccce37e0c696f0fb36bd6cb4788019b7aa4bab68b34724b07fa545aa88a44a89b62615e3ca191e1a2bc9dfe152d8ad904cbef3643dbd3288d4159b6fed6febfbdf24c2de8f7bffaa2b0fb540daf63aea04eee552803aaca49e6fa244723fc843e6c60d7a444c70d580e25d45532b16b083337c03d57a592d7afa4aad64ac5e4b23538bd8a26c953febaa5653c6d434653328a6bb676e486ba0c7c037cca293a961c3cbd37a16b678826977e4de6dc270ad047fcf8c862e91b73883fdb74fe5b6efef1268305a3bc9c0eb5167f3583b7ca2e6d4ea5ec49fd2ce8a3fe1e5b3f8f78826eaa613e25c98600ee93f7aebdb6579e6ae1b24776cda6fb9c1c37846b5663009615a8f208a01a93c93517e0374b1b58401b470078da5be9ab91334c0f85f2df46074e6f8aee13b9d3ae5df31f6cf09dc22c31f1b30d377d18ed52a1e948ea61d30580ca72bd0b6043a373214fcdbc6125d61066ee2b06aabc14ff22b88367e49c92b949f9710b396c44f409967e5e134dbd7810acf5aeb104d630750b91268ddcfd77a4889994c4e81b00acc120048497688321123d97ed054264fc4558ff7c41852c34333b010c2ec322465304e4078238e7d4ad42bedabe7cab39dfdfcc77e8fbb24660226e2b91465a9d20164162f2710b92023db7ba6016fec851b245c2e41725e1322c4cf96001a9ac3465c435070d56b831048d20527bbe97bc36efb64e6111107c094e7ba82ff188997bc83ebd104c3a926775a6aad7e7578e8e025bc36a58f43b4daaee523bf17246fa753b0b6e9b0195ea1da729fa19304b83d4bccc059aa6d89e1f571b75989c388bdc1ffaf3a4590245988197103f0b2af4162f0c19826a8417df7d371eb748bbf6c168174392f7dfed6067d28158ba3055c715d76bc8f5bab59a2ca5db4107896dd9fafe8676a651fcff10e68e27e20b80141dc6d4caa8cbc65437573bf0c88679b9933ef3ddd7fd4b82f1741fa4f5301d376422b131b98bf72010cb18141dab728cc07815fadea6b4afc9c1c36eceaf2d65364643ba58c477424db819c17a96b102d37b569770e443838ebd87dcc7bc1a5e0392a224d2a712bdc30002f7ffbb567f26472b6ce9520b1101497c3d1b8ca26fc6d4bb9c51558e4924cad98b062ca41e9657dbdddad05c5612d744a0bf4e21c31fd4b7955576c502e2764683f905127c5c3ae37151712549936d06c18bfa44ddd9018f2bcca7a3e60e30425e1bfc17c8482e764bd99ddf7b4ae1761321fcfd04cda9b5eae2d5b95bcdefa6da4911b0120919ee5f181de4476cc5cc53a1d930beec07cdf8c7292b5a603c8cd7cc81283954465dd3b89e14a19223f26deda4142a8c71c39cb4487031d7ae1062a17b4dbf0763a6b2fc1f5b0a0a195f404c14beceb51d58fc24236faad1f1fa836f544a457751f7e30679058e699419c2f44ffd8e529e5c4488e0e87d821ac8ab63d9c1fb5439162bfca14750523696f398bf347a4fac8b871418fabc1437dde579b44823c1c1bb79f90f6428403ecc2179703a241898d3c03c0ad44b7c1458911353c5987911f3d5e045dbddb4c0dbe06034a93a7ea31375935d5e34252657cffb2793372044a42fe069aacccc0073056db9ed36c39335363cab0da367797daffd67407bcf86cb6141f00fe5997a8ba1575475adc9753669b28b1b897507d635c5852b5a1892aaa561bf090723d04a0f8a4d346d58c97919b292e044b3f6f26d5ea938d282eb7eebe73e04b693d96b564195c857e980a057f4ce2eb178be04b495aeebd38ab64b5d7fe47ff9cf35504930873a94c13233cd30f5dd277ee2abc96952c26c3a1f1904b14621e2028c48748fd5f1b8519549579e2e99d9141f3751a860ba78edfcf8619ae4a9c526a35c620e7a8d780df551d75d2dd625ccb3fb351ab647e7317150df2089a9d9f51e6f716a460c018f0c9188dbcdc066cd64f38a3373c583d843c38a91a6d67781fd83c97d01fa6e676872f0790d944f0fd1e5797705572eab16019595b39cef4731e1721adaaddbb2d8287e55f698eb2c17244c554b44f7ff36f1246e03a76d1a26de4528327bc8c389ad8dff90da7ecdd4ea0ef3fd206696ddc4a540458f1dffcf4677b87372b158e3cb8c8d972386ec043df1dadc243f2feee8eeef968659d377c9098b97f3df249437ac5f7bff131959a78aa1eacad6cf50da2c3b96a5793a1d7fb676ec75d868c6f6fc8dfb243df712680e5c8901a0f62b573cd00fa9fe8dd6358a62f9afc5540acd2cd921a082a82dea74fa02b82d11c9be7359311a1d821763f7bc85c7302bce7e8a75b66e2ade95b169dc5ef87b4abd77869665c0e2b9022049aaecb97cfbc61dfa14b3447dd737bf02ab9c59821a48e6b2e713a3da7990c4ce9b6a80b414559fa46060e07f7f5271f23e46bca7634bdcb1c42f52ede904c313d423ae008b7e2530bf344ac862471d95ed0370ad026b97286ce4f959248c851cec4391b8b6a65d6e60fd52c39acedfa784a0fec1b83236765aba8eecf050c607c30568b322178a3a60a9b1ac27e74ec7b562ff4aa244f84f83053bb99e6381a9199c344ff937113df92d1e6ac812d7de93bed9def76dbf603f394eb496fcd02ef0091b93aceb97c36f7a6006fc1681f174d20d90297a0e707b63b5f713b3e72bd4c262ed8b42b4e1e4e1db41ed63195a3ccd16036db4de246d551b14366b3502313c02254cf8c3478ad6eaeb59312c0dfe852d6ecfbdd7b6d68a3dd892a6b2c36b64edc407c46cb24ed949bdf9fcc70b83fe6deaf39f8de28c752fab6cb0d617463c47072e326b4a60e6285942c7676ce9c22a4ca7a95b4461afcd975041466e69e15aa046cf14a561942019ab6d20503526d61a6ae6fa23d2459629f16c8faff1e23473e3af6c1cdee6d34862e612c447e33e95b8bc89b4beb47434b2e1574aa7928dd13fc723c7c4f82d7c5dbcb411800ad8309634b281db4608879c2174233677e8cae15653fb1b96ce48db0f1792d9d9f684f9ca1554f46d8d77b6f738f0e580d2f0b7fdf38255d08f7c6efe38d7e3f5da02b8942987c05868ba05af2c073ba574b67be8bace270f745a22c39f874bef6303e3ce03c4a55f68c2150fc2dd3a666ea11bf638412ede8be6ac372a30e00a4880f67ac0a3438176dac3d711c3fa56157cdbe16f763f924ab708fd0db3e97340edbb95fdd15ae1afd0c254412821da42a9d74c511d096481a18efb8dbe55b1b9d766aeab1fde16c07007ad835ade4f099b521e741ac176bb813355409d6b0a8b030af1dd3cf96edb2349d1755af2e88d889df1542063757dc29400bfd2ec6a9f47ab0dedcd31db8db30811688ca3c1f4534cc7da0fd26d10482bd572b7d198f167d477cd2b7a3853413ea4c5813901e1fe686f7050f9e64f2a87b8ab8db675ad6487e1d156160fffe69ac1798f46036a7748c843da12a30756cc9a75f9c551aab7ceca38c16cba4c67c04f981adef4922cf2b39108ff8c7ccc3f2e2138c394943f9ad3c8cb6052a79d7a1ecd464240012274778ea21da2c0d04166b4519ccd7d33f8595b61060fe7e067c2b4ba578eb98a26649afda25e85eb315e4e8112b4f267b71b714360870c18219ea37448954bcbf30142bdf3ec93444a41a8215da52754121f883dde3ef5147b317a94858adc2adf48cd5f804a713d69d3562432ada1737feb83051dd11dd17635500a96e8cbd9f0b020f72b4a673e4ea00e9d493f4420045afeca71b4b90599de8e6a6e9686eba1d7a5147162f29b1da9ac74fc67cbc0b45d3958e292e5d1137441778afd10c88820a452cadc197e3dbbdab9209f119c4b78d4b9928bfca14855d9a006490feb24846bf83018c9b34636484ac90abf6d4fe12d48539dae588f4d6f2e18dc113ef8bdc23c9c9eeded2b51142e85451903e68c53a696dd21b4bb19a2f66dfcabe1399c67860ccf8271eaf228f28935ddce1ec4aba031f75df09d2ee0c1ec3f66765999905f720ca4e9332acd5534b2a0759684e9e44672f15a7156685583638b892738dd17d77e465fdcb935bf84a6ac4e84f886386cc751445e9a398fe8ef819a64b7babd1051f63a3f851a46aca85c1fa662ae16954041a4505de0f242701183213d526bfbab855a5cf3979f8ef409e335649a0bf8aa5951e51f20ec58125ae236135d2d4ca1a6364c09a2504ef2898ad1869d937b07129b04cc32a9113c023add4668a8b23597c721dc04541eae4962737572593a329d94027f5c3ae9687c6ffbeb08358fc83837e21447ac49620551f32294f50dcd20a2eea9c188d01169670ac16e30ddca2763e7603cc3ec7a6664c4dcc6ec9457c516826bcbb5bf2c02e795d9ce1d7302f9870db3ebf65479410c75e44226a361f9274fcebb5c5c39a05a8a3bbed427b3877d81c7800d6cf78387a013939f63999a262e8bffc8a44ebea009371c0d7808a696a4d313760d899452cb64cad4ace5f2683112672afa86a9611cba4341c2e0f435464ee9029da49dd9e167daf382eae997aa6f2a2b53507404def0b6ab09ac9f49ed980247a4a4051c43b2451f6684cc6f9383ba2974ebfa6f357de17aa53b77f62e11ab39ce7006984873697becd38a0e7459d7ea992d9bd0e62d401f905c9a6375845b9344bed31a1acf99ae6ebef9a88b3dc28ac7dea62c0a83c6e4e503a942f636879a8f11623870037e7be47f40e660c9805385996343e47652c6259f214f4ea52a6556d8543e994473b273eb87a5465856a3b4d1e14c128b4097c1f4af5721a5aae99a0f6dce341f02d8fad37898c059d5c581f18e6570deaa81152be90fffd9d8cecac23ef5a20527890ac558671a85b867a2992350489e681681bfd06b317eae84270868995d2e30679a371b30a58dfdd8433c9a952feda0fc9fcccfdbb82420877763e5d8ee9db5dd66149b6852f163476b110857bac76232c4b636bbe71d5d7cf6d906fd8e1e9fbc37f502d712a86eb88cec4e2eacc48060ffe84bccf075a66b22f9ec28bafbce8b225404ec3a9c3fc2cccb799dec465f4c042aa19c07a528be80343bbb195139d2048c87ab7ec7a266b90d9c855546f7ed6f757ed629b57b79da4b5dc7bda72ac82c69b9c1ad7704f5cf15a90c61f6203be4e5be1918c89e636f727691b90e7d583b9269be0c915f83d38db31ebb405faae0d62ba93cb45de819958f7aa1fb296d1761cb788688527f86bd7d35fd39dd612dcbdbed59373d4acdc0233ae30c65da2341cf0b607f3795b991e7aff8159696b7ee1268d871245d489af31558925bffab706e7357b4eb74cdbb2ff8fd5f5875e5dff066d70b98e5ce3fcdcb8f53814311ef0c254c940e52406f6488e0095a65f4154716f45970eddb320b5473a71cf81366776a558736a9458485507457de0e6c1e867551998f7e490491045a584f4e71447255c85bd5bf63f252c3d3f24563fbfedf9469c9cf3cafa3baf2aa48f0ed00481ad7d64b65109cc2b084ede62343dcc25b603b3927cb4c08500075bf6bb2f8c68808663ecdc9b51ebd27f53d47ad1c1180018b0621355cab0678aff89e21ed321b1d82d373aba67e3564632f1a89349e9cd460242652baffbe71c5f29533147d63be88be950864b5c78b2f7e0e98dbb36be27ca22703b92c28e98acbc275a1d28fe697a2ee149e8e30abdee975717e09a295e20fd3090f056ad0c33560b5401037f15dfeca5de293838ab0cc7707d44f1d44238a3aceb1b44b881258924e7b112623c999d05fcea4631ef477600437dd9ba56603bc3475d1cd66be4634d6f52ebf6375f2fbbfc29b4caa11d7a8246f37b2835994fb338bd53920b4bbb1ce9eb7d86e9a237ef164136a2bf576f7a99c37db0822b88a38922d5501ae38201a03bb335b570befb1470b41a40dde277acc318e3006bd1997542065e3ee4651767d92fa5beffaa578e94b869ea39548f26e6d4f9564a32ef6d9f5ae8e217d0e3b5c19698e627594fa7a1f0b8cdf527e0756736e7f34ad51af3393c77851171481e5ff9fa3e01950713e711ea2fbd54323c99361f21e318a0a3ba53ccb8af16a711e37d5426fbd31e5b42725552400750fa25c343a60485e7b9e4c87f0b8cc824e4316c790fb50380247628785c3ebacf8f6813fdbebeab1c3a9a2355fb2114c005fd50b9caa7852232e9d3e92fa2630283ef1367dfdd4ba3853dce50197d698287189ad2283d0a00b136d913c0c1389bf85bdc616cd3855c0aa82f2c498f078965070835d0f15b2f8e1ab83494f39fe3a091c6c1c97a37d00b12267927168b25430e0b3859114eca969bf85ddd03af816d4ce0fde2bf49261012dd77bdc01b690356420b9c48e7b413efeaf2878406e3553a382374236a7bc664bd1556965c0946f1ae85b542216bffc7a0c9213a75ef020be74fbb709ee20bea87d7cf0675b1b71012b44d4bcdedfc4cc8030675b5814de6aeb125266043b0ba7837c30044d9919307c5900ac294b6b8ae9237ce1ebd06473527df167564e9c028bc6cd25c504acf0deffd9a6a9dd10288083bfb208f51fb1fa28a9b059b0154ba57a186edf9c1f9eb84324693ae0516b8e6e4ab6e95eaf633f2efc411469e9f085c0afc660c8345caf69eeb99f083a95cd5fb25186d7ec66209a2bd1f14464a19c15402167deffdb5179ea14a2be51e6531abfb367167e77d6cf404a81862df5cb97a5068b40dd189b2b91b378f34b6b8eb2f64a6cb573d812a14d29f601b951d6b1c68f53acf6894ed767060d2181ff41c4450343502b099d7ea89152a5 请输入密码 ...","link":"/2022/02/24/Dev/nextjs/"},{"title":"配置 Nginx","text":"764b753dc15f1abe3f27e80cba5b0fb55edd77effafba3e5e0c3e7397ebba273b28881fbb0370f52048d7f2482fd551f8efcf850b40d0682abec89a444487749ef971607bdbc2c861e8fa61990df368a00316cac8c50bb858d7e14c57dc8f810b416586fae63da69475771ee6e471c480f2624e3411a58adb1de5e15ce4b98b4534925ad2c8e5cc01e9aff81ada322ac9bbe587ee1d8681b87c3f1bbe461c8bf645f0e5f20bd10867bee14327072271d867d80f7bbb6ddb24b0044ab7b2f8e093713686b585aba4bbcebe2a8a9362183de9491956b3102e45fe96de35f27ee7b8a4662685b8a70144c9dd86b867ffe5e089f9c9b469f804bb2895c4eed368f6d4c640605633f9e40afe6d21ce15f46b7a359738ec833c04e43bab8b898959fbeb88d8c0c16a6a63ba0b14b7a78dbd4e8ae9e6ca2b1d76ef5e363029f5138c3e1afd41447a0180ff1d6af2efea3757c65521d13b80a8b2393e7242aeaf6202a733bbd885a621bb6174ac83a2a1ff007ed0dc79751981553dae13ff223e01fd7d1b63fc52253492a8e5bf22708491d4959a8a1702ffa85a3c1639ff4989847295735962cae1df9b1d70da7fbbaddcd364d8b0ac981b4a315589011308f99ee6fc4e70fed1bd72ca44abe40c915ffa9facc0205cbe9e2975415177ab9f3aab1d2308de0d6e3c484d5b8f3b41f18062f2a00e576a5d9f36965800124f81e3cc6978f677282dabfae3187f55f0128ef93934f16dcb6ccf9d7211ed27fe22c6ae510ab1fa16382a73cb51bdf01ee59b12702f2b9a882bdcf86203a63fdb6178ec6cd10b22dfa5e2c7bb21daa9bf768e43dcd1d078fefa62fc6f9a4a4b463467a2e594424d986b22dc9cdcc93506ced9adf08e7d088f4c9c6a5ff07e8845d7ddce4c9c84c74c731ef0e6afccd3560997a674a49eb09687490c6617a874c8769ad83afe7a4fbac959274561cfcba586c1ee9e805a3ebbda0312977d9e23ea3d8e474a82f47797238f138e22bcedf42b4aaf7690a167cc5ba9a669d40b3d9ffee1f77a2cd80f732b58362c0c3bcc9f0df51c45bab6d8db24402ebab086b8209cc162730cd6f2fdfe022a99e76ab33fd8f670e2c59c900054222b2c4f5e401df46dfaf90bf0aa0ad0cab39465f7a227e74556efd939952040ebbac6ec96dafe08c1ffe3b28b60f68065af46c5a9695b7a43979e594dc02daa844f118d55e5e089d4f8d1509ba8ac625fb9fa219f7104e16bffefa7652d465cb2ce843cd4b59c526e53319d967cad4dd06bde9683a91923fac24d70baf6e77c4fc1043502245464c934d5a617b8953589b3aea12ac1ecdc928e1895576acd2c295cd4f9c372d9759f3f88891cb18d7346eae498892fee562096129276e3dd345986c4c97bd4069818e2138bcc9f10e77dc6d42adb658e5243474cbc75e147b7bb8ea14f7dbb80bc7ae500e200ea6ca098a8cda7ec539b76586bd434ee156432c116f75ed289380811e7b4e2f5c45c6784cbcc8f563c261f0b93dff0031b982ce3e9557a5c68a090262cce9c435a9c127e2cb104b6e5a1acd4db64c0b16ac2300ab31bdeeba4e3aafa5c2a16c0f6fbdb159ffb034d0a1790a08a2f65c9e10029744a4daf7bbb8ddbd0c6800764f45fd22e4cc43b7a6dc2ae6629b449f1c1a1ee36bb30903d63fb45d2c0458319d93baa14203af51d1588583a92b4008c94f98c0f1acb42d9176ce377f9841c1dff5c0b27e5d3c53e98d0799e50dbab8677140d527f523a65d10ab7694a8340bd4a8dc39dfdda240fdf115190e23ec141dce73293c080d00b5e18c8e9c1a7e66c72a31d6e03294a2887e528725895336718117f3c09d18edc7766ba0ae3f5541831f6a54fa38e1f72e5161aa50f9bfce25a499780e8482e2eb464b1dc959375850826d5a7fb911e0e868e721928ea4c780b9e49fd5ed9e78a3d919e195cea681519dd2503ccb8a9687eafef1306c1c81bb124a5728ec9cfc398f26e90508940a0b10ba9d1791239ad657421ba43b046c0866e9ccc964432b3b9d84aa07258e5804abc0c7cf38fd50ade4dc3d227af552f83d3665419c069042d091f03f9058e58e9db024d2c211870c59e6ff6a81ed6b7ddfd460849ec43c384e399a05449c9500a67a954ee9ea238fd5a32affc12e478fda4e89e0cf5cbaaffca11bd55cdb5a91155622bd39b6dd1fdb9d0ece9ab10ed020a50a91214489f70da9fc6f3cc494ea63aae7772369540e3fe3ccc6dfd2cfbb38bf90c219f5bd7c492969555e4096ccb56c6465c016857dc0fa94c08b3ac1823059896e5467abd16740c3970ad4e88e53db40c250d2a033e7b054d6634b8c7fd32f7ed6434810b01744bf5d4a2e93c14019bbfdf7ac4b20232e1f6759cc0afceda0a5195efbd1436f33d958924906935fab7cd5028f8f5f47b8d4d65b097d6328f385e22f0e852c368c371a20193574dbcd0a4bf307b483069aa3f43667227d9de0b81a309efcdeee48df38caa72eaa882e37665e188142bbe52c57e7c02f8fa4a6b34caa248adcef6ca923fd94f3c23884a8ae058d84811540daef34063d6557348d67d1899b1d938ec282407d57305b1aab291a07b7de3bda5657823ef778caf96c1bb5deed0a4afc03cc48c19dbc4a021eae38cb2f4742e3e54c7f28596ecb3d57ebf3a06f72f72a9a8f8bc0c216854acec9bfe59147d0111e11ec87adf51b3f173663183f784d1ef2d802a72715c4d5f9a13bae15b5d8e34f784638f9b418eaddb5362cbd909cc0e2a3d2670cef60ce13be217f6d15043e6fb3be6176fd96ccbcb2351d2640308817438dff7a0db1b5fda57bbdbee25a34999236fc89b3ce219b7dadb6030de9962786ae769a381589878fd677584f4846ced1a2703b98d122f8f9e302d5d57eb82d8a0d5ef61dcc320c1faeb5d0039e814d9b0fd567e28d06757f900de79dc7c73df1487fdd32930ba49e7f5dac6c12ca6b1f6af8d84d8c403f56894f5226ca3826834bd9f9743923b71d80e735e81d651241c3834545a0ed89bf2f939cb6df136f58cd08ddafd2874134127ab989bb2ed32217df1c6decedd2a2fa80fb9f41bc0d67a473d79e61810a576799cd28af94903cffea54cf81366ee6abb7bbf650cc5cc2fde8fe1eb6b5401146cd2956bc7165f4ac940390018405667313f4b4b0b9bbf32a0341a92346096c117cdd3bd810c8a2b0d704a1f4d3ce4a07faf9df120f1ab16ea08198540cee8474b878e557f85834bca96b39f254b671fc0bf3c391237be7a85d3a36f2d8d862333b5cd76d2ecfe383e34236788a4f3a80ffecf07e8af50bf7850285d94b6a5d29656c015570e1c713a7834e1fae77f2be3ae0102f3fc3ac0d8cccee63abd7d6a6545fd81ce631e2fe0a20da67d52e07b7f92958ecb439901ef91eae5e2f2b08c2df77485c8977d9b42993f0e4df0ec397ec92df6a28231213cb32a174edb5baadec69d70b2392b7671833f36cfbc154cac2f900cc462a3e94a38bbe3d4759665dbb0acc74cbff13f31d913a105a4414426624c9d58c7b2813d77578a54037bf18e2bee053e567da9a145d9db26c5bc111b20fa3b7b30edab83570883243ab8cdbd6b44183aa7095a7b1396d5942192befe3bbebb83246660360d331caa012c67af399e62056adc5dc0e208f539f7fd82f063bb1f8125b0f59daeb5ddec16b186c53f4d777d77d13de3eef23f3b8fb509d439f9dfacfb27294e2733f9951c6b274479a6463f90564a98b993ed2ba8a7fd9e3d23ffda98fa977570fa2e8a8d2ce8b56e8552a9b900e73def8389c87ea5731de485cc9bff3b856fd073ed05f574a14b411d08e57f5f06e0604a0e41e6a1be70b882971df73bad63024523e5d7edb1496022d0851b4d70d82e8b94f7b0f473e16ac194625f174322ed25baf9201c36590c42879d7d0b5b92b960f1376b82dd157cfb2dcceeb3e171fd8ae11cbabbb5f8ab7d0107ec49e9c4641333b1532e19e569a751ee96e7fed01c244249e07b547de973385d079f8e0415def4d2ce5ac820cdb2d39865f000ab704b548ab1891eeb4ceb647de0956aa26d13cc4ac75fad85a044307a31285dcd877da220a2e5b696ee7b3c3e6930ae04d77556b8ff15cb9e3aaba4ce46e749fb94e4966d37d5d189f458964ee436c3b34c8a6baebb645371eecbfa1cc86ae653ad235bc64d912e2fbd37bb2f6d34e458f240357373bbb85582086e1f0c6b4c8b2a2fd53d14ac06cb3ceebf4de06fa5c005aa05d90904c35f3e9328af35ba1826bf1889a3cd24c03f636e06a5f6ee794d58d8efcce44e0bc4e39c1ac200957516168e8f2187fbb3392a4e8b78978c390243ccf074637518f57c1f8e57c7fc67f770fa83701fa9e91fd9b8dd11dd3cefbfb214c5219761e4668ecec19e39e011f5e02316348599665d9bdbf6658dbd3219c04da29d79053e04cf4d1b0cc02b5f49950ba788af3f2f0c3e0cf81f2cd0980d069aa4df6e82db9c9a4cb36e89ec3f167b370f74a2566fa13c49f986fe17b963c24d57a71524b2d679a6086b19806e767ca5377b499ee951b97fc6c5bbda1001ffc26b833ae734a3df5e9f2522a0acad7daa82bee6ea071caa2d85f4433caa44662804ee16b1a597d59de24145395e4db9cdec186495309d1d3d4def93cfaa2f3680b61329880e2fcc7338ed2fa8d1ea6330f76416d45a829044e4a5b35d9c1200e32f9735729509f379f7ef1d93c7d9f0c95ad0a45ed88d4a6bba873f51389371fc1ee5ebb53fda591fd0221950bbae1c1fb44e8480d6c1a995c36164a06d596c4a66a9925b860feebb65eb352823a2c3553c71ae461704e6fd1a49475b4fd2e942ba4d00bdd28cf578ccb5defdfd450b40ea773a639370b1ce3b6a77ef02dad3f03fb87d9e6991bf8d45bbb15ef27551f277c59a8d829dace3df59e29e92b71733f120a7042b8b07b686851568a720d1d9831589baa7ee448104435142dbeff9f4834c673aa393f68e093b8a5c143b0db9f80d492b88cf40d2c9afad0f5577bb1f183f3ada8a1c545a9d19a21e02746e7212b86dafdd60aa7caef4e1f2cd8478cba66ed43b2895600a0bdb2f28458e69b2755f2c57d8925ca7797b5b3ee3dd05d257bd7cdb4142404c27986fdf15b5e177d85f0b7132c3ec1db692d1162ae68e0aeff0e18c63be306ec390fcee116bb5da9fcbf54cec084c307afaf71ef4ebd58fd0cc5b73b5080a19a8ba4dcce28e037e56ed6c605f1aef92aa7986faff0c190469ebd11ff83512bb6da1de13a29c6c13ab4bbbbec72b9193a0c45458c2724722156d2f090ace0a99d1e91774a6acfc1782c3e89f0a27747e7c7384f853902868c4fe0d27e39646eb4e5b36b7154d668b24bbe0a33423163a72fcbf0a9d385c90c7eee74c938b635a9e8c226e40265e1bc8eb903eb9ac2da816ebd51d6eb2021759006702535ac6249011bdca165200cbe7aa0e67f4081afdbba8cd62f883c4e6dde7acce7f5f5a2ed811268d86434b98e8c694fbc1ccd562b3eddf7f0591285939925d46fb9c14c569508d0090baf899921b592b3c752b6e2902eb7ded236b8e7bd3b17a529bd3801f4702641a0817fd963cbba84633dc98de6ff387191d204de1cf21f5d4f16e308d6214fce711e1865985cac4ed48458c9832e1e39c1bb0ab105a7a54684940f616d38875b568cc7260fcae87a3d75ca9db2c399c9f6922746ca48eff184cc18c9f86473aa4637664babcdc7aed1476f2c5bb91b3edc193bfcab84b970e4f1ffd53539d5648c91bc85a935bf8eee44849ddd2d2556c55307b9557992e00dc84bedc8e243a3b3501e63069c5f66c525486c940e9782fd91494eeac29e41617720d8c04d3f8211497b1bea8e353a8c3447546fca5402af6b84860972cd0020f50495dbd9e83100dd7497a9c7a31099c6b9bc8c3c0010ad4242d5f62fb8649f4a3889616fe40003501333a980ea741cc3aac3969ef3f8a12f4719625680492cbc6f0dd733c300321b8ca81c2450e0a1bfd66edd07cd37e6dba175f9538199d25a771053a27d7a4251ccfceac4ef15529d5fff4f2d39524089313b290fd96b52a3cf2fde7ccdd09bab4b8027ad0286a81f1613009e0abeafa606cb3b2f41a55d8b64c566fddbd751b15cc90f60d89d1c1ecc36681fd19d050084b357b78d406f18066b6e56548ae4c76e76f57ffd3ced688c0e381a2935fdbcb5c420aae5fc4ce7e32feb088616f864e30c0cf9e6b6670df763e80e204aee25342de1f1bdad35bc037770939547a2d8c2c3f5d3fe94abaa1a86b887c0631aa9c0fdbbd9e2f1e11eb25071e1cd5d16eee893f3b6dbdcdd4f3f411d0ba5ca81266c3de65816c7a2cf322f09f3fb5db7e5714bea8032a7ed79a49544f587213aa1afa2baea329151f55d0c5370ecc2315780441fb806c0128cf0d2647ecbf2fb15ff490b53e6fde8a162fdc395dbc0703402bb40a9179ead0a322377306a51e1cf0b6a9c1433070ea3da6700e70aba10a1585f4c0c69eb6bfa6f4c024e473d266db423e14c30783b6d65977b975d48bae9417df11c9f001f22f0883a5564d8fdd567e30aed0486a45604a5251cbdbc951ea9f3b6e9b32a3ad77738f8fbde236013643442d2650a736b29e33a84c56d9665b0b099f5ffd4a267815ba12a5e311e77ff8bee9fdbb9ceff47f63ccb62c0bf595372abc240e1308713de7ea654988bb30be3fc56185b4f499faa1beb26b79f37b81df2dabef320dc79d88a7a6c260e46e7567736be65a9c8360c7d1a2f0b5c6155b0f727f6e7579790b5bdb091aa9d599e9d92b36020eab9d0001fd1bd1f14d93a3a0c52b073a6d9d232486c2248de3302a338e3d07dcc61eea9335397c4866e0b7f7224f5344914d039df08f536ca1dfd638dc05b14eab25b604f3a9ca048992ff006732611678f545863a21b64b07711d953be7c7c84041f37eb7cea6d8caa35fd803bfbd7cf1efdb0f501e1f40d1d3af5b1c639eb31637043b85c4259d6f50da4cefdac364948c0d4b05476caa5083fcd3fbdc30c9ec454ab3d10c4fa6bc9dc305a9fa601c83290ccc2866cbcc0ffc3323419017c66f7c455102f5e4365c8dfdfbf53646824d6363481854bbb3b99187a04b10b65cecdd407cf3bdaa984fa61c75dca397c41afe483979d67708a3e8d749757c388522b4ac290babff2b0687d48b984b6569279dcf9183f856ba785c7d0c149ae54436795bb55a34540a7cc8509826c8913514f08cf9f31b5984e2b072e2295f9ed2306a11a768d08d37b23691aa990b342bca9ba6e8f3b30719b179d6a8028b5655de5652d0d745a09fe12b3fbd58df5a83cf258ebc25f6f0d58853aab8ccccb917524e5a9890313649aea9f145c74ad16aceb380f71e411ab00ad1266fa40472d3ab58f45852fcf035366a6acfbf41d088636f14c103a48d359cf5eab7287d6d1f0172a7aeee60af9bd4a6a03d50d478e1c75d625ee223e42ff2bdf8c521c1140b7b31cede9816286abc87ecf4a9209f32d857117a7e6f8129d67e33f583c57ce78483bedc724682b587446a9bfe496d9c64aaee2621e3991decb5e327a2e8a09a1d90f39a63d9038762048c08d4a0f2b54c945c509274ff4cea4c997dd8221eaaf25987d9c5aaa0fb190f2f4736ed04debf8975b0613e390e90705a8afd8767c78cc819bee6ec3092ad21297b0a523ef0b27d9b33f1fd500536b6fea99833fae94d87aeec7b01f5b387605e97fe33b03c1454d5224aaef0ff466592023eb2214c5d45f8b076da94153e26a08dccad6407b36db919a7db97872b43487cb4de54cea1211eee1fcb860742d48ca6ca87f597674a41dbe3774fe644699dabb4bc6ce5227c3425a6aca769fe90959e82b0c82d6976e70130b8256e3e4f393d68963d147c439e9e2229d1b554ee543652d2f8bf1628452ea9ad280c0a24f49c497f8b182e8f5ee8393bf3ce8e1a456e04f5a98f0665e906ce7e24d3d8d4494b2fa655d01654008a05a27a7583b14ee71f1deeb8e6c652a26f85a824655aaa020cfeb9d23600b7cbad7542272e502b1248461980d2761c12f65d26462c1d57d1b5d98a4dc1daceb463066d7cadfae2040111378ef76613f94d29baf398cb35bb3252a80348215b74aa298934a1faa330106b06251119eb1fd0154fbfdc4725763fef22df54ac36bd069410119cc1d57b994d40d475745bce4a30b66ec255d8ba6609d45c50517cb4097f1716deb6f90fc035a6df7cfdb77d8f12cfeb1dd178a0bdb569af1dad890f0180dd92fb57556a42edefd8571bb1d1642bbaa1be18149d6d8e92e656401dbc91672bf142e0dcd86b7c5cb2805d048657baa4322aff53b855f4731aeb79fd549291e76510a96ee88e27aba271792ec21522eb60c762c51cd1272fa86769509a84fd65b6638cda86622bf1c7a9fb1d0e27139c906cdde8020eca04e0c367f71a41a374beded3038cab134ce0d126eed31c43b23ca879ec1c492182af5034b7b022ca1e9469eca8f42c4e26fdc549193ca4b931e5aff150287d95962db8c5ecbe7f1648acabe2f1ba6117f06b69fa76563fba399898e3b553dde0b86d49e15876420a1b3be99defd9ed30f89b1c7831d8a4b76cd81ab0bbaf29a3446583c6d9e83d00479159a7a7f36b150733132b3d72a3630909455c22e9ee53dbd7c6ed925b42da7ed0e1395bc7c47effdfc14dbd362eb8f317d069dc20bcb1c05140d428bfde5ee709e61851cbead3a878fb3d36435b189c7bcd2de7600e78807dd80f9872bacb3500cb17395d3a27c97b042e54f3869b38598dbced37bd381c6f662b58f71a4df5df2a9122aa2e1c85bb0193b326b7bdbfd9bba105ea45526786aa86371a2ceade14b52dd675e5e4d94939383d9a3ec9f513572db89e8990ab21141eb2d06a7a14b35f88321c1ee71047bca39b017d52bc864b74e6eefd7e28ae928ef15cc528e0a6ff935b5d243dd1e51fc15b2535e87f83f333ac48c826e58dfa744286aaf654a0fde7d2685c1cebfdd2c74e4fe770d54ca32574aab4864ba574b366a4bce6d58f538bf3677d18e820b9f56d223d39489c60aeda94cef17765b244f6e863b3ebf2c30a0ace89a29935dd0c3f63cca9590afc1a94f4d54d60c4b3a9967d5cc4518bb6dae5eb9260bc8650f55bbdb25b47e6f6e43c5cceccfce9d588f6d3a3136c14ab6ea5b900d7e1078030541780afa08c5c7545e98746135969560f7f906e798357eb154295216a3de272e791782c9283a4379ddf9a6a7e6b2d06bafcd29197883cd1643a9707c1f6fde829f926b86e1ab668bb263a70624a363f359eca16d7ed470489f2b918bf3c52fa29241a8ae30c7896db2ef1fadbdfd668587e638e95209485cf9d3b40a464307fab27176ca8fe48a9188187a64ee7521dddb0d0c176bad676e726dc3c158d161ceca100fcbd66d5ae261b6159856825807251f7ffa77715427e105f8039e31d1ef0c9404379f53d6576fe81fad13525ee20ec85adc665932d71a8e5acf55ffe4a403d7f84822701c5c624622424ba2ab5688fe37774b0c69958d42918e7c21dc81e66bf57b4b039d22ff96cb6af0aa0d758dcde67710f38b7b8ed790a09df082fe6d2047b76b63d09517a2317f5ddc791630bf981a0d4581df9aa66fe3c32d9c6195fcb4a04f84dfd87e5858a70ed1e62d64a2d1242b859e9ad0992c6c088d2860ba9ab692a9102da73c4a96f784732080d0c7f6dceef62295992d2245bc02965c11d67e69c4eeff8c896bbc61f63c1868f4845d95dfa49b0f4b8cb9eb559ad4eb58d2d543a7642805dd72eef70000509026e5346eb539a91852003d77a980fa1dbd22f47d8804318de5268acbca86399d9ddc24ed7cefdf15d36b22f2f7248e46a6f34d6ea129617aa0bd57deb9acfafb5d79901349e6f7735156d7b677f97b78113463425a3a432e0256567f2b316f406e5b7b249865f7a84f5774f09c6806fb8e3af74e0b0c11b6cdbd21c8c92f49116c1d294f6fc769f0dc99c385037be69f0f75fba165a34a067d3f5ce1f9e855ef0c5919c1590bf0fb9e7f9977439c7ad4f423dbe729e46cf0d4f9a2ec30db54eed530e6086c5169fd8c288d8cf7f5b293f9478febabb3dc31d1cacb22dd6ea9c43c2438b01c19003dfe419ddb85a0a90e624caa36ecbb58319ceb747a0a7f6340e54d60c2d09903501ead70f706c351df86ad64555397052974bbeb0d474924b184e21abb1b03f6a111eabd2b7ec32f2f584b78e72add9fadfc344028fa8960c78aaef4930fd632dd49ec945f766adab0c77b299cfa89c409d4bf0af50710b6bbd5244092551bb10b83bf6a82d8596936361c2c32f1ae35def81865d138a30675ac987f96d3e4739f87e2d3c2e42747bfae5fb1a777327e2d37dfd17478f41afdb982c72eb42461776f545517d5c6f721c97ba1f180852733e699a80da0aec759bf95d3d4a1e269d08e69e56674be62847181ee8d6c9e52875a8bbbc71d55b9a2c17c43e5fe4ca53cb6847952ee002f2c0b6c39f7377db0289ebc9a7333fe1dca6be5b9ea931490e6b2c3b11f62b99adce264eb4df832084c833a906f0304773ae8494ab0eddb343378f25a21619e4b48cc8600c97f8dd815f74f99b07168cbc6e46d1c0a07821f7d4d5e17295fc6e5dd4a1f39e35bc60a0e858cd6dcf8dc4a7ed369ea86a29ad6531f353eb882d1fac37877609f71dbba59449f291df1986175a3dc4a8ab59d5f80a2590b0d0363c34ad2363ab6f00c3cd14ef02f0a79453964055d71cef9f3c307bd4e85fe4277a0b77c90e9fbc99549d31b0c2bf76bbb592570a973193cc297d005289bce050218ef2ad7279d6d269ffdbf85a9f12e268a8a4f211c12f51dedee3d8655925e281aa2a1cbcd5c61f5e19cc72610288970f345762740341773f4e9fe2b6e1fa59249afdb801a192eb53a6f54a18ecc1a1030e203c6c79fae82961518eea7855c4d6d4c5e3fb5bcaa1f4c9477e78c96735fd336d56328a2b17956e8677d21e5b259f4427cd74b9013d3ef3f428c4cb57bb08714ecc2730a05ba9e93055f684771e284535b22547018bab3044b3a16b86a053aea33ed4c26fdf4be53a875bfdb835b3cbd81840cc905059fc825e8a6be78e8998dbd356180711851b1abaeb18b66d2fb67ef80e6e5b36c3accabe35b2ae1095df1d04036c42a93a6d1fb289ef2b7fd1ef5fdd0f6d9f1ab71b797c5fdd6bedb558338c78c3b80c9a7656c0ecd1b2b53441963a0ba9b730ace58ebd9f02edbb9f2ea12ed498203e6b9aae02e52332640820a600d66b2266cd6504cf25d0fded71d3180802c1ab3d4a70b474791976608b44704fe7c5dd69ff8c6c70aed49e77332f5d69e7f4d84dbfe03466fce7bb4535229047b838effc143e8b9fa80db8ab5531228b36e9db2c79fa5db7ec2577c9587dbe7d8ddeadc89ae4278ec00f884dfdceb1de3209ad90c8d95c55343387940eac3c6fb1ce3ca72531709ca9b1c584cb83da664667d793bfd9a25b939635cc373a7fd7eb1224e6572eaad7651df0a38f412ceac5c39fec2307f65f98b7952b58c01349d82e08bd05641df484605789febffc9c89eb13a003a9e2435db544c27225e6623d73b8cd04a715d0f67ffefe57a5ad4e7a024f6f55c211ac2cb6312335f977be64875354483baad5ae2fa1d623e8b903bee5d177c9474455c670af577a145a0dddad5568b721ffbd1116210688a5e51dc2f7481a667d6621091dd8366f1b2a509f3b22021cc0350c77c2958f82b8593672a1e8e23d81d1c5b1232eff20475a40a19e3909e84dbecf66648041e88d69579acee39a3a6a7ebffa16b4f7023f01f4c7e487cae8517c6b7405242be0f3aa617c83b808686f1dec7a356000f6f98a387f85d731c3d39be05c2c6e60b9c82c9ec602d834fd41199265c8fb414936d7734db90ebdd3c4b01161bef870ac9e8fa67699c34ddf5fb1ba52a1a02098b0fd23565633de0751b2e8be3794821a5835d470d96341d48d6e89e6411851ced6103b3ee7ff5478eeb95156a2fabea0ecee05700564ff34c999e37fe84b9ce8190dc35a637d9d9720edfd6db879be0517d34a01f5672ab980c10ebb135b9984a6acd06519b3e04f5e978efd492cb63a26ca664e93d1d11386fdc27b844875123543409af866464ce0f02c0418c3eb487ead896048d32143ba66f617649a722dcb58f20c1a761066d12d5d14dd64aabe56e058835598920226f09c163f47df66ac1db76a0f0dda01283c31387bce28d9e1890e89ec1c7f3984e91afb9f2bf6d08836cc2976f14758c0f354a7faf68028e7ac2c44e41360938662fdab7eedd2fd4f468d76e2715b07c0601cfbad84acec8a73bdd9a4e59ff6bcf4911522dae3aab398fba2b403d46fff0d52ec47a559c031197febd321941edb5fb0efa193cffaa93718b2e33095d9d37898473568ca0ae0930094f2063f717a4e9b85e6b95765e7a5c386dd15c6d5f1537fec97a82dbaa8517a52d0275a95fa75351923463f87c1099771c199ea787325405060f2c39dfb3a1c7b86a258639b982ae2d5ec2bb20f4dcf34c0acdef29881465f42e44c88fcdc820f0d1022d1e1f292e4670f09901c3dcbf171b0eee109032740bc5bd74392900c6085ba96d423605307886236df2d3560889121d9e1bf9977843fd66b82bc3fe648f45bf4d9e5822f1eb88df036bb22ff85ffa9ac3355fe648a56d8640e4b6e51bf12300db79d899454ded45224c33715c57ca062a9a960a2cf4d6a1a9968671b9e59212970fae0b2e2b3c1935944d04d98b207934902b47b2eb11024d9bd3a53b81c9c77eac02bc3d5caa1214b9193dda9c3a2ca04202acac5015d2921960ca52c2bab251b2740e974592fd77716fee4f75186340986d2e2aa70f2704c2aa9117b8addfb0111a3a346c33b825e522bef55ec65ab5887589e5a1484b43ff1cdc5c6dd0eb4d11f0ce42c301cddb144286fac41f4ba545091a58e48d77a3640b523332ff69fa0984964327a771da7064b8c76abd82849668c476c664fca83508c3864fed0f18ee4e63a510ff9bed09cd6e01333d43ca71de11fd09d088155a33974ab92a9b127f07d1f3419b2e4a255dbac4fc80645c3439dc666fbbd190df51d2a2a09139a8c0d0d8c543be6737ed123976e53c7a7535829d61cacdf13ebf768ee6af690c5d65e7eed6b74ca190a3dc4aab51d16874d3156f1110d79403106346b2be409f16d3ad48782d83fb8b6484f25b26b0e2fb9bd1e30f071dfcb56a80e08dacbebd955eeb5b4659818c96aa51d8ec695c137193bebd4df0db9a88bfc272cd78cf09cb992bfd1a922582bbc64ff5272f2f0d277b19279fcd9a43ebd3c8202be917a65416e1981483c93082f7574416ad907aa6e4881a0748e646961ea11f1c839e58dbdc920c88e921e3db1a65b7f866c31f371217a082d885d437563d4ddabb4acb4b30c31e1a7cd3fde3160249b569f69fa812225ec62c08761902b8a76d5402ee664f7e6c85adef5d56e446b62630a2bd847effa5360db843e9adb4d61d2156fd529b3f7348aa35153790e6e6b5b904a880e537d6c10d3e73941e888b1d3e4e602800d617170082897cf6792ad3b1fc04fcc4cd421b22cccbbeccff049832349a947dc1083788c25156c07e4a8e195333cb389822ce2f4c1f6b96adf3848a144c2cc9f98d02f131064873c563b56a24a9481663d9c6db3eb47c935dec24f5b792181f7a96070eb9d5da49ef4bdf783d0cb9d7058aa0fcfac1c8a80df7a6ec3632af914707b1ab38d177fc0660b9256dbd68a7e45a22246eb1f8028b4a43e96a00e5ffd92592ac55706ee0b8f5241c7df05bbe3ae02416caa91061d6183a8e62ddbb464891fcb1f513126b7fca82fd8b70d06f872fcc7792175f19a3625877d3ce304ab23305456fdb690a368d44e41e67f8cef3d860ee254c5204d6e5806cfe5c883c424823b098a76e78d4532d6f436888aa56933b7bf5ff7600dfaf12245c8b3680b025ad45de0862a7c569fba1277c74ee73815d92c805db9f1dd8ae7da59c185396b5d8023cfc6bb7e17bcb0a4ee35eb14b5c5ba71f678098b4e3a21a0bab774ea953b101dbbf1c5371383ad97ce03c31df30100b20545d850c8ef396706913da99ddbc3bde8b697b6ca8a541d527f58482289887717fd65a7c859f9d4a5642ebfa15fc80127a07d858ca3c152a54176d0f779ea85b2de9cb647bda6334f0233e3093a3034fdcaabeb3a7c646679129c36d1e496f4272f1fba0e19e8a80f6033020d82aee04a729b50e9a4b691c1b472fc587b7d5661b09b91c97ba68ae65ef17988046398118276aaa43cba5c6d1128cf0c96d356d6cc8f67d7723fbfffb86487d4b3fde0666e7734e96ce28da92eb82d886c12f2b686ea75bd6e57e4dafc882b3b77c8ee3801ccd1e0e1f5ea64a6f9b9fc34af0a6a63e28d1dd8b0b40e8e9b13975d6504cfa91399710789c32621b73ffd25bab57c14a0a1dc142faae62ca2dd2b43cb5506e4d0fd518242cf58fba77556c427854babc108f7f357c6331d2c57def1f4ce01ce5e8d1471792f1cc0aa17915d9e661900f7b1ce968e97aef414a607f90b4fcd5c2d4c1b445c73b38c1a3cebaa785813b5e7183f9bdb414b7fc8c34a165c152bd9455e8be2436108ad7cf3490da9cdc8382013dc49ddf688bbf9bb43b217f4d3e4ec76d8988181e539ba9f210aa812465ff0bcdbeab3ae00a91469cfea6566b3328064028a01b1da2052e210d4d183bc17d0882f26724a87873649c665d8beedd1d6f9a58f872e3737da90589d087d76b9197510556f41432ee2684c7bb4de0c7bd6d4941478a8c6fff8694d457833637597c33634a606c92229fe946a4425f193105501a7000f87f83f93cbb0957bae9068f3f9ebdccebd9ec9c95153d9b8659ef560dc8622685b742cf26259650cbe04a486e47452d8cb497083688ea66da4b3671325f0350e41c7f3cbe18927f11740bcc5572ed8dbf7f6458dd430fa0422f38a167d37249033fca7871108efb7a15452065bed15569991139573022e33e18fc330b7020903f9aa3ad48ba34b84a8206b3c70e69bf00772a91f63e7a522618be92b9f43492c4cbc987c18d42a4e9b65d7c0c426232f55c2038fc023b1cb478ec3cdbddfbf9871988f39551c10145f5308155362770e58dceb3919e42ecfb459ad973fec21f32570ecd84e01b3d01be114ba11712632eedd597690e0fa1d89b6df6ab64984eff9d539b41287e80802b0ae2378a8d232a8a927a60f6e5ad5b63f299d32c079747339d678b918b7164a6de03ea6f89b2fd66fdb7514f27b856c2a3d96e2e95ffdbf0a41a5b85ef6d8b5a0e767de846e1cd2252f48ffff58038f4d573fff82719b71b188bd960044c973f29a0b3ac7028e5fe565d0495dd4058c8bf1b5fefd746bc0bf6b7e2c58e195a8d092334fc398d9e3d2b63dfb448f65ec6c8eda62aaf16898af68377d931086d1d3fc9eb529842ed7c7e080c8c34e98774cc7a33b55cbb5760c38b6e4e9b31db89e528175ec8ed21a3d8b5298d31f3bc88b3e369e553ac521c7edebf7ca0ba4b9e8c61b8f8cddd2286ac430bd98aa0d3da5413d4e97a3465b956feff073b118798be7d29b9ca9542e21568a0a633eb064d06611e21ec47a4a3af7c291fab0e4d706ce440424fce1d5c89bd1e4267d79907884761bcf23d9b394e98455bac47c55d8df6193d4b153dbf7b906bd7fa513ab4063c50b1910bee1d0a05bfa2514c6bb4ba300633dd745a48f5cd5fe55b410a66c614c2566b5877fc241a03491b3019e8643970c2896794c7ce33d1b690c76c95ba8a77939be54536a4ff15d337b231384e2deb10d4c16bcd7dfb1817883bf33f832bcd2117b610fa9ad14f37a321dad491b4d3ef1bc33d80a8cca0a41a3b73f5d3f4f5f8d75756d6b8d9bcca3762c60319846854d5f15edaa2bb993a2601eb4d37b8424da12a2b6b76be45f0810163099e2dd946a17ec642af5247cf590c0997d7342bef17046405cd44f249e402f67b1318e7397a2dd23877db95d23df1504d9e9f5d96a041b712f940c5608acccb879c229018c1eae7692b819c28464e3eaba7934268cbb3f4b7150fe443b9f1c6fbf65368fe1c1b63c3e31e689556c9587834756e80c8734be2bdad302e026a6809edf34cbc43fb273b2ace6d26c8e2c30ccb79f9a83fc6ad36e1886bd45edd474cd6642daf28a958a8d3b6f124bbd3dd6da42f0270e280a34052efc64178894d742ec5efa3d4a5dc380647875eed6ce494bfd816f417aad176361f37f86b26308dcdc1de91bfa006a3ef539838b9fe3b31a2a59cf74a4c3a4066b2571d4ec0142b4c582ce46640cdda3ffde41259c8fe29c8a969a583e4d2958a7abc362a31ac0752a0084e2d0a4a5dabea7f5e543545f569dd884e8ccbd4fe4844720922e602f740ddf755ae89edde757dbead7c699dd723c57eb57d72de9702f6689e646f84aae45f5ea4d1e328fb3182a16c9bffe217ed2d815ffd73ccc6bcc560f03606316a04069c05eb3283bdb81eb57ebf787816afc7598ec1daceaf33f1c7a4b387f79c15dc04399f8b8bdf06ffc86e82d8f522bf87a88bdd5a664d24c6ab1a9795817827321210da63df3c80247971078268083c12b90820b57a9506ff3ddb3c7849da1424c720f4993d50732ede0b63b40ea6d96a7fdbb127693f8d7cb91207c15b45fb1a6b0e74ccadd24d7d86a39e716a95d10b0720a54ac38030f24e79568018e3c19f6d09693f089c1bd02aa577e5717ab561ece3e681dc231b5f255ce866c4535d0bf183465afbbf66086310bf2419b30ae04f6e0f9496d51fe830f6ccfa4bb7ddd9998771349d8cd4fb046459be859d9a6beefcf95680f6909e082dc42f88f0b59a557a6d2168fa19b500863d6270a69877ed38da00de647c8f924732d59fd86d349f0a553175a915f36aac1ca2ba5bfdfda11479f43894263e817c36e8b54fcf8c02fd51cb28dd7a3e14ce10abd699eacb0eb78a7bbbdf3b55caf5004d76ea63ed7bbbb9faba87841a3ee0ef2ce53d713ea11005354c3f756485bab4b8e1670879ccd6af1ca6b215316ecad4f0bbefe4c21bd7931400e9e26f2b98835a1211c90aba48097e52c9cb48ecb8b177e69a2c489dd58a66ccdca8f0a409bf6e9d08b52845e4629e7c86fe62558eda25c1fdcea3e1486f761511457004a1d19b82d25f60256fb4e18e311d7146a29b7a28984d8d51ff2438e6d2660389575162122627726a25cd6f7e4605962780157d90afd69ad4939e4f38159f726cde092f91e34761c3788b5c7a61603ab22fd8d6481c2142f10d8ab66ee284f0eb5cd269595128f21f84ae2fa1797a611dca571b012b198b11baa9a77db4086bce1935748a74f17a762bbf17c6c7b79f2abe912b11beb52024a59de117e3c8f1fb56c2ae55759c49bf183fc222a2492de19d0ef0aa6f3914d9911fd04414a993fb9850eecbdc656c2bcc2a412618839795b49097ba807f030d3c2b809d436ba6943425a9180d3c303412a1aa30ebf7fdade16fdbba49a25a02fe13cb897e29936bc4e8652b04d5dc55e85cbad4eed4e79d92daf6042725907fbc68bf4d7920858df55c8ebbd336a5d289fe22bedaacb60825867c33190c4e97411e593d2fcf416c79cd85f6f386bfd99d0e4adbe03a84974475ad9181aa757f2e9654bda6c523a1e78eb834b991ee18285833c6fb42458592f81183ba640ebd4d7933aab386bfbd2ab15bd35e697ab9dd17278dc01d87480aad41845ea04818fec50753d440f823cd1c2f5d5e5f4bc7a251154b7f50ba2eec9c226ceb30417aacc92b48182d9c011af76d8f74dc6a0a5f456ddeac28180d36c0b2058fcdf7318ecf7f84b1325004083984d36176378d6d8b9b2eec3c9080bdc81627f6e951cd890e59333bef40a36f09570260e41d9d27eeead24c9f038dca394139b6ddd9f59a2698adf3e1072e1f1febec7b4aadaaac2f2890b2c54c5a8d66d23a5a73f0f2a0ae3d33161c7b7cf18dccf73144cdac87ab29c617afce878dc72f8b86ef18c474abef8a9fd62591fbf6a4ce178272b37140015739693077ac1e71fff8f2cb90923ad20438237bc4c2022acd16754dc496e4116c46b10a3324b2a949009036652befab9570b6aba944bbd540c353dc83b5950b55591d3c1eada2d0febe7edb9b2f220606638b36d3fc22839da355142b4fab1b0bcb55353e81810688dc7e300d722c14b57902aa3ebe3a8127372a04c79ea36bb3c31b9241e2d5d6cc679a4093a3f4863a37e74f24bab22ac49d48c1789283ca5ec2f7b53e1a5d49eae311b3a03838af8be7a6d2fb6aa1e914fdb9e68d57be546289d825d520b8eb17392682ee557bcb2070431c1d107000fd90f5aeb5618600912e660d1b5e5c15abd76a3afd5aa1c5934e4fa2dad3a451ce5d6ec892cfbd42bb24c18809f2ff2d470606a4deee4e7580c77352bc7edfbd6f83e457bdba511570d6a1fc3a2c917deb0150c924831bfe7d10e39cc347dc1c64ad3e4d2891b4816d5a2584906c1d66641a1eee2e019de76a387544710d26ec73797f90a3a3903169c8d50c4b02b3fd457ea33f8627557b16cf6c954882ef6b1e63e39159f1d7578c795d5d0ce6d8027fd4791000795b61edb86ac8b10d9cce96ecea3e4c15e1a718e299d898d1566ae53c7a6f0fb98134fa0cc521ddc4be5d47f8a83769038fd3b77a34b68aaa57db1c0d388cef3d5a8402a6f4db6b84fa872227c135c5dcebb6c34005a4b246e22512eec73cf527cfe260ad3bb00b213cf3cb2c8dcd9726385bf929dda9b2c585d493c4abf103201a1ed1b1ae43ddb1694fff901fab6afc5b51f3d039dfede2067e92b7652a5f7ab0e51ace07d0dc8a10a50a4cb3b25c813deb435980c323bb0326c01f14fae1071bbe13324e395cf2109009ec184f61410e4c786335d7504da8b7b1fe08b59e3f487852f5cfdf839e258d90454b12a1b465f298c0ecf903081c2a32bbeb8684a8cecbe30cb41f71369c4058fb03c0912a529cc2a1164eded6350eba7b7e10b3eabe468b8e356307ccd1cb8b79bd438e03a7576d0608be5ea5b4d7351432903c0c0aee27939194335f70286884e222f1239e652d1ad0202a51fa2d052a4acb2d82ad6fcf95b64d374303fe96af3cc8d455a5d09027a1be8a77e7fa2989e984a866861ec0a6e408050ab2e1d7a3db2783681d2aa4a699291bd443bddc76a3e725be5e1f639e01c17ff1ae0f9d9504dfa064e03dca5911952f0766c53039e3a59884daee379b8159110e5d4598535cb3cde4c3293c46d798acb5ed72d04d97891bf5ccdc3f9c6ff53d2a727a925682d8d4fc005ce6dfddbb071b51d447f045f51e36961e259e4ad02109a16ee9a8b8f07a9dc3ab9fdce807ec3bdc660fe867aef784e8c77e5f081e6a5b043e820e1d7f672a9dacd4e4328c55db71cc3819627c47ee0fa2d3d01a10bfe4a97033dd2cb8d6d3f877e6d3338df73d3f5000c3252d96e9012fb56b254567d44ed382d880f547f21ffa505b3d44f5d5309dd2f39db233ec1c2142475c354cc446cf0c7c0a1521ff9f2654bd3a518929db11c402906d0cc0b774aeabaa057094ce1158871bac13fc3036835baa6a3670d15de89cef08e443bf5faa703f22a704ff38e79719ae364161ad1363acd260e8462a8792d75c64d6e558e1e745c6b5a4f298ef0f568680e86900e8f048e971361b100f210dcb72e54f3be8f27b0b5b7b038380006489ee502db2bf19b8f81a2e9dc00b0a8534cf52a54190165b4e7479a3e6f075567e89a535fa452f581e2462237809aa0bd6978b04d6c5fb617137175e37416a43557e037357fb2ee160cc190b7e7ce2a783c9721ce42492b3404ee880fc344f945f7d5fde06742ba158516ed8489662740972765898605d3df0f3f82638b71ebc267911ce7e8b003830aeb3df68d8f059101481255f14a7fc942c9c7ef755c5da2ab02f0abb3444fd0dc0d4f59f60fb51a35ce4cf89116ad2040c225d7267e0dfc3aac3381d7c79689c705a7f1ce4d5ee5acf6198796ac6d001138a9806c8c009875d5b82ce523b092da9341c362854c86e6856f31b089beb8af7a7343630c44de975633290022bbf6b6eef9205c51fc63c13886f55ad30ddbec9818fb5cb2a5924a3ba4f444fe790ab6ac3de744d9a890ef03e9c0326e31896a4db90b9f78856db59429c9ea556995667b894dd9be04d6c3fcd76e454e1322b90a63348fbb6fa21ea72332729e2024b580d5abf48d8bde7c0331d2ff7cc090c4317d1a8382ea9f1e6a3ca1c953d74127e053c3e46b6acb7a20b8b5f7be151eca324dc44782ff8546d3952879b89e5e4ccde9f1a0d4f2ad5e35927ba5c7912e4f4775410ed60e992c62d6a91db548c6b77a8a9d142ce9dcfaa259a309debb778e7a2573b487d7ef0df6287c3242d986042237b34cfe24ec85ebabc58c936bb71355058b15b9a1ac6e71a10fd8085232ed3fa3a7f418fd40da6a53392666b95b954969e9666f1a0ccadad081db37d1b3893a3a0c4c6a96cdf4c305c56d1958c1d066c52e5ddb90ee6e708bd40d4fc6ab6101fcd9d86b1f7e5d5e04ca281c94939493b40dfc3e496f24307f6f1726572229c397973abd849b6f320d2cc0c046a5bad59ae63b65dc042df12fa77bf026ab59a78965b3a50f28846c8d937aa9ae39327e98e3693efc1a7a03b41831bd77172cb3c52cfe218769a9337585fe91abaa9bc803a4efa74b96c1b39dec80d656c3b2486cd911c48f5b0138bfc07411ffa500de483a395b765da4f47a29b7ecea12ce4c02e56d8a8ace81c5b4115c4ba7bfcca87dfde47f47053aaf15c02ce721e31aec7b6881f537065a9c93e8ee8021a20dd85464475da0416ac2e9be4341d7062a4864059e56994133f9a2f7e549b44a3221920125ad93b6bf5d2c8dc8122ed9264cd78ed670a4841645c4df27ef053de3547630c67cd3eff44ef4bc4eda8dd9fcf2087cce0e4c876f4d737195e435126a74b3af943374034380172f74fb2669f8f2fe6f675323ed9d01cedd4d8069931c5cc54d12794f889aaf2b38b23ca7d56a84d7f416eb190674461a0ca79f5b369385fb1816882e1e7b69cfe9199871f0125e78912bfe4b42331355d23e4d89f848d7bc5a59270a9f176b0ccca54d564576bd2740de288ee19216d5db8a9f06d8231eba860d3d99c9c301fabfe6dfb956014b174666ed231fc241f2fc95822855906ba76234066dd6f6a431a1b1159bdfc6ba7fc6d7344f430fa1b03a70efe67dff75b3b24a989ae63a517c9cddf6376c015fe94d2837ccfbaae089472a715db32d6e3753b3309a63e0e3f51c491ba629486fda10d381da764e162a930e4d8c540737fcab5db3b6bc18d5ac3690b56f8c1a6d36f7cd5b1a1aaf8369b6a819c76241920be984de7a58a7f2eb5a3be5ed046f4b56dc6304ac4a779cdf0bc9956cd712bf0646f87ed7fa387a44fafed157e3f3645e5dd08b22c7c5f076e6e371d33a4e6f2fc713780208b57c62eb92debb48c8f0e129edefc368d36cc32d896041a16cd34212ac1c7b31375e21990d6573c08e5d9d3432972b8b25485f2400fb858f4b2c84c2a0253a5d7529600cbd638cffc4574c7b8153c26ff86263733a844afeb3affcda3203e2d39067fc92b791039fb19888adbc55dd766221e4a00b2ad9b34990b691ab621851d4542db1d228d0286958a61507971179e0bc7520c1fe491a66dc79e05bdeda8a4ec7502c2235f9af76ea25be9eb1614c409261d4ffe016d46a3cb365744e33de56dce03d36c3fe3c373003bb45d093480e98ab608c37186dffee03184ab119b9e920ca2b26e179737afcb299286c82509493cde1782d88fa79a6221bdf4f6c708156fd5741aa303bac3134c2276cbbede4ca37eabcce0df41c93b49f6b33261f3ad8f521dede1df5ab0c67a0031d0663efb73458e9e0dd022f11e4a22e92e96082e76c18de84fefb1b1dc9684640c22b8a36c28863e572ad6028be86bed58fb0f60ff6ea1916232903aa61063b38433897492f43e9993b144e4cb83bf72ee7d4fe21552d08d0cdc5a714a1048d17de889a65d9bdb8088b10368db48dc06bc9d3dd28a738f33dd3b9f2eb68662a7647c40ed1680dc31e7fb4707fb1571c3eb7c09c1cf97d64ecd0a17240de9680d57b770633ffde4a5ea33b266717547d2d32751aa659ad3210cf728ca7cc4cc65ea9b97e007d41622a15ba8d153fed46013010b400b981f4eab053c0df43c69f3ce4aeef24a31722044c42c0238dddcbce7aa662500132938ce545de413e54bc70185735411ca5d5eaae02e59d96c98741bd8047e7be2f541c1548306c3977a756d87d8035fc9a81dc2e7476b0df535ee3aaff52296846610132b7e87d22379e3519ea3ae9f10799f67a7668a02a20ecaa87722bd79c6a7767d7ad0dd3a199b6cada4cd567422c4317cf8ac150841fe4671f7294f5e1203e52bb99a1867a2b4343c220acda607d81ff6a8ca82a4013bcf4d0fdc49d8da713ec3adc48ac04470e919d124a357750914a35263da3bd325f9d8769811fedcb852fd344b9268dc52b5a454ae1d90f9e32b32fcc9a440a76859a01150e1107370af9db969549dcb6c03a2497f49c49fe2bb4c6490975127b9232599645f3b18d01f801015466a0b95726b228703d621d13d4bd44d68a42aa74901abdb0f8b2c6525e2608c1a81c7bc298a1e27ce4f709378080f6121ee961e4f75e00a67587020b9790debc06b20485b48ae503948dca2853df6e53108a7d42710e419d5cf4362823c9b367f1a9199d4b1053f63f200008e2c92c291fc608689a3c26f206c6da1868cec0562dce4a9d3e77a3b59784bc9b4b107ea1aff5996eebd080a65adf97e3ad23cbd6801609e1a9648fd07cb2121953a1bbf8f22bcc528d00edc3af2730531bd54113fc159f96c1e455485aa042e277dff2d592935ce716b199cfc51bd4839a8f051aa7bf265d598c70febfb4e46bf70a79873b9425f09cc5ad40415756dc48e6221372e532b87ea6716e300666686abc7a49dc71d85b33d16ed3d40ce14f00c18e66f8941fa2211f3feddc3f90393c2ef401f55f618c47d4d9f20364c633614b60c0dcf392a866564a7993ba9080ad6a1c13ee11ef78f97869a84c0ca88febd17e772705d945114fc0dc393202a40c4e2b1d92ec911294eb0c73b0252f8cee734910f694b135a0724a272da9e40af5f6a45a903ce5e576a5265b80a839ad8b6b7c11521ff72b37b4f454d4d0c78b495e158b73cd6d8b35e4af733557e6402f9bdff60c6d6c0e4b101621e0bd6804b0d3e16c7a30c1565d0290bb3ac8028399fdba2513f8e76119150d50e5e65691df3a78b3a3de2b77d76cbd626865dcb294262ee422dff2cfd2f3181d70b39b0fdd7f49f92144da9c36420622a89a90bae7222e8572f93d831dd4f24854d04c4bad6ce411c35c8e14dd43a45367ff2633bdb6258148719cae54d7004158231e51cae49696e70c11a37845b627e0ea8fccf18072e8774a741e5e18ad7f97915456d7703ffd97f869a048babfd81ec95b6ac429a91477f2ca3a40e602d133608ab69f9ad8c39f05b52628d971b3f7580ec8ed726e92678efcd04d1f5348d228c56e15a1113ae3a5be6e2ef0eb49486ad1c9cf58ceb5be6e049962294a46bba8e43428bffd8d97d3e7773739bdcdd7e637be6e2623a3c7c28bf4cfc6e53973d658b604087c8b70d06ec729028ec7df247434bce4ad4a87a8f18117bfbc425faa1849ea0ec0142544f638f1af15bd1e38af59232335a0826634d1bfc24e87ac173118240be23bd67a1ccdecd051c279ea27565bf8333e7dca74099abdd364b47f14415437e246932440a8e28889e68e5e67a7ebe4585b5c2f4687e03a3508956834b1ab9d0cee0a350e916b4c189f8aef36503ba4ec7fbe65cde0cb07b1a0aa322f2267a94de822b9c6984dcb218db898d0890f1c26fc88d13d53fff6e24c3142cddf4a840ce8cd852329ed34768abe1ca377b1985961c3d3e5a52071b308048998533249c28ac6dfa4d72845592d8d6ca46ba0e2e8cba5f1c1e4c2190fd30a94214eaaab03792060690adb045066c94f93efaa084028a2334631d5a1361365148268b203a93ec866bd752c8c72e90daf29f045e20b7a010cd7f1dd0246d3960500cd1a466199865ccb286cc2184b510fd23b8b5b626cf41a96d79a47cd2e928bac5125a87827ca4c4b8a26647cbdd1ee92816cf887b64e0158c61b70715004031625cb6dcfb2cbd66cef26e17b1b0a66e8d679ccde5245d1e23a933bee23106bea016e046ed73112348c67ba7272625b8f9640f86a589797cf9f43868c4fcbfeb31df355834c06ec38bfa13e6736177f682a959ef2f029fe4c14545e3a2138e78ef128ce9f85ec4c5309977dadec0cf3253f8793da1d558bb6b1f19a29432df03796397a8838759c34dbe61dcd3f426747ad54cb4103120eb5d6efccc13cfadd7a0eb0cf8fe41b951b7323626f9b7f007a02f167b0b0f3310c5935eb287a7c6af72bd3932bd55a77ae12a2c0c3f214d91b3b1b3f2c6ea226859398315d79da4d00ba89e9b0c33845cf12a8f9cb5a64f2867aec6d8f54cc9c759f36e45d70d74abebe99c4bd11ae75806a5a1bddd5b0522e4542a9b8118558d1055f5e35d7c7a3a082a0dd37fdfe31f29cddd82fb2c817e69e85b7f9a3d1250924752db6c829ab22fd43b0a0c87e1fb6367495dd1ea9624e24de0924212b0d2b9e19164f33204f0a3836df767af78f64ca595040176d7dc5cecc360dc8bda37c8a6fb74f48abaf1d3b217596a16be521d7136943282ca47737785affcdaa7912effe0a8761b3105972269a8bf2c7ce19547130deca9a60e32f633458564ddca8ab9f21b43447b07edeaec7ef28ec788387259f7af75d38182a2ebe99a107fdb7ce21e2f84e401c9305a17ed635433abd3db382ed34ca6de283846c9b013f9181946c264d8c1815262f4eb6e1c45113738c49c440e3596bcd4efbf71e9c23f84222e69ed3c8203e8711bab496809f500f928a4b7ec487bfc14755db5d5f0a0aa12bcd4f6ac10f51ca436e50dd95e959c8628b71c0d156ec01a24ceac093c5ddfdbce860ff7af0aaf4d2bad49652467ce6405bcc2356f014068022c63e284ec9cf260ec134e4ca0ad2b51ea537e34ef836eb0c7e920eae07f899e57600c15ffa7fa1ae1ac4878d99375e6f0a196147b118310ed235f9a0fd90acb97bbe593f976a0d0c7df7f253fef5def31e12c4e40119f6efd494399c776a6139deb587f255ae825a442261f381a12c1ab0bb7e17f7fa395eee1f35770fabc7a50d68b988dc98ad087423c9f892fbaa504cb1e03c118cee500b7b999f7e8e26b9d247daa898687ca1241c22a7753603497738d7f909bef8711e42a8463192ae9d32eb2572c2f5b8f43fa3b7ae7189a57b89059bbaf9afd87752a0c3f92c2f0e447406f3fce485ab57b0794e65d750186f5d2838f45a0f0a73115af48b2d126de15f66fd5962103ab8bbbf70e1f3044b2fbdf429b5cbf38c9e58f1a3bf0433340ffe923fa976181aa1c08cbd83d17d4a3ade49361c6e314bf0e99a9d4a6c3e8606de39e777e1218a33e564721fb30c688ce65bd0c16c5634022d8c07a676f727da2c90bc9ff911a30c797fb974502623f2c3777166305e5dff96577e6ff6f805b66cae3ad4c1c331abb877f88a07cbf88d9a45eab3add10046b38cd6812abe14c69f9f70685be5c2d36c1f642b51b0532d963667feb9fbfb483a0d009bd6400a764d550d0a357dbc88d0f4d8c194b4cf935c1b82c39c4ef9524224520d4f6d76f3f7ddd162f874e39abdd459cf321b74a8a4904e47aee72426b0c2b983d0fee2ff0084e557e7e09903d0f5e33e2b8706d7a3cc1e417a0907878a8d8545719b50b6190ea8849180eea73b1c84020e17c75da199c1b9cb597306c3d10b14b77b6e0838a58d7ee61054430ea9e9e8ef9fcd9f30df413030c3d8404f62b7fa320932acebad2e429c053891c11c8c5b24aac75b450b01f7b0514303ffefa3d3bc85c0e4b00790fa72838d2f32141dfbd93c558b85de5aa2d8d3880f013f2b3ad50b54b3da899d4527392c1f155ead7140fa6cf01f8c5dcd67d8f12a3a53a556992a075084a77860e901a8b63f620d1bb69a432d606c830594624d3b13ce6721d59cd8b8bfa760438ebb1167aeeeb4d2ac71a3e3e344f96edf6b7e9c8909513678a1541970565cdaba7ca5ba6a7804b80f3b6b4e1f2aa1ed9a10b6b8cc2e1000a2255d59344c206b5bee0438dfb9a9fa40ea38ce2cf43c4b923ea674bfea1bcd529d03c139e5ac703223f304aed250f619a3d1921c3c2b8da93c8eb24dbb413296c74678692395b1f6f70fee0b6ee4854bde5ff697bc5bf4e0519552ffe937c2605c8a9c939cf78e5c79fc244ec3ac127a26ac3237d6c49ae83b60adaad7c206f28b0db73c446fc4dd6a2f9fc0d10410309089f2d435b4f325569eebaf108c9cff90ab1af6a1c9850e6dec28dffd45baf0b08685f882aa441962c04271418239c4d0637e1a3c55fdedf31ce5c2c2c021ab764e9185520f98ae5eee1a451ec113bffe78f1fd06a57c9d70ec49c9b6a0e2cec6d2168afcf83d3a2b4428f3a19d1cb455d7d5857a3788114f16e581a32ea04c0caf2291a5911d219a3faf8bdec6fc00fd74a717ad1428ec4cdb23a446f928882f32b88cad968a0d3639cc7ed2723b31f07349afbcf3a4e6d91316c4b0afbee540aa8d94803e6e0176cf8ff93b08bdabd81c39e512ea0f59a0d81cd9e4b00976c323ccee02b4bb92a92537d29528d1a1e21eafc0e2896a14f77ad1ae3eb71bca69c2b497c9af6dfd158531123b3c2dc8a3e1146baeec9e824e110bd4f54e3e35f552674bc460ae1a2462504bd4c7f6370efff54ddeaf642e0579e8dc959e88e339220f6efbcff19b9a332282191d4d1782011d53d345375c4d1330305cd16ea768f38f1e05e6da605052de5b9f33a63c2f4a3f59343716c97bf0e26a4fb9aa084f7666593c3caef97e9c3667f9deb26d5386c293741457353609b723f476dcc7558d4821dd0aab65759f9bb9b25b6883bc4dffd113a531769ea18cb11cd50ad152d2577082f43adb671d7765b06b8dc3f71e9380ecfc5cf5257ac9af8290775ccd9d491083e85743e1f23baabaec96a218ed6da0ff635d5eba34bacbddb6e51ef9a8744a0b28eb0a15ff3cf59a4c3e5fc7d76cdcc0f6e86de1b63a7e9e69def58846dcae561958cde1ce5743115a2e83fa77178d5ae2e35b4cbfe68738589edbc02e8b113284e24d45f5abee74862c9e12745339ef98c8ca3094e755bab1d75ec0d746e72c98d708b7de99b8fbe351e537bb191ca56ac7f2837f64e39146d6dd1fad23f13ff8ae812da192045b701c4d50677580612ad8dced4f1f6d5b80bd1949e80d0f5f96b481d95d0b23cd9ce9086fe277d3424a0b8e0c6ac2da0aaa7f882bca7dead1c5af57744a0c0aad266cc346eb427d4befebf80a3487fab34264654bee543ad16819339b46c6fa141fadf8f4c91e799afd383dc05ff32e0d55b66ae61f9f0ed402ed48ff9f7117403523f192b8110b23e142466a51621def6eaaea1d8bd7eaf738f0b7995528aa531903ea95bb3eb1be0c603dba55f9fee52141a48da0b191a4fb41509b4bb00f3b49872c977ab149b7897ef1fc90d4e1c8a40390a9f1cb18e6376331cba1de3762ed24c61553920d0ec8611e20792a6980bc583442649bb9f45fce55dd8fed22cba209ae3a8967437eddcd4d0d6e3c6e558812d7182b8e69a12a4 请输入密码 ...","link":"/2022/03/29/Dev/nginx-conf/"},{"title":"nginx 日志","text":"Nginx 日志解析 索引 索引 access log error log nginx的log日志分为access log 和 error log 如果没有在配置文件中指定日志路径 默认存放在 /usr/local/nginx/logs 路径中 access log access log 记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息 错误日志的形式如下: 10.1.1.1 - - [22/Aug/2014:16:48:14 +0800] "POST /ajax/MbpRequest.do HTTP/1.1" 200 367 "-" "Dalvik/1.6.0 (Linux; U; Android 4.1.1; ARMM7K Build/JRO03H)" "119.189.56.175" 127.0.0.1:8090 0.022 0.022 10.1.1.1 - - [22/Aug/2014:16:48:19 +0800] "POST /ajax/MbpRequest.do HTTP/1.1" 200 616 "-" "Dalvik/1.6.0 (Linux; U; Android 4.0.4; GT-I9103 Build/IMM76D)" "36.250.89.22" 127.0.0.1:8090 0.036 0.036 从上面我们可以看出几部分信息: 1.客户端(用户)IP地址。如:上例中的 10.1.1.1 (内网负载均衡地址) 2.访问时间。如:上例中的 [22/Aug/2014:16:48:19 +0800] 3.访问端口。如:上例中的 127.0.0.1:8080 4.响应时间。如:上例中的 0.022 5.请求时间。如:上例中的 0.022 6.用户地理位置代码(国家代码)。 7.请求的url地址(目标url地址)的host。如:上例中的 /.... 8.请求方式(GET或者POST等)。如:上例中的 GET 9.请求url地址(去除host部分)。如:上例中的 /html/test.html 10.请求状态(状态码,200表示成功,404表示页面不存在,301表示永久重定向等,具体状态码可以在网上找相关文章,不再赘述)。如:上例中的 "200" 11.请求页面大小,默认为B(byte)。如:上例中的 2426 12.来源页面,即从哪个页面转到本页,专业名称叫做“referer”。如:上例中的 "http://a.com" 13.用户浏览器语言。如:上例中的 "es-ES,es;q=0.8" 14.用户浏览器其他信息,浏览器版本、浏览器类型等。如:上例中的 "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11" 其实nginx access日志的格式不是一成不变的,是可以自定义的。在nginx的nginx.conf配置文件找到:log_format 这里就是日志的格式看一下和上述日志匹配的log格式设置: #access日志格式配置,具体参数不再细说,上面都已经说过了,自己对应一下即可 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' '$upstream_addr $upstream_response_time $request_time '; access_log logs/access.log main; #access_log /usr/local/nginx/log/access.log main; #配置access log日志的存储位置及文件,注意:access.log文件是可以按日期进行分割的,方便查看及处理 相关说明解释 1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址; 2.$remote_user :用来记录客户端用户名称; 3.$time_local : 用来记录访问时间与时区; 4.$request : 用来记录请求的url与http协议; 5.$status : 用来记录请求状态;成功是200, 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小; 7.$http_referer :用来记录从那个页面链接访问过来的; 8.$http_user_agent :记录客户端浏览器的相关信息; error log error log 则是记录服务器错误日志","link":"/2022/03/31/Dev/nginx-log/"},{"title":"CentOS 安装 使用 Nginx","text":"Nginx 是 C语言开发到,建议在 Linux 上运行,当然,也可以安装 Windows 版本。 本篇 使用 CentOS 7 作为安装环境。 此教程为源码安装 Nginx官网 索引 索引 源码安装 安装所需工具 安装 gcc PCRE pcre-devel 安装 zlib 安装 OpenSSL 安装 官网下载 安装 yum 安装 安装命令 使用yum安装 程序路径 和 配置文件 会和源码安装不同 启动 停止 重启 nginx 开机自启动 方法1:/etc/rc.local 开机启动 方法2:配置开机启动服务 源码安装安装所需工具安装 gcc 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装: yum install gcc-c++ PCRE pcre-devel 安装 PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。 nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库。 pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令: yum install -y pcre pcre-devel zlib 安装 zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。 yum install -y zlib zlib-devel OpenSSL 安装 OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。 nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。 yum install -y openssl openssl-devel 官网下载 安装 直接下载.tar.gz安装包,地址:https://nginx.org/en/download.html 类似:https://nginx.org/download/nginx-1.20.2.tar.gz 使用wget命令下载(推荐)。确保系统已经安装了wget,如果没有安装,执行 yum install wget 安装。 wget -c https://nginx.org/download/nginx-1.20.2.tar.gz 解压 tar -zxvf nginx-1.20.2.tar.gz cd nginx-1.20.2 配置 //使用默认配置 会缺少ssl模块 ./configure //使用带参数配置(推荐) 带ssl 模块 ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module //更多参数 ./configure \\ --prefix=/usr/local/nginx \\ --conf-path=/usr/local/nginx/conf/nginx.conf \\ --pid-path=/usr/local/nginx/conf/nginx.pid \\ --lock-path=/var/lock/nginx.lock \\ --error-log-path=/var/log/nginx/error.log \\ --http-log-path=/var/log/nginx/access.log \\ --with-http_gzip_static_module \\ --http-client-body-temp-path=/var/temp/nginx/client \\ --http-proxy-temp-path=/var/temp/nginx/proxy \\ --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \\ --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \\ --http-scgi-temp-path=/var/temp/nginx/scgi 编译 安装 //如果是第一次安装或已卸载安装 使用指令: make && make install //如果是已经安装了 更新nginx版本 (初次安装跳过此步)使用指令: make //如果是更新 覆盖之前的nginx文件 cp /usr/local/src/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/ 安装完后 使用 /usr/local/nginx/sbin/nginx -V 查看nginx版本及 ssl 模块是否安装 123456[root@VM-0-4-centos nginx]# /usr/local/nginx/sbin/nginx -Vnginx version: nginx/1.20.2built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)built with OpenSSL 1.0.2k-fips 26 Jan 2017TLS SNI support enabledconfigure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module 看到 configure arguments: –with-http_ssl_module 说明ssl模块安装成功 nginx安装的程序路径 //nginx主目录 /usr/local/nginx //程序路径 /usr/local/nginx/sbin/nginx //配置文件路径 /usr/local/nginx/conf/nginx.conf 创建软连接 ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx 创建后可以在任意位置使用 nginx 命令 yum 安装安装命令yum -y install nginx 使用yum安装 程序路径 和 配置文件 会和源码安装不同执行目录: /usr/sbin/nginx 模块所在目录: /usr/lib64/nginx/modules 配置所在目录: /etc/nginx/ 默认站点目录: /usr/share/nginx/html 主要配置文件: /etc/nginx/nginx.conf 指向:/etc/nginx/conf.d/default.conf 启动 停止 重启 nginx 命令 //查找nginx的安装目录 whereis nginx ps -ef | grep nginx //启动nginx /usr/local/nginx/sbin/nginx //修改nginx.conf配置文件后 执行重启nginx命令 /usr/local/nginx/sbin/nginx -s reload //停止nginx 此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程 /usr/local/nginx/sbin/nginx -s stop //停止nginx 此方式停止步骤是待nginx进程处理任务完毕进行停止 /usr/local/nginx/sbin/nginx -s quit //查看配置文件 /usr/local/nginx/sbin/nginx -t 启动成功 浏览测试是否安装成功 开机自启动方法1:/etc/rc.local 开机启动 修改/etc/rc.local文件 添加nginx的启动 增加一下内容 cd /usr/local/nginx/sbin ./nginx 方法2:配置开机启动服务 添加服务文件 vim /usr/lib/systemd/system/nginx.service nginx.service123456789101112[Unit]Description=nginxAfter=syslog.target network.target remote-fs.target nss-lookup.target[Service]Type=forkingExecStart=/usr/local/nginx/sbin/nginxExecStop=/usr/local/nginx/sbin/nginx -s stopExecReload=/usr/local/nginx/sbin/nginx -s reloadPrivateTmp=true[Install]WantedBy=multi-user.target 命令 1234567891011121314//设置开机启动sudo systemctl enable nginx.service//关闭开机启动sudo systemctl disable nginx.service//启动服务sudo systemctl start nginx.service//重启服务sudo systemctl restart nginx.service//停止服务sudo systemctl stop nginx.service//查询状态sudo systemctl status nginx.service//修改service文件后 执行重载命令systemctl daemon-reload","link":"/2022/03/29/Dev/nginx/"},{"title":"Python","text":"~ 索引 索引 python环境搭建 Ubuntu 安装 python2.7.18 安装Python-2.7.18版本的python环境 安装pip-9.0.1版本的pip包管理工具 更新pip 配置环境变量 在 Unix/Linux 设置环境变量 卸载python python模块安装 问题 python环境搭建 参考菜鸟教程 官方下载 Ubuntu 安装 python2.7.18 官方python包下载网站 官方Linux系统python环境下载 安装Python-2.7.18版本的python环境 apt安装命令 // 更新apt $ sudo apt update // 安装python2.7.18 $ sudo apt install python 下载包安装 $ wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz $ tar -zxvf Python-2.7.18.tar.gz $ cd Python-2.7.18 $ ./configure $ sudo make $ sudo make install 安装pip-9.0.1版本的pip包管理工具 安装pip前 需要手动安装setuptools模块 模块网址 下载安装setuptools-18.1 $ wget https://pypi.python.org/packages/source/s/setuptools/setuptools-18.1.tar.gz $ tar -zxvf setuptools-18.1.tar.gz $ cd setuptools-18.1 $ sudo python setup.py build $ sudo python setup.py install pip必须使用与python2.7.18关联的 下载包安装pip 官方pip-9.0.1下载地址 $ wget https://files.pythonhosted.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz $ tar -zxvf pip-9.0.1.tar.gz $ cd pip-9.0.1 $ sudo python setup.py build $ sudo python setup.py install 测试是否安装成功 $ pip -V 更新pip 命令行 $ sudo pip install –upgrade pip …. Successfully installed pip-20.3.4 You are using pip version 20.3.4, however version 22.0.4 is available. You should consider upgrading via the ‘pip install –upgrade pip’ command. 配置环境变量在 Unix/Linux 设置环境变量 在 csh shell: 输入 $ setenv PATH "$PATH:/usr/local/bin/python" 在 bash shell (Linux) 输入 : $ export PATH="$PATH:/usr/local/bin/python" 在 sh 或者 ksh shell 输入: $ PATH="$PATH:/usr/local/bin/python" 注意: /usr/local/bin/python 是 Python 的安装目录。 卸载python 执行whereis命令查找所有的python文件夹 $ whereis python 找到后使用rm -rf命令逐一删除 $ rm -rf 文件夹路径 使用上述命令 继续查找 删除pip 删除所有残余文件 $ whereis python |xargs rm -frv $ whereis pip |xargs rm -frv 编辑pip配置文件 $ vim /usr/bin/pip 第一行#!/usr/bin/python3改为你使用的版本路径 python模块安装 pip3 安装模块 1234567891011121314151617# 导出已安装的依赖包pip3 freeze >目录/(.txt)# 批量安装依赖包pip3 install -r 文件# 安装依赖包pip install <package>==版本号# 升级安装包pip install <package> --upgradepip install -U <package># 卸载依赖包pip uninstall <package># 查看安装包列表pip list# 依据关键字查看安装包pip search <keyname># 查看安装包安装路径pip show <package> readline Windows安装readline模块 执行安装readline模块命令 $ python -m pip install pyreadline ubuntu安装readline模块 测试安装 命令行下进入python 执行下列命令 如果没有报错则表示安装成功 $ python >>> import readline protobuf模块安装 打开官方Github仓库 找到protobuf-python-3.19.4.tar.gz 下载然后解压 进入解压后的文件夹 找到python文件夹进入后 执行下列命令 $ python3 setup.py install 验证 $ python3 >>> import google.protobuf //如果这里不报错 就证明安装成功了 问题 问题一:Microsoft Visual C++ 9.0 is required 下载安装VCForPython27.msi包 多出现于python2.7 如果出现readline错误 执行下列命令 参考文章 安装readline模块 $ sudo apt-get install libreadline-dev No module named ‘_sqlite3’ 先安装sqlite3 wget https://www.sqlite.org/2018/sqlite-autoconf-3240000.tar.gz tar -xf sqlite-autoconf-3240000.tar.gz cd sqlite-autoconf-3240000/ ./configure --prefix=/usr/local/sqlite make –j4 && make install 重新编译python3[进入自己的python安装目录 cd /opt/apps/Python-3.6.10/ ./configure --enable-loadable-sqlite-extensions make && make install 测试 $ python3 >>> import sqlite3 # 没有报错,已成功解决问题","link":"/2022/03/08/Dev/python/"},{"title":"Github Actions的认识与使用","text":"这里介绍Github官方提供的的一个功能Actions。它以脚本的形式,在各种系统环境包括但不限于Linux,MacOS,Windows等等为基础,运行代码 程序。 索引 索引 前言 Github Actions使用限制 Github Action基础介绍 基础概念 术语/名词/作用 创建一个Action 问题/注意事项 版本 为README.md自述文件添加workflow状态徽章 结束 前言 Github Actions的功能非常强大,你可以在这上面发掘出非常多的玩法。这里主要介绍Github Actions如何使用! Github Actions官方文档 Github提供一个Action市场 Github官方action帐号 Github Actions使用限制 在使用Github Actions前 你必须知道 它的一些限制 和 免费额度。官方计费文档 每个月有2000分钟和500MB粗存的免费额度 Linux分钟乘数是1 macOS是10 Windows是2 意思是 如果使用1分钟的Windows要扣2分钟额度 每个Workflow中的job最多可以执行6个小时 每个Workflow中的job最多可以排队24小时 每个Workflow最多可以执行72小时 所有Action中 一个小时最多可以调用1000次API请求 每个仓库只能同时支持20个workflow并行 并发工作数:Linux 20,macOS 5,(专业版可以提高到Linux 180,macOS 50) Github Action基础介绍基础概念 workflow 工作流。 Action会在仓库的.github/workflows目录下后缀为.yml格式的文件作为执行脚本。 job 构建任务。 每个workflow由一个或多个job组成,可以并发执行job step 步骤。 每个job由一个或多个step组成 按顺序依次执行 action 行动。 每个step由一个或多个action组成 按顺序依次执行 一句话就是:每个Workflow有一个或多个job,每个job有一个或多个step,每个step有一个或多个action。 术语/名词/作用 只有部分 随时增加 修改 on 触发的条件 官方文档 事件文档 官方 name: GitHub Actions Test on: push: branches: - main runs-on 运行的环境 和 运行版本 例如:ubuntu-letest 官方文档 jobs: job1: runs-on: ubuntu-latest name 显示在Github的Action页面的步骤名字 jobs: my_first_job: name: My first job my_second_job: name: My second job uses 要执行的action Github提供一个Action市场 更多参考官方文档 jobs: my_first_job: steps: - name: Check out repository uses: actions/checkout@v2 #检出仓库的代码到workflow工作区 run 执行的命令 run: | 表示后面有多条命令 参考官方文档 jobs: job1: steps: - name: Display the path run: npm install job2: steps: - name: Display the path run: | npm ci npm run build needs 需要等待完成的job。可以是一个job的名字也可以是数组 参考官方文档 jobs: job1: job2: needs: job1 job3: needs: [job1, job2] # 在此示例中,job1 必须在 job2 开始之前成功完成,而 job3 要等待 job1 和 job2 完成。 创建一个Action 了解了以上知识,我们开始创建一个workflow。 进入你的仓库 点击 Actions这里可以选择你需要的环境 我们选择自定义 点击set up a workflow yourself 实际上就是在.github/workflows目录下创建一个后缀为.yml格式的文件 文件名可以自定义 但后缀必须是.yml 在编辑框内输入以下代码*.yml12345678910111213141516171819202122232425262728293031323334# name 自定义一个workflow的名字name: workflow# on 定义在什么事件触发后运行这个workflowon: # push 当main分支有push推送事件时 触发这个workflow push: branches: [ main ] # workflow_dispatch 定义了可以手动运行这个workflow workflow_dispatch:# jobs 包含所有要运行的job 可以依次运行 也可以 并发jobs: # 定义一个job 名字叫build build: # 这里声明这个workflow运行在什么系统环境 这里定义的是ubuntu后面的-latest表示最新版本 runs-on: ubuntu-latest # steps 要执行的步骤 steps: # uses 定义具体要做的action # actions/checkout@v2 执行actions(官方帐号)下checkout仓库的v2分支。它的作用是检出本仓库到workflow中 - uses: actions/checkout@v2 # 运行一个命令 和在系统命令行运行的命令一样 - name: Run a one-line script run: echo Hello, world! # 运行多行命令 - name: Run a multi-line script run: | echo Add other actions to build, echo test, and deploy your project. 在编辑页面可以看到 右边Marketplace提供了一个Action市场 Documentation提供了官方文档 编辑好后 点击右上角的Start commit 在弹出的对话框点击Commit new file。 创建完成后 在点击页面的Actions 会看到所有workflows中刚刚创建的workflow 点击进入刚刚创建的workflow 进入后点击左边的build 这里可以看到详细的执行步骤 好了 现在当这个仓库只要有push推送 就会触发这个workflow自动运行 问题/注意事项版本 在执行一些脚本时 要特别注意运行环境版本 因为这会导致workflow不能正常工作 这是比较容易忽略的地方 为README.md自述文件添加workflow状态徽章 官方文档 结束 Github Actions这个功能给我们带来的可创造性非常强大。这里只是简单介绍了一些功能,有什么问题可以在我的博客留言。","link":"/2022/02/16/Github/Github_Actions/"},{"title":"Github Actions自动部署Hexo个人博客到Github Pages仓库","text":"通过Github Action创建workflow,当Hexo博客源码仓库 有文章或代码提交时触发workflow来执行Hexo生成静态网页并push推送到Github Pages的仓库! 索引 索引 前言 创建两个Github仓库 创建Hexo源码仓库 创建Pages页面仓库 创建SSH密钥 创建SSH密钥 配置公钥到Pages页面仓库 配置Hexo源码仓库私钥变量 配置Hexo源码的_config.yml 创建Action 结束 前言 本文介绍如何使用Action运行的workflow 来执行生成Hexo并发布到Github仓库。 关于Action详细介绍 请参考我的博文 Github Actions的认识与使用 关于Hexo的使用与主题的使用 可以参考我博客的文章 关于Git,Github,Github Desktop相关可以参考我的博文 使用git和Github Desktop操作Github仓库 创建Github仓库用于存放Hexo源代码。 以下称为:Hexo源码仓库 创建Github Pages仓库用于存放Hexo生成的静态网页。以下称为:Pages页面仓库 创建推送到静态网页仓库的SSH密钥 在Hexo源码仓库创建Action 创建两个Github仓库创建Hexo源码仓库 打开Github登录你的账号 - 点击右上角的+加号 - 点击New repository 在Repository name 输入仓库名 这里自定义填 勾选Private私有仓库 这里只是存放源码不需要公开 勾选Add a README file添加一个自述文件 最后点击Create repository创建仓库 创建好后 将Hexo生成的博客源码文件push到Hexo源码仓库里 包括node_modules文件夹下的所有内容 创建Pages页面仓库 打开Github登录你的账号 - 点击右上角的+加号 - 点击New repository 在Repository name 输入xxx.github.io xxx自定义字符 勾选Public公开仓库 因为是Pages页面仓库 所以必须要选Public公开仓库 勾选Add a README file添加一个自述文件 最后点击Create repository创建仓库 创建成功后 需要配置下Github Pages 点击 Settings - Pages - 选择一个分支 - Save 出现以下提示表示你的Pages可以访问了 Your site is published at https://xxx.github.io/ 如果需要填自己的域名 可以在下面的Custom domain里面填写 修改后不要忘记到域名商修改解析地址到xxx.github.io 创建SSH密钥 这里创建的SSH密钥是留给 Hexo源码仓库触发workflow执行action运行hexo生成静态网页,push推送到pages页面仓库时用的 创建SSH密钥 任意位置打开命令行工具 输入以下命令创建一个SSH密钥 ssh-keygen -t rsa -C "youremail@example.com" -f ~/.ssh/xxx_rsaGit bash1234567891011121314151617181920$ ssh-keygen -t rsa -C "youremail@example.com" -f ~/.ssh/xxx_rsaGenerating public/private rsa key pair.Enter passphrase (empty for no passphrase): //这里输入回车Enter same passphrase again: //这里输入回车Your identification has been saved in /c/Users/xxx/.ssh/xxx_rsaYour public key has been saved in /c/Users/xxx/.ssh/xxx_rsa.pubThe key fingerprint is:SHA256:t0Q2AznSFmNe1GqgByJ61Z39Nswuwpu5/jQF12lUTc4 1@1The key's randomart image is:+---[RSA 3072]----+| o..o.+=+o..o+|| . . =oS+ o.+.|| . . =**o.+ E|| .o.=O. || .B.o+.. || o.o. || =+. || +. . || .oo. |+----[SHA256]-----+ 会创建2个文件xxx_rsa(私钥),xxx_rsa.pub(公钥) 配置公钥到Pages页面仓库 进入Pages页面仓库 Settings - Deploy keys - 点击Add deploy key Title 填写自定义标题Key 填写刚刚生成的xxx_rsa.pub(公钥) 用记事本打开复制里面的内容 粘贴到Key里 勾选Allow write access 允许写入权限 一定要勾选 点击Add key 配置Hexo源码仓库私钥变量 进入Hexo源码仓库 Settings - Secrets - Actions - 点击New repository secret Name 输入(PAGES_SSH_RSA),可以自定义 注意大小写 之后要用到Value 填写更改生成的xxx_rsa(私钥) 用记事本打开复制里面的内容 粘贴到Value里 点击Add secret 配置Hexo源码的_config.yml 找到deploy项 修改为你的Pages页面仓库的地址_config.yml1234deploy: type: git repo: git@github.com:xxx/xxx.github.io.git branch: main 创建Action 现在我们可以开始创建Action 详细可以参考 Github Actions的认识与使用 进入Hexo源码仓库 - 点击Actions - 点击set up a workflow yourself 在.github/workflows目录下创建一个后缀为.yml格式的文件,文件名可以自定义。 在编辑框输入以下代码main.yml123456789101112131415161718192021222324252627282930313233343536373839404142name: Hexo Build and Deployon: push: branches: - mainjobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: 1. git checkout... uses: actions/checkout@v2 - name: 2. setup nodejs... uses: actions/setup-node@v2 with: node-version: '16' - name: 3. install hexo... run: | npm install hexo-cli -g npm install --save hexo-deployer-git npm install - name: 4. config git env: ACTION_DEPLOY_KEY: ${{ secrets.PAGES_SSH_RSA }} run: | mkdir -p ~/.ssh/ echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan github.com >> ~/.ssh/known_hosts git config --global user.email "yourgithubIDmail@xx.com" git config --global user.name "yourgithubID" - name: 5. hexo generate public files and Deploy hexo run: | hexo clean hexo g hexo deploy 替换PAGES_SSH_RSA 变量名为刚刚你设置的yourgithubIDmail@xx.com 你的Github账号邮箱yourgithubID 你的Github账号名 点击右上角的Start commit 在弹出的对话框点击Commit new file。创建完成后 在进入Actions 会看到所有workflows中刚刚创建的workflow。 结束 ok! 到这里基本就结束了。以后每次添加 修改 删除文章时,只要push推送到Hexo源码仓库,就会自动执行action的workflow生成静态网页并且自动部署到Pages页面仓库了!","link":"/2022/02/17/Github/Github_Actions_Hexo/"},{"title":"使用Git和Github Desktop操作Github仓库","text":"本文介绍 如何通过git和Github Desktop来操作Github仓库。遇到的问题 和 如何解决! 索引 索引 前言 简要 Git 安装Git git常用命令 git push git remote git config git config –global core.autocrlf 安装 Github Desktop 配置Git和Github 生成rsa密钥 设置Github密钥 在Github账号设置里保存公钥 在Github的仓库里设置公钥 测试SSH连接 配置用户/邮箱 使用Git连接Github pull拉取到本地文件夹 clone克隆Github仓库代码到本地 push推送到Github仓库 问题解决 git切换ssh,https连接方式 Https > push不出现密码框 Github Desktop使用SSH连接 报错 git命令remote报错error: No such remote 'origin' warning: LF will be replaced by CRLF 结束 前言 Git 是一个开源的分布式版本控制系统。菜鸟教程 Github的git文档 GitHub Desktop 是Github官方提供的一个git工具 很好用。官方下载 官方文档 官方Github仓库 Github 用来存放代码的仓库,支持git版本控制。菜鸟教程 官方文档 本文使用Windows操作系统。 简要 简单的步骤 1.创建ssh使用的密钥 2.配置公钥到Github 3.配置Git的签名 用户和邮箱 4.Git连接Github仓库 与其同步 5.修改本地代码 6.push推送到Github仓库 Git安装Git Windows,MacOS,Liunx 都可以根据菜鸟教程Git安装配置 安装非常简单,这里不做阐述了。 git常用命令 首先需要先了解一些基本常用的git命令。以下仅仅是部分常用命令 更多命令 可以 参考 命令 说明 例子 git init 初始化仓库 git clone 克隆远程仓库到本地 git clone https://github.com/xxx/xxx.git git add 添加文件到暂存区 git add . git add filename git commit 提交暂存区 参考 git commit -m “message” git status 用于修改了哪些文件。-s 输出简短的结果 git statusgit status -s git checkout 切换分支 git checkout main git branch 分支操作 git branch #查看分支git branch {branchname} #创建分支git branch -D {branchname} #删除分支 git push 将本地的分支版本上传到远程并合并 更多可以 参考git push <远程主机名> <本地分支名>:<远程分支名> 命令 说明 git push origin main origin:远程主机名 main:本地分支名 git push origin main:main 与git push origin main等效 git push -u origin main -u 指定origin为默认远程主机名 之后在push的时候后面不需要加任何参数 直接使用 git push git push –force origin master --force 在远程和本地分支存在差异 可以使用--force强制推送 git push origin –delete master --delete 删除远程主机的分支master git remote 用于在远程仓库的操作 参考 查看所有远程仓库和连接的方式 $ git remote -v origin git@github.com:xxx/xxx.git (fetch) origin git@github.com:xxx/xxx.git (push) 添加一个远程仓库和连接的url $ git remote add origin git@github.com:xxx/xxx.git 删除一个远程仓库 $ git remote rm origin 修改一个远程仓库名 $ git remote rename old_name new_name 修改远程仓库的url连接 用于ssh连接还是https连接 $ git remote set-url origin git@github.com:xxx/xxx.git git config config配置文件 分当前项目配置文件 和 全局配置文件。优先级是 当前项目 大于 全局当操作配置文件时 加入--global参数表示操作全局config。不加入表示操作当前项目config配置文件必须存在 如果当前项目和全局都没有配置文件 会出错 添加/修改 签名信息 用户名 邮箱 $ git config --global user.name "abc" #修改全局用户名 $ git config --global user.email test@abc.com #修改全局邮箱 $ git config user.name "abc" #修改当前项目用户名 $ git config user.email test@abc.com #修改当前项目全局邮箱 查看config $ git config --list #当前项目config $ git config --global --list #全局config 编辑config $ git config -e #编辑当前项目config $ git config -e --global #编辑全局config git config –global core.autocrlf 关于回车字符在Windows Linux的不同产生的差异123456789101112#提交时转换为LF,检出时转换为CRLF$ git config --global core.autocrlf true#提交时转换为LF,检出时不转换$ git config --global core.autocrlf input#提交检出均不转换$ git config --global core.autocrlf false#拒绝提交包含混合换行符的文件$ git config --global core.safecrlf true #允许提交包含混合换行符的文件$ git config --global core.safecrlf false #提交包含混合换行符的文件时给出警告$ git config --global core.safecrlf warn 安装 Github Desktop 对于Github Desktop网友褒贬不一,有的说没用,有的说很需要。这里见仁见智。如果你觉得git已经够用,可以跳过这个章节。就我个人而言,git虽然已经够用,但我不拒绝Github Desktop的便捷。有些需要在git命令行上敲几十个字符完成的工作,可能在Github Desktop上面只需要点击几下鼠标就可以了,所以GUI的遍历是不得不承认!喜欢操作界面的小伙伴,我们继续吧! 进入Github Desktop官方下载页 下载自己需要的版本。这里以Windows为例。 下载 - 安装 - 运行! 我说的简单 装起来也一样简单! 虽然界面是英文的,但是官方还提供了中文文档还是很方便的。如果一定要中文界面,也可以去网上找一找有汉化包。 根据官方提供的文档,使用起来基本没什么难度。创建,添加和克隆仓库 提交,推送和拉去 文档都有介绍,而且非常详细,我这里就不再复述了。 配置Git和Github 连接方式分ssh和https但由于Github不在支持密码登录 一样需要使用token登录 而且每次输入密码也是够烦的 所以这里就不介绍https连接了 以下使用ssh方式连接 git与Github连接时,使用ssh方式。原理是 在本地保存私钥 将公钥保存在Github上面,这样在推送本地代码时git通过私钥进行rsa加密后发送给Github服务器,Github接收后通过公钥解密。以达到安全传输的目的!当然拉取Github上面的代码时也是一样 Github通过公钥进行rsa加密后传输,拉取到本地后,git在通过私钥解密,得到代码数据!如果想了解rsa的加密算法 可以在网上找到很多相关的视频 这里推荐李永乐老师讲的RSA加密算法 很容易理解! 知道了原理 接下来我们需要一个密钥对 生成rsa密钥 首先任意文件夹右键 选择Git bash Here打开Git bash。 输入cd ~/.ssh 查看.ssh文件夹是否存在,如果没有.ssh文件夹 则表示这台计算机没有生成过密钥。 $ cd ~/.ssh 在输入ls ~/.ssh查看.ssh文件夹内是否有密钥。通常默认的密钥名id_rsa(私钥),id_rsa.pub(公钥) 也可以是其他名。 $ ls ~/.ssh 创建密钥 输入$ ssh-keygen -t rsa -C "youremail@example.com" 邮箱填写Github上面的账号邮箱。如果要生成其他文件名 在后面加参数$ ssh-keygen -t rsa -C "youremail@example.com" -f ~/.ssh/filename执行命令 需要输入密码时敲回车 表示留空密码这条命令会生成id_rsa(私钥),id_rsa.pub(公钥)。 Git bash1234567891011121314151617181920$ ssh-keygen -t rsa -C "youremail@example.com"Generating public/private rsa key pair.Enter passphrase (empty for no passphrase): //这里输入回车Enter same passphrase again: //这里输入回车Your identification has been saved in /c/Users/xxx/.ssh/id_rsaYour public key has been saved in /c/Users/xxx/.ssh/id_rsa.pubThe key fingerprint is:SHA256:t0Q2AznSFmNe1GqgByJ61Z39Nswuwpu5/jQF12lUTc4 1@1The key's randomart image is:+---[RSA 3072]----+| o..o.+=+o..o+|| . . =oS+ o.+.|| . . =**o.+ E|| .o.=O. || .B.o+.. || o.o. || =+. || +. . || .oo. |+----[SHA256]-----+ 查看~/.ssh/id_rsa.pub(公钥)中的内容 12$ cat ~/.ssh/id_rsa.pubssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQChYJiCpZoue9LEUDa/5kUZRRqfYIELPeDDRaUbZbmVKgh1maIAOeFlKwg9rSgEphTKPGtnF3/+KjryLjdCzYMwvLNvSNBElM/Ho+aRVJKTidwqOA3SXwWKvd9aCmQi3rTq6L+GoI+qjcSjk9iudkpjgi9JxLKoMZ7nRsUuz6HtKT+50yY045ESbWuoPJqCkonY2yFXNDxUqof4P4KIMFu3rQyMfLRMFTlgfhw/WvL1zeKKM81MQmAx70SbpGyGV5l1GM4cD0+hXlZ5JvIzhKgk2N8n5JF0TLouK1RkGckqJRj4Uc+HsRhmFP3sD7hLhldwb3oSJrkDweRX5FNBKSok3yEWBAJYMwk7ipoz4neYx6G5PPh3kGaiODAj39PYiz3OmtZLCU+FXqk8GVZz1j8UQngjOodZTvOyOqrWYD6HTlprmzK9nFI5BXNcXH5fop/YoY6y26Du8gUrCdgZiE29tVU0mlO1iU1SArEHRH+pZQyltQEq42SMj02/9QYWGC8= youremail@example.com 设置Github密钥 Github的公钥可以保存在账号设置里,也可以保存在仓库设置里,区别在于保存在账号设置里可以用于所有仓库,保存在仓库设置里只用于某个仓库。这时我的理解并未考证。 在Github账号设置里保存公钥 打开 https://github.com/ 单击右上角头像 然后点击Settings(设置) 点击左侧边栏的SSH and GPG keys 点击New SSH key新建SSH密钥 在Title(标题)中,填写自定义标题在key中填写id_rsa.pub中的公钥 点击Add SSH key(添加 SSH 密钥) 在Github的仓库里设置公钥 (进入你的仓库 - Settings - Deploy keys - Add deploy key) 剩下的与上面的步骤4.一样 测试SSH连接 输入以下命令 测试ssh连接 $ ssh -T git@github.com The authenticity of host ‘github.com (52.74.223.119)’ can’t be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes # 输入 yes Warning: Permanently added ‘github.com,52.74.223.119’ (RSA) to the list of known hosts. Hi username! You’ve successfully authenticated, but GitHub does not provide shell access. # 成功信息 看到以上信息表示已经成功连接到Github 如果出现其他问题 参考官方文档 Github支持下列公钥名 id_rsa.pub id_ecdsa.pub id_ed25519.pub 配置用户/邮箱 使用$ git config配置user.name 替换你Github用户名user.email 替换你Github邮箱 $ git config --global user.name "yourname" #修改全局用户名 $ git config --global user.email yourmail@abc.com #修改全局邮箱 使用Git连接Githubpull拉取到本地文件夹 在本地项目文件夹打开Git bash 初始化 $ git init 添加远程仓库url替换git@github.com:xxx/xxx.git为你的仓库ssh链接 $ git remote add origin git@github.com:xxx/xxx.git pull拉取Github上面的代码 $ git pull origin main ok! 现在已经和远程仓库同步 可以使用了! clone克隆Github仓库代码到本地 在你想要克隆后存放项目文件夹 打开Git bash clone克隆Github远程仓库代码如果不填<文件夹相对路径> 会直接克隆到当前目录 $ git clone origin git@github.com:xxx/xxx.git <文件夹相对路径> ok! 可以使用了 push推送到Github仓库 新建 增加 删除 修改代码后 推送到Github 暂存修改 add. 暂存所有改动的文件<filename> 暂存指定文件名*.a 暂存后缀为.a的所有文件 $ git add . 提交暂存 commit-m "message" message自定义消息名 $ git commit -m "message" 推送 push-u 指定默认的远程仓库名和本地分支名 只需要第一次使用 以后可以直接git push推送origin 远程仓库名main 本地分支名 $ git push -u origin main 以上3步,基本就是以后最常用的操作。 问题解决 这里只记录遇到的问题 以后遇到随时添加 git切换ssh,https连接方式 使用$ git remote -v命令 查看所有远程仓库和连接的方式 $ git remote -v origin git@github.com:xxx/xxx.git (fetch) origin git@github.com:xxx/xxx.git (push) git@github.com:xxx/xxx.git为ssh连接https://github.com/xxx/xxx.git为https连接 如果没有远程仓库 可以使用$ git remote add添加一个 $ git remote add origin git@github.com:xxx/xxx.git 使用$ git remote rm删除一个远程仓库 $ git remote rm origin 使用$ git remote set-url设置远程仓库的url为ssh连接 $ git remote set-url origin git@github.com:xxx/xxx.git 使用$ git remote set-url设置远程仓库的url为为https连接 $ git remote set-url origin https://github.com/xxx/xxx.git Https > push不出现密码框 在使用https连接数 使用push命令 不提示密码框 使用以下命令 $ git config --system --unset credential.helper Github Desktop使用SSH连接 报错 在使用SSH连接时 会报错Authentication failed. Some common reasons include: 解决方法 去掉下面的勾选 File - Options - Advanced - SSH - Use system OpenSSH(recommended) git命令remote报错error: No such remote 'origin' 错误时没有远程仓库名 添加一个远程仓库名 可以解决 $ git remote add origin git@github.com:xxx/xxx.git warning: LF will be replaced by CRLF 主要原因是Windows和Linux在回车字符上的区别造成的 检查提示的文件 回车字符 或 更改config的core.autocrlf配置项可以使用 git config –global core.autocrlf 命令 结束 文章在Git,Github,Github Desktop的使用和问题解决上,没有做到完全覆盖,只是对自己使用的总结和记录。如果有什么问题,可以在 我的博客 (https://blog.pp6f.com) 中给我留言!","link":"/2022/02/14/Github/Github_git_GithubDesktop/"},{"title":"Hexo创建Markdown格式文章","text":"索引 索引 前言 创建文章 编辑文章 Markdown标记规则 标题 段落 字体 分割线 删除线 下划线 无序和有序列表 区块引用 代码块 链接 图片 表格 HTML 转义 思维导图 markdown和github支持 markmap插件 其他插件 End 本文基于Hexo静态网页生成器,使用Icarus主题,为基础环境。如果你还没有使用 可以参考 Hexo安装与使用及遇到的问题 和 有关Hexo的其他文章 在这里你可以了解到,如何 创建 编辑 文章。 Markdown格式的书写方式 规则等等。 前言 Hexo将解析Markdown格式文章。 我们只需要创建Markdown格式文件,Hexo会自动解析成静态网页。 Markdown是轻量级的标记语言 在书写上非常简洁 方便 高效。 更多资料可以参考Markdown指南 Markdown教程 创建文章 创建文章的方式有两种1 在博客目录的source\\_posts文件夹创建后缀为.md的文件直接创建文件 很方便 但是需要自己来编写Front-matter的每一项2 通过Hexo new命令创建文章。这个方法的好处在于,可以根据模板来创建,很多Front-matter可以自动生成。所以通常使用第2种方式来创建 首先 打开博客目录的scaffolds文件夹 找到post.md文件打开 这个是模板文件输入以下代码保存。 更多可以参考Hexo官网文档 Icarus官方文档 scaffolds\\post.md123456789101112131415161718192021222324252627282930313233343536373839404142---# 文章的标题title: {{ title }}# 创建时间date: {{ date }}# 更新时间updated: # 分类categories: # 标签tags: # 布局layout:# 作者author: # 语言language: zh-cn# === 以下项 根据主题不同可能项名称也不同 以下为Icarus使用的项# 文章封面图片cover: # 小的缩略图thumbnail: ---封面内容 通常在这里编辑文章的介绍<!--more-->文章内容# 前言# 目录# 正文# 结束 创建好模板后,就可以在命令行新建文章了。在博客目录打开命令行工具。 $ hexo new article_name 运行成功后 找到source\\_posts\\article_name.md就是更改新建文章的markdown文件 文章的文件名和title可以是不同的。 文章创建好了,下一章了解如何编辑markdown格式的文章。 编辑文章 首先编辑文件头 然后编辑<!--more-->之前的字符 作为封面介绍 在<!--more-->之后即为文章的正文了 Markdown标记规则标题 可以使用#来标记 1-6 级的标题 #号越多字体标题等级越低 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 段落 使用两行回车来标记段落 字体 在字符的前后加上* _来标记字体 斜体文本 斜体文本 粗体文本 粗体文本 粗斜体文本 粗斜体文本 *斜体文本* _斜体文本_ **粗体文本** __粗体文本__ ***粗斜体文本*** ___粗斜体文本___ 分割线 在一个空行使用三个以上的* -字符来标记分割线 *** * * * ***** ---- - - - 删除线 在需要使用的字符前后加上2个~号abc ~~abc~~ 下划线 要在字符上使用下划线 需要使用HTML标签带下划线字符 <u>带下划线字符</u> 无序和有序列表 在字符前加符号+ * -任意字符和一个空格 为无序列表 - 123 * abc + 123 在字符前加数字1. 2. 3.和一个空格 为有序列表 1. abc 2. 123 3. abc 列表之间可以嵌套使用 1. abc - 123 - 456 2. 123 - abc 区块引用 在字符前加>和一个空格 这是区块引用 > 这是使用区块引用的方法 还可以使用多层嵌套 这时第一层 这时第二层 这时第三层 > 这时第一层 > > 这时第二层 > > > 这时第三层 还可以组合使用 > 区块中使用列表 > 1. 第一项 > 2. 第二项 > + 第一项 > + 第二项 > + 第三项 区块中使用列表 第一项 第二项 第一项 第二项 第三项 代码块 一些简单的语句可以在字符前后加上 ` 反引号 标记这是代码 在字符前可以使用一个制表符(Tab键)或四个空格 来标记代码块如果有层级关系需要按层级加制表符 这是代码块 还可以使用 ``` 将代码块包裹起来 123funciton(){ a = a + 1} | ```js | funciton(){ | a = a + 1 | } | ``` 语言可以支持很多种 js diff yml css 等等。。 Hexo对代码块进行了扩展 以实现更多的功能 更多可以参考Hexo代码高亮文档 | ``` [language] [title] [url] [link text] [additional options] | code snippet | ``` Icarus还支持了 增加 >folded 初始折叠功能 链接 给字符添加链接 例:我的博客 https://blog.pp6f.com/ [字符](链接地址) or <https://blog.pp6f.com/> 还可以定义链接变量 我的博客 [我的博客][我的博客链接] [我的博客链接]: https://blog.pp6f.com/ 图片 添加一个图片可以使用 也可以使用定义图片URL变量使用 类似链接的变量定义 还可以使用HTML标签语言<img scr=图片URL地址 width="100%" height="100%"> 表格 制作表格非常简单 一目了然 没什么可说的 哈哈 | 左对齐 | 右对齐 | 居中对齐 | | :---- | ------: | :------: | | 单元格 | 单元格 | 单元格 | | 单元格 | 单元格 | 单元格 | 左对齐 右对齐 居中对齐 单元格 单元格 单元格 单元格 单元格 单元格 HTML 归根结底markdown的原理还是属于HTML标签语言的范畴,所以markdown完美的支持HTML元素。在一些不能满足需要的地方,可以直接嵌入HTML元素来解决例: 添加HTML元素 <article class="message is-primary" style="font-size:0.5em"> <div class="message-body"> 添加HTML元素 </div> </article> 转义 markdown使用了很多特殊字符 当需要输入这些字符的时候 可以使用反斜杠\\来转义 abc **abc** **abc** \\*\\*abc\\*\\* 思维导图markdown和github支持 竖行显示123graph LRA(根)-->B1(项1)A-->B2(项2) 横向显示123graph TDA(根)-->B1(项1)A-->B2(项2) markmap插件 Github markmap仓库 安装 npm install hexo-markmap 参数 height: 画布高度 depth: 可选,自动折叠层数深于depth的节点 使用方法 1{% markmap height [depth] %} 实例 代码 12345678{% markmap 300px %}- Testa - test1 - test2- Testb - test1 - test2{%endmarkmap%} 效果 其他插件 hexo-simple-mindmap End .markmap-container{display:flex;justify-content:center;margin:0 auto;width:90%;height:500px}.markmap-container svg{width:100%;height:100%}@media(max-width:768px){.markmap-container{height:400px}} document.querySelectorAll('.markmap-container>svg').forEach(mindmap => markmap.Markmap.create(mindmap, null, JSON.parse(mindmap.getAttribute('data'))))","link":"/2022/02/20/Hexo/Hexo-Article/"},{"title":"Hexo安装与使用及遇到的问题","text":"Hexo静态网站生成器 这里介绍如何使用 和 问题汇总! 索引 索引 前言 目录 安装Hexo运行环境 安装Hexo 使用Hexo 创建一个博客 常用命令 设置新主题 配置Hexo 插件/功能 文章加密 问题 hexo d 出现 ERROR Deployer not found: git 前言 Hexo是一个静态网页生成器,快速 简洁 高效的博客框架! 可用于制作个人博客,文档说明 等等静态网站的生成。 生成的静态网页可以直接部署到Github Pages仓库 文章支持Markdown格式编写 非常方便 Hexo基于Node.js开发 Hexo的好处在于 让你的精力放在专注于文章上 而页面的生成完全交给Hexo来完成! Hexo还可以加载各种主题 插件来实现很多功能。例如 评论系统 分享按钮 文章加密 等等。 目录 本文将分为以下几个章节,介绍Hexo的安装和使用 安装Hexo运行环境 安装Hexo 使用Hexo创建一个简单的个人博客 使用中遇到问题 和 解决 安装Hexo运行环境 在使用Hexo前,需要安装必要的环境 安装Node.js环境 Hexo官方推荐使用12.0及以上版本安装Node.js可以参考 菜鸟教程 我的博文 安装Git工具 可以参考 菜鸟教程 安装好以上环境 工具 就可以开始安装Hexo了 安装Hexo 官方文档 打开命令行工具 -g 表示全局安装 $ npm install -g hexo-cli 安装完成后 就可以使用Hexo创建博客了 如果需要使用hexo deploy部署命令 需要先执行以下命令 $ npm install --save hexo-deployer-git 使用Hexo创建一个博客 在需要创建博客的目录打开命令行工具 新建博客 $ hexo init myblog 进入博客文件夹 $ cd myblog 安装依赖项 $ npm install 执行本地服务器 执行成功后 就可以通过 http://localhost:4000 在本地访问你的博客了 $ hexo server INFO Validating config INFO Start processing INFO Hexo is running at http://localhost:4000 . Press Ctrl+C to stop. 常用命令 这里列出常用的命令 官方文档 命令 说明 hexo init 新建一个网站 hexo new “layout” “title” 新建一篇文章。layout 布局名 hexo new “article_Name” 新建一篇名为article_Name的文章 使用默认布局 hexo new page –path about/me “About me” 创建一个 source/about/me.md 文件。title 为 “About me“ 一般用于创建一个页面 hexo clean 清除缓存命令 hexo generate 生成静态网页 简写命令 hexo g hexo server 启动本地服务器 简写命令 hexo s hexo deploy 部署静态网站 简写 hexo d 使用此命令需要在_config.yml中配置deploy项 –debug 在命令后面加上--debug参数 启用调试模式 hexo version 显示Hexo版本 设置新主题 官方提供了很多第三方制作的主题 找到你喜欢的主题 点击主题的名字 进入到GitHub仓库 进入博客文件夹 执行克隆命令 例如克隆next主题到themes文件夹 $ git clone git@github.com:next-theme/hexo-theme-next.git themes/next 修改博客目录下的_config.yml文件里的theme项为next _config.yml1theme: next 最后执行 $ hexo clean && hexo g && hexo s 现在主题已经设置好了 配置Hexo插件/功能文章加密 有一些文章需要加密,来保证私密性。可以使用hexo-blog-encrypt插件,而且还提供了详细的中文文档。 问题hexo d 出现 ERROR Deployer not found: git 执行命令 hexo d 时出现 ERROR Deployer not found: git 错误 解决 在命令行执行以下命令 $ npm install --save hexo-deployer-git","link":"/2022/02/15/Hexo/Hexo_FAQ/"},{"title":"配置Icarus主题","text":"本文记录在使用Icarus主题时的一些配置!所有配置 不分先后 遇到随手记录! 索引 索引 配置CDN 配置highlight主题 代码高亮 修改页面宽度 增加深色模式 增加深色模式 增加深色logo图标 文章分享按钮 修改在手机页面宽度 在手机页面隐藏小部件 修改Icarus主题字体 修改code背景颜色 给文章增加 原创/转载 标签 修改busuanzi显示uv和pv Icarus是基于Hexo静态博客生成器的一款主题。这里主要介绍如何配置Icarus的自定义化。如果你还没有使用,可以参考我的其他文章 Hexo安装使用 和 Icarus主题使用及问题。可以帮助你从零建设你的个人博客。 配置CDN在_config.icarus.yml找到providers。全部修改为loli 国内网络环境很多国外的cdn被墙,所以需要修改cdn改善访问速度。 _config.icarus.yml1234567providers: # Name or URL template of the JavaScript and/or stylesheet CDN provider cdn: loli # Name or URL template of the webfont CDN provider fontcdn: loli # Name or URL of the fontawesome icon font CDN provider iconcdn: loli 配置highlight主题 代码高亮首先 在_config.yml中找到highlight 设置enable: trueHexo提供了2个代码高亮插件 但同时只能开启一个 所以prismjs要设置为false _config.yml123456789highlight: enable: true #是否启动 line_number: true #显示行号 auto_detect: false #自动侦测代码块 tab_replace: '' wrap: true #如果line_number启用 wrap会自动开启 即使设置false hljs: false #开启后 代码块的HTML的class添加hljs-前缀prismjs: enable: false 在_config.icarus.yml中找到article highlight修改theme可以在 highlight主题列表 找到更多的主题 也可以在 highlight主题预览 预览这些主题 _config.icarus.yml12345678article: # Code highlight settings highlight: theme: vs2015 # default | vs2015 # 显示复制代码按钮 clipboard: true # 代码块的默认折叠状态。可以是"", "folded", "unfolded" fold: unfolded 修改页面宽度Icarus初始的页面宽度在PC端浏览很窄,而且使用3列更小。所以需要加宽显示,看起来更为大气!具体操作:1.打开themes\\icarus\\include\\style\\responsive.styl。按下面的项修改 themes\\icarus\\include\\style\\responsive.styl1234+fullhd() .is-2-column .container max-width: $widescreen - 2 * $gap width: $widescreen - 2 * $gap 2.这可以宽一点 但还不够 继续!进入themes\\icarus\\source\\css\\文件夹,新建一个styl文件。如:brucebin.styl编辑填入以下代码 brucebin.styl1234567891011121314screen-tablet = 769pxscreen-desktop = 1088pxscreen-widescreen = 1280pxscreen-fullhd = 1472pxscreen-onek = 1700px@media screen and (min-width: screen-onek) .container max-width: 1600px width: 1600px .column.is-3-widescreen width: 20% .column.is-6-widescreen width: 60% 3.打开themes\\icarus\\source\\css\\style.styl插入以下代码。将我们新建的styl文件引用进去 themes\\icarus\\source\\css\\style.styl1@import 'brucebin' 至此完成显示宽度的增加 刷新测试下吧! 增加深色模式增加深色模式本文给icarus增加一个深色模式。借鉴了imaegoo的icarus魔改版 和 jeam-xyz的icarus修改版。以下使用的一些代码源自于这两位网友!在此表示感谢!1.增加一个按钮在导航页增加一个按钮。打开themes\\icarus\\layout\\common\\navbar.jsx。增加以下代码 复制时清除前面的加号 themes\\icarus\\layout\\common\\navbar.jsx >folded12345678910111213141516171819 <div class="navbar-end">+ <a class="navbar-item night" id="night-nav" title="Night Mode" href="javascript:;">+ <i class="fas fa-lightbulb" id="night-icon"></i>+ </a> {Object.keys(links).length ? <Fragment> {Object.keys(links).map(name => { const link = links[name]; return <a class="navbar-item" target="_blank" rel="noopener" title={name} href={link.url}> {link.icon ? <i class={link.icon}></i> : name} </a>; })} </Fragment> : null} {showToc ? <a class="navbar-item is-hidden-tablet catalogue" title={tocTitle} href="javascript:;"> <i class="fas fa-list-ul"></i> </a> : null} {showSearch ? <a class="navbar-item search" title={searchTitle} href="javascript:;"> <i class="fas fa-search"></i> </a> : null} </div> 2.新建一个js文件创建文件themes\\icarus\\source\\js\\night.js。代码如下 themes\\icarus\\source\\js\\night.js >folded1234567891011121314151617181920212223242526272829303132333435363738(function () { /** * Icarus 夜间模式 by iMaeGoo * https://www.imaegoo.com/ */ var isNight = localStorage.getItem('night'); var nightNav; function applyNight(value) { if (value.toString() === 'true') { document.body.classList.remove('light'); document.body.classList.add('night'); } else { document.body.classList.remove('night'); document.body.classList.add('light'); } } function findNightNav() { nightNav = document.getElementById('night-nav'); if (!nightNav) { setTimeout(findNightNav, 100); } else { nightNav.addEventListener('click', switchNight); } } function switchNight() { isNight = isNight ? isNight.toString() !== 'true' : true; applyNight(isNight); localStorage.setItem('night', isNight); } findNightNav(); isNight && applyNight(isNight);}()); 3.引用js文件打开themes/icarus/layout/common/scripts.jsx文件。增加以下代码 复制时清除前面的加号 themes/icarus/layout/common/scripts.jsx >folded1234567891011 return <Fragment> <script src={cdn('jquery', '3.3.1', 'dist/jquery.min.js')}></script> <script src={cdn('moment', '2.22.2', 'min/moment-with-locales.min.js')}></script> {clipboard && <script src={cdn('clipboard', '2.0.4', 'dist/clipboard.min.js')} defer></script>} <script dangerouslySetInnerHTML={{ __html: `moment.locale("${language}");` }}></script> <script dangerouslySetInnerHTML={{ __html: embeddedConfig }}></script> <script src={url_for('/js/column.js')}></script> <Plugins site={site} config={config} page={page} helper={helper} head={false} /> <script src={url_for('/js/main.js')} defer></script>+ <script src={url_for( '/js/night.js' )} defer={ true }></script> </Fragment>; 4.新建一个styl文件创建文件themes/icarus/source/css/night.styl。代码如下 themes/icarus/source/css/night.styl >folded123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378dark-primary-color = rgb(55, 61, 72)dark-primary-color-hover = rgb(67, 74, 86)dark-primary-color-active = rgb(44, 49, 58)dark-font-color = #c0c0c0#universe display: none.navbar-logo,.footer-logo .logo-img-dark display: nonebody.night background: #0e1225.night // code highlight (https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css) // navigation bar, cards .content code color: rgb(203,186,125) // night icon changed to fas fa-moon-o #night-nav #night-icon:before content: '\\f186' .navbar-menu background-color: inherit .navbar-main .navbar-menu .navbar-item &:hover, &:focus color: #ffffff background-color: dark-primary-color .navbar, .card background-color: rgba(40, 44, 52, 0.5) backdrop-filter: none -webkit-backdrop-filter: none .card &:hover background-color: rgba(40, 44, 52, 0.8) .footer background-color: rgba(40, 44, 52, 0.5) backdrop-filter: none -webkit-backdrop-filter: none &:before background-color: rgba(40, 44, 52, 0.5) // input .input, .textarea background-color: dark-primary-color-hover border-color: dark-primary-color // message .message.message-immersive background-color: #c2c2c2 .message-body color: #222222 .message.message-immersive.is-info background-color: #bdc3c8 .message-body color: #004779 .message.message-immersive.is-warning background-color: #cbc8ba .message-body color: #5b4b00 .message.message-immersive.is-danger background-color: #c6babe .message-body color: #79000f .message.message-immersive.is-success background-color: #bfc7c0 .message-body color: #1e4d1c .message.message-immersive.is-primary background-color: #bdc0c9 .message-body color: #003790 // button .button.is-primary, .button.is-light, .button.is-small background-color: dark-primary-color color: dark-font-color &:hover, &.is-hovered color: #ffffff background-color: dark-primary-color-hover &:active, &.is-active color: #ffffff background-color: dark-primary-color-active .button.is-white, .button.is-transparent background-color: transparent &:hover background-color: dark-primary-color !important .pagination .pagination-next, .pagination .pagination-previous .pagination-link:not(.is-current) color: dark-font-color // button .button.is-primary, .button.is-light, .button.is-small background-color: dark-primary-color color: dark-font-color &:hover, &.is-hovered color: #ffffff background-color: dark-primary-color-hover &:active, &.is-active color: #ffffff background-color: dark-primary-color-active .button.is-white, .button.is-transparent background-color: transparent &:hover background-color: dark-primary-color !important .pagination .pagination-next, .pagination .pagination-previous .pagination-link:not(.is-current) color: dark-font-color background-color: dark-primary-color a color: dark-font-color .pagination-link.is-current background-color: dark-primary-color-hover border-color: dark-primary-color-hover // comment .v .vwrap, .v .vwrap .vheader .vinput border-color: dark-primary-color .v .vwrap .vheader .vinput:focus border-color: dark-primary-color-hover .v .vbtn color: dark-font-color background-color: dark-primary-color border-color: dark-primary-color &:hover background-color: dark-primary-color-hover &:active background-color: dark-primary-color-active .v .vlist .vcard .vhead .vsys background-color: dark-primary-color .v a:hover, .v .vlist .vcard .vh .vmeta .vat color: #ffffff .v .vlist .vcard .vcontent.expand:before background: -webkit-gradient(linear, left top, left bottom, from(rgba(37, 41, 54, 0)), to(rgba(37, 41, 54, 1))) background: linear-gradient(180deg, rgba(37, 41, 54, 0), rgba(37, 41, 54, 1)) .v .vlist .vcard .vcontent.expand:after background: rgba(37, 41, 54, 1) .v .vlist .vcard .vh, .v .vlist .vcard .vquote border-color: dark-primary-color-hover // font color body, strong, time, .title, .footer, .card, .content h1, .content h2, .content h3, .content h4, .content h5, .content h6, .navbar-item, .navbar-item.is-active, .navbar-link, .menu-list a, .menu-label, .level-item, .input, .textarea, .button.is-white, .button.is-transparent, .article-licensing, .v * color: dark-font-color .media-content, .has-text-grey, .link-muted color: dark-font-color !important a color: rgb(82, 153, 224) &:hover color: #ffffff // quote .content blockquote, .article-licensing background-color: dark-primary-color border-color: dark-primary-color-hover .post-copyright background-color: dark-primary-color border-color: dark-primary-color-hover // table .content table thead td, .content table thead th color: dark-font-color .content table td, .content table th border-color: dark-primary-color-hover // break line hr background-color: dark-primary-color-hover // tags and menus article.article, article.media .title:hover a // override anotherr !important color: dark-font-color !important .tag:not(body) color: dark-font-color background-color: dark-primary-color .tag.is-grey background-color: dark-primary-color-hover .menu-list a:hover background-color: dark-primary-color .menu-list a.is-active background-color: dark-primary-color-hover .menu-list li ul border-color: dark-primary-color // time line .timeline .media:last-child:after background-color: rgb(37, 41, 54) .timeline border-color: dark-primary-color-hover .timeline .media:before background-color: dark-primary-color-hover // search box .searchbox .searchbox-container, .searchbox-header, .searchbox-header .searchbox-input, .searchbox-header .searchbox-close, .searchbox-body, .searchbox-result-section, .searchbox-result-item color: dark-font-color background-color: dark-primary-color border-color: dark-primary-color-hover .searchbox-container .searchbox-result-section .searchbox-result-item:hover, .searchbox-container .searchbox-result-section .searchbox-result-item.active, .searchbox-container .searchbox-header .searchbox-close:hover color: #ffffff background-color: dark-primary-color-hover // selection ::selection color: #ffffff background-color: rgba(52, 109, 167, 0.8) ::-moz-selection color: #ffffff background-color: rgba(52, 109, 167, 0.8) input:-webkit-autofill -webkit-text-fill-color: dark-font-color !important box-shadow: 0 0 0px 1000px dark-primary-color inset .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #abb2bf; background: #282c34 } .hljs-comment, .hljs-quote { color: #5c6370; font-style: italic } .hljs-doctag, .hljs-keyword, .hljs-formula { color: #c678dd } .hljs-section, .hljs-name, .hljs-selector-tag, .hljs-deletion, .hljs-subst { color: #e06c75 } .hljs-literal { color: #56b6c2 } .hljs-string, .hljs-regexp, .hljs-addition, .hljs-attribute, .hljs-meta-string { color: #98c379 } .hljs-built_in, .hljs-class .hljs-title { color: #e6c07b } .hljs-attr, .hljs-variable, .hljs-template-variable, .hljs-type, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo, .hljs-number { color: #d19a66 } .hljs-symbol, .hljs-bullet, .hljs-link, .hljs-meta, .hljs-selector-id, .hljs-title { color: #61aeee } .hljs-emphasis { font-style: italic } .hljs-strong { font-weight: bold } .hljs-link { text-decoration: underline } 5.引用styl文件打开themes/icarus/source/css/style.styl文件。插入以下代码 themes/icarus/source/css/style.styl >folded1@import 'night' 增加深色logo图标1.增加导航页logo深色图标打开themes\\icarus\\layout\\common\\navbar.jsx 增减以下代码 themes\\icarus\\layout\\common\\navbar.jsx >folded12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879class Navbar extends Component { render() { const { logo, logoUrl,+ logoDark,+ logoDarkUrl, siteUrl, siteTitle, menu, links, showToc, tocTitle, showSearch, searchTitle } = this.props; let navbarLogo = ''; if (logo) { if (logo.text) { navbarLogo = logo.text; } else {- navbarLogo = <img src={logoUrl} alt={siteTitle} height="28" />;+ navbarLogo = [+ <img class="logo-img" src={logoUrl} alt={siteTitle} height="28" />,+ <img class="logo-img-dark" src={logoDarkUrl} alt={siteTitle} height="28" /> ]; } } else { navbarLogo = siteTitle; }...module.exports = cacheComponent(Navbar, 'common.navbar', props => { const { config, helper, page } = props; const { url_for, _p, __ } = helper;- const { logo, title, navbar, widgets, search } = config;+ const { logo, logoDark, title, navbar, widgets, search } = config; const hasTocWidget = Array.isArray(widgets) && widgets.find(widget => widget.type === 'toc'); const showToc = (config.toc === true || page.toc) && hasTocWidget && ['page', 'post'].includes(page.layout); const menu = {}; if (navbar && navbar.menu) { const pageUrl = typeof page.path !== 'undefined' ? url_for(page.path) : ''; Object.keys(navbar.menu).forEach(name => { const url = url_for(navbar.menu[name]); const active = isSameLink(url, pageUrl); menu[name] = { url, active }; }); } const links = {}; if (navbar && navbar.links) { Object.keys(navbar.links).forEach(name => { const link = navbar.links[name]; links[name] = { url: url_for(typeof link === 'string' ? link : link.url), icon: link.icon }; }); } return { logo, logoUrl: url_for(logo),+ logoDark,+ logoDarkUrl: url_for(logoDark), siteUrl: url_for('/'), siteTitle: title, menu, links, showToc, tocTitle: _p('widget.catalogue', Infinity), showSearch: search && search.type, searchTitle: __('search.search') };}); 2.增加脚页logo深色图标打开themes\\icarus\\layout\\common\\footer.jsx 增减以下代码 themes\\icarus\\layout\\common\\footer.jsx >folded12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364class Footer extends Component { render() { const { logo, logoUrl,+ logoDark,+ logoDarkUrl, siteUrl, siteTitle, siteYear, author, links, showVisitorCounter, visitorCounterTitle } = this.props; let footerLogo = ''; if (logo) { if (logo.text) { footerLogo = logo.text; } else {- footerLogo = <img src={logoUrl} alt={siteTitle} height="28" />;+ footerLogo = [+ <img class="logo-img" src={logoUrl} alt={siteTitle} height="28" />,+ <img class="logo-img-dark" src={logoDarkUrl} alt={siteTitle} height="28" />+ ]; } } else { footerLogo = siteTitle; }...module.exports = cacheComponent(Footer, 'common.footer', props => { const { config, helper } = props; const { url_for, _p, date } = helper;- const { logo, title, author, footer, plugins } = config;+ const { logo, logoDark, title, author, footer, plugins } = config; const links = {}; if (footer && footer.links) { Object.keys(footer.links).forEach(name => { const link = footer.links[name]; links[name] = { url: url_for(typeof link === 'string' ? link : link.url), icon: link.icon }; }); } return { logo, logoUrl: url_for(logo),+ logoDark,+ logoDarkUrl: url_for(logoDark), siteUrl: url_for('/'), siteTitle: title, siteYear: date(new Date(), 'YYYY'), author, links, showVisitorCounter: plugins && plugins.busuanzi === true, visitorCounterTitle: _p('plugin.visitor_count', '<span id="busuanzi_value_site_uv">0</span>') };}); 3.增加css代码打开themes\\icarus\\source\\css\\night.styl 增加以下代码 themes\\icarus\\source\\css\\night.styl >folded123456789101112131415.night .content code color: rgb(203,186,125) #night-nav #night-icon:before content: '\\f186'+ // logo+ .navbar-logo,+ .footer-logo+ .logo-img+ display: none+ .logo-img-dark+ display: inline-block 4.增加深色模式的logo图标制作一个深色模式显示的logo图标,存放在themes\\icarus\\source\\img\\ 命名为 logo-dark.png。5.修改配置文件打开_config.icarus.yml配置文件,增加以下代码。 _config.icarus.yml >folded1234567# Version of the configuration fileversion: 5.0.0# Icarus theme variant, can be "default" or "cyberpunk"variant: default# Path or URL to the website's logologo: /img/logo.png+logoDark: /img/logo-dark.png 提示在复制以上代码时 切忌 删除代码前的"+"深色模式覆盖不完全 未经严谨的筛查 如有遗漏 可以留言或自行检查 文章分享按钮在_config.icarus.yml找到 share 进行配置。可以参考Icarus提供的文档 123456# Share plugin configurations# 分享按钮share: type: sharethis # URL to the ShareThis share plugin script install_url: '' 修改在手机页面宽度打开themes\\icarus\\include\\style\\responsive.styl 修改padding的值 themes\\icarus\\include\\style\\responsive.styl123+mobile() .section padding: 0.5rem 0.1rem 在手机页面隐藏小部件打开themes\\icarus\\include\\style\\responsive.styl 在+mobile()增加一下代码 themes\\icarus\\include\\style\\responsive.styl12345 +mobile() .section padding: 0.5rem 0.1rem+ .order-1 .card.widget+ display: none 修改Icarus主题字体 打开themes\\icarus\\include\\style\\base.styl 修改$family-sans-serif 的值 默认值(Ubuntu, Roboto, 'Open Sans', 'Microsoft YaHei', sans-serif) 修改为(-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji") 修改code背景颜色 打开themes\\icarus\\include\\style\\article.styl 找到.article .code 添加background-color: #f5f5f5themes\\icarus\\include\\style\\article.styl123&.article code background-color: #f5f5f5 给文章增加 原创/转载 标签 给每篇文章加上 原创/转载 的标签 找到themes\\icarus\\layout\\common\\article.jsx增删以下代码 themes\\icarus\\layout\\common\\article.jsx >folded1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 const moment = require('moment'); const { Component, Fragment } = require('inferno'); const Share = require('./share'); const Donates = require('./donates'); const Comment = require('./comment'); const ArticleLicensing = require('hexo-component-inferno/lib/view/misc/article_licensing');+ const CopyRight = require('./copyright');.../* 省略代码 */ render() { const { config, helper, page, index } = this.props; const { article, plugins } = config;- const { url_for, date, date_xml, __, _p } = helper;+ const { url_for, date, date_xml, __, _p, is_post } = helper; const indexLaunguage = config.language || 'en'; const language = page.lang || page.language || config.language || 'en'; const cover = page.cover ? url_for(page.cover) : null; const updateTime = article && article.update_time !== undefined ? article.update_time : true; const isUpdated = page.updated && !moment(page.date).isSame(moment(page.updated)); const shouldShowUpdated = page.updated && ((updateTime === 'auto' && isUpdated) || updateTime === true);+ const copy = page.copy_from ? url_for(page.copy_from) : null;.../* 省略代码 */+ {/* 原创or转载 */}+ <span class={`level-item copyright article-title type-${copy ? '1' : '2'}`}>{copy ? '转载' : '原创'}</span> {/* Creation Date */} {page.date && <span class="level-item" dangerouslySetInnerHTML={{ __html: _p('article.created_at', `<time dateTime="${date_xml(page.date)}" title="${new Date(page.date).toLocaleString()}">${date(page.date)}</time>`) }}></span>}.../* 省略代码 */ {/* Title */} {page.title !== '' ? <h1 class="title is-3 is-size-4-mobile"> {index ? <a class="link-muted" href={url_for(page.link || page.path)}>{page.title}</a> : page.title} </h1> : null}+ { /* 版权声明 */}+ {is_post() ? <CopyRight config={config} page={page} helper={helper} /> : null} 新建themes\\icarus\\layout\\common\\copyright.jsx文件 输入以下代码 themes\\icarus\\layout\\common\\copyright.jsx >folded12345678910111213141516171819const { Component } = require('inferno');module.exports = class extends Component { render() { const { page, config } = this.props; const { article } = config; const isCopy = page.copy_from // 是否为转载的文章 const url = isCopy ? page.copy_from : page.permalink // 来源链接地址 if (article.copyright == 'false') { return null; } return <div class={'copyright article-block ' + (isCopy ? 'type-1' : 'type-2') }> { !isCopy ? <p>版权申明:本文为原创文章,转载请注明原文出处</p> : null } <p>原文链接:<a href={ url } target="_blank">{ url }</a></p> </div>; }}; 新建themes\\icarus\\include\\style\\copyright.styl文件 输入以下代码 themes\\icarus\\include\\style\\copyright.styl >folded123456789101112131415161718192021222324252627282930$copyright-color-1 ?= #74cf59$copyright-color-2 ?= #ca0c16$copyright-background-color-1 ?= #eaf9e3$copyright-background-color-2 ?= #f9ecec.copyright &.article-title padding: 2px 5px border-radius: 3px &.type-1 color: $copyright-color-1 background-color: $copyright-background-color-1 &.type-2 color: $copyright-color-2 background-color: $copyright-background-color-2 &.article-block padding: 0.4em 0.8em margin-bottom: 1em border-radius: 0.3rem border-left: 5px solid #ca0c16 P word-wrap: break-word word-break: break-all overflow: hidden &.type-1 border-left: 5px solid $copyright-color-1 background-color: $copyright-background-color-1 &.type-2 border-left: 5px solid $copyright-color-2 background-color: $copyright-background-color-2 引用styl文件 打开themes\\icarus\\source\\css\\style.styl 追加以下代码 themes\\icarus\\source\\css\\style.styl >folded1234...@import '../../include/style/copyright' 添加好以上代码后 现在介绍如何使用在每篇的文章markdown文件的头 指定copy_from项的连接 即为转载文章 如果不指定copy_from则表示原创文章 # 转载文章 不指定则是原创文章 copy_from: https://blog.pp6f.com/ 修改busuanzi显示uv和pv 增加显示PV 编辑themes\\icarus\\layout\\common\\footer.jsx 修改以下代码themes\\icarus\\layout\\common\\footer.jsx12- visitorCounterTitle: _p('plugin.visitor_count', '<span id="busuanzi_value_site_uv">0</span>')+ visitorCounterTitle: _p('plugin.visitor_count', '<span id="busuanzi_value_site_uv">0</span>') + _p('plugin.visit_count', ', <span id="busuanzi_value_site_pv">0</span>') 编辑themes\\icarus\\layout\\common\\scripts.jsx 增添以下代码themes\\icarus\\layout\\common\\scripts.jsx >folded12345678910111213141516171819202122232425262728293031+ // busuanzi+ const busuanzi_init = `if (${config.plugins.busuanzi} == true) {+ $(document).ready(function () {+ var int = setInterval(fixCount, 100);+ var uvOffSet = parseInt(${config.busuanzi.site_uv_offset | 0});+ var pvOffSet = parseInt(${config.busuanzi.site_pv_offset | 0});+ + function fixCount() {+ var realUv = parseInt($("#busuanzi_value_site_uv").html())+ var realPv = parseInt($("#busuanzi_value_site_pv").html())+ if ($("#busuanzi_container_site_uv").css("display") != "none" && realUv > 0) {+ clearInterval(int);+ $("#busuanzi_value_site_uv").html(realUv + uvOffSet);+ $("#busuanzi_value_site_pv").html(realPv + pvOffSet);+ }+ }+ });+ }`; return <Fragment> <script src={cdn('jquery', '3.3.1', 'dist/jquery.min.js')}></script> <script src={cdn('moment', '2.22.2', 'min/moment-with-locales.min.js')}></script> {clipboard && <script src={cdn('clipboard', '2.0.4', 'dist/clipboard.min.js')} defer></script>} <script dangerouslySetInnerHTML={{ __html: `moment.locale("${language}");` }}></script> <script dangerouslySetInnerHTML={{ __html: embeddedConfig }}></script> <script src={url_for('/js/column.js')}></script> <Plugins site={site} config={config} page={page} helper={helper} head={false} /> <script src={url_for('/js/main.js')} defer></script> <script src={url_for( '/js/night.js' )} defer={ true }></script>+ <script dangerouslySetInnerHTML={{ __html: busuanzi_init }}></script> {/* busuanzi */} </Fragment>; 打开博客根目录的_config.yml 添加以下代码_config.yml123busuanzi: site_uv_offset: 100 # 初始uv值 site_pv_offset: 200 # 初始pv值","link":"/2022/02/09/Hexo/config_Icarus_theme/"},{"title":"Icarus主题使用及问题","text":"Icarus是静态网站生成器Hexo中一个主题,这里记录了Icarus主题的一些使用及遇到的问题! 索引 索引 ## icarus安装 ## icarus配置文件 ## icarus常见问题 依赖问题 highlight使用暗色主题的问题 更多常见问题 Icarus的Github仓库Icarus的Dome网址 icarus安装 首先通过Git Bash命令行,进入Hexo的博客文件夹,准备开始安装!Icarus官方的安装指南 安装克隆通过Git Bash命令行 安装克隆主题文件Git Bash/命令行1$ git clone https://github.com/ppoffice/hexo-theme-icarus.git themes/icarus --depth 1 也可以通过npm方式安装,但主题文件会下载到node_modules文件夹内,而不会下载到theme文件夹。所以不建议使用这种方式。Git Bash/命令行1$ npm install -S hexo-theme-icarus 配置修改 _config.yml 配置文件_config.yml12language: zh-CNtheme: icarus 也可以使用命令行 修改 _config.yml 配置文件 但不建议使用 因为hexo会自动清除配置文件的备注Git Bash/命令行1$ hexo config theme icarus 清除缓存配置好后 运行清除缓存命令。后面加-debug查看清除日志。 安装好后目录下是没有`_config.icarus.yml`配置文件的。当执行`hexo clean`命令后会自动生成。 如果有报错,按提示,安装相关依赖。参考 《icarus常见问题 - 依赖问题》 Git Bash/命令行1$ hexo clean -debug 运行最后,使用如下命令运行hexo。Git Bash/命令行1$ hexo serve icarus配置文件 本章介绍如何使用_config.icarus.yml来配置主题。这里不会介绍全部指南,只会介绍需要特殊配置的地方。如果需要更多的指南可以参考 官方的主题配置指南。 _config.icarus.yml在Hexo创建的博客文件夹内找到_config.icarus.yml文件。 icarus常见问题 依赖问题 运行hexo clean出现以下错误Git Bash/命令行12345678910111213141516171819INFO ======================================= ██╗ ██████╗ █████╗ ██████╗ ██╗ ██╗███████╗ ██║██╔════╝██╔══██╗██╔══██╗██║ ██║██╔════╝ ██║██║ ███████║██████╔╝██║ ██║███████╗ ██║██║ ██╔══██║██╔══██╗██║ ██║╚════██║ ██║╚██████╗██║ ██║██║ ██║╚██████╔╝███████║ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝=============================================INFO === Checking package dependencies ===ERROR Package bulma-stylus is not installed.ERROR Package hexo-pagination's version (1.0.0) does not satisfy the required version (^2.0.0).ERROR Package hexo-renderer-inferno is not installed.ERROR Package hexo-component-inferno is not installed.ERROR Package inferno is not installed.ERROR Package inferno-create-element is not installed.ERROR Please install the missing dependencies your Hexo site root directory:ERROR npm install --save bulma-stylus@0.8.0 hexo-pagination@^2.0.0 hexo-renderer-inferno@^0.1.3 hexo-component-inferno@^1.0.2 inferno@^7.3.3 inferno-create-element@^7.3.3ERROR or:ERROR yarn add bulma-stylus@0.8.0 hexo-pagination@^2.0.0 hexo-renderer-inferno@^0.1.3 hexo-component-inferno@^1.0.2 inferno@^7.3.3 inferno-create-element@^7.3.3 这个问题是缺少相关的依赖插件,按给出的提示安装相关插件,就可以解决 Git Bash/命令行1npm install --save bulma-stylus@0.8.0 hexo-pagination@^2.0.0 hexo-renderer-inferno@^0.1.3 hexo-component-inferno@^1.0.2 inferno@^7.3.3 inferno-create-element@^7.3.3 出现上面的问题,通常是使用克隆的方式(git clone https://xx...)安装的icarus。如果使用的是命令行npm方式安装的(npm install -S hexo-theme-icarus),不会出现上面的错误!但在浏览器里还是无法渲染在hexo clean --debug清除日志里可以看到hexo-renderer-inferno是没有被加载的!也就是说在npm方式安装的icarus,在运行时不会报缺少的插件。显示运行成功但其实问题一直存在,因为缺少所依赖的插件。我的建议,通过克隆方式安装。将icarus克隆的theme文件夹内!还有就是npm方式安装,会把icarus安装在node_modules文件夹内。这个有点别扭!此问题的解决得益于icarus的作者的回帖 帖子链接 还有另一位网友文章:链接 highlight使用暗色主题的问题 条件_config.yml中开启highlight,hljs=false_config.icarus.yml中的highlight主题使用暗色 问题部分代码出现于背景颜色过于接近 可读性变差 解决打开icarus/include/style/codeblock.stly文件,找到.title 添加一行icarus/include/style/codeblock.stly12.tag, .title, .number, .section color: inherit 提示如果打开hljs=true 代码块高亮显示正常 但会出现行号与代码高度不一致 以后有待解决 更多常见问题 更多常见问题可以去Icrus官方文档","link":"/2022/02/07/Hexo/icarus_theme_FAQ/"},{"title":"Linux","text":"~ 索引 索引 Linux 相关网站 相关系统 安全增强型linux Ubuntu apt 与 apt-get 命令 用于更新软件 运行AppImage文件 关闭Ubuntu20 桌面动画 提升流畅性 CentOS 相关网站 配置 开启SSH 配置网卡IP地址 添加开机启动 yum 软件安装工具 添加包签名到信任密钥列表 CentOS 7安装Gnome GUI 图形界面 htop 进程管理查看工具 常用命令 sudo systemctl 命令行/图形界面 切换 切换界面 ip addr 获取网卡信息 echo ln 创建软链接命令 rm 删除文件/文件夹 mkdir 创建文件夹 pwd 显示当前路径 cd 进入文件夹 ls/dir/ll 显示文件/文件夹列表 mv 移动文件 ps 查进程 kill 杀死进程 reboot 重启 poweroff 关机 sudo passwd 更改当前用户密码 top Linux系统状况 free -m 查看内存占用 df -h 查看硬盘占用率 whereis 搜索命令 nohup 后台运行程序 jobs 查看后台进程 chmod/chown/chgrp 修改文件/文件夹权限 用户/用户组管理 查看磁盘空间占用 常用工具 vi/vim文本编辑工具 curl 请求网页数据 wget 下载工具 netstat 查看活动连接 arp 获取局域网信息 tar 解压/压缩工具 Linux服务器流量带宽监控/统计 Linux C语言生成可执行文件 firewalld 防火墙 iptables 防火墙 lsof 查看端口 .sh bash脚本 Linux相关网站 菜鸟网络Linux页面 阿里镜像 Linux安装.net 相关系统 CentOS - CentOS 是一个基于Red Hat Linux 提供的可自由使用源代码的企业级Linux发行版本 Ubuntu - Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于Debian GNU/Linux,支持x86、amd64(即x64)和ppc架构,由全球化的专业开发团队(Canonical Ltd)打造 Debian - Debian 包含Linux操作系统和一些免费的软件分发。Debian是通过许多志愿者的工作来维持和更新的 等等… 安全增强型linux 介绍文章 查看当前哪种模式 $ getenforce 临时切换成许可模式 $ setforce 0 临时切换成强制模式 $ setforce 1 修改文件 永久关闭 vi /etc/selinux/config 修改项 SELINUX=disabled Ubuntu 官方网站下载页 阿里镜像ubuntu页面 apt 与 apt-get 命令 用于更新软件 目前在Ubuntu18.04以后,尽量使用apt,而不是apt-get。apt可以给出更多的建议安装等提示。 在root用户下, apt upgrade firefox 可以更新firefox软件 普通用户下,sudo apt upgrade firefox ,更新firefox软件。(sudo是以当前用户获得root临时权限) apt与apt-get的用法:(apt是新的命令,有一些操作不支持,apt-get是老命令,可以支持更多的操作) apt命令 apt-get命令 命令功能 apt install apt-get install 安装软件包 apt remove apt-get remove 移除软件包 apt autoremove apt-get autoremove 卸载软件包 apt purge apt-get purge 移除软件包及配置文件 apt update apt-get update 刷新存储库索引 apt upgrade apt-get upgrade 升级所有可升级的软件包 apt autoremove apt-get autoremove 自动删除不需要的包 apt full-upgrade apt-get dist-upgrade 在升级软件包时自动处理依赖关系 apt search apt-cache search 搜索应用程序 apt show apt-cache show 显示装细节 apt list 列出包含条件的包(已安装,可升级等) apt edit-sources 编辑源列表 运行AppImage文件 文件右键 - 属性 - 权限 - 允许作为程序运行 关闭Ubuntu20 桌面动画 提升流畅性 关闭动画命令 gsettings set org.gnome.desktop.interface enable-animations false 打开动画命令 gsettings set org.gnome.desktop.interface enable-animations true CentOS相关网站 官网下载页面 阿里云CentOS镜像 阿里云镜像centos7.9下载页 菜鸟教程CentOS安装页 配置开启SSH 参考ssh文章 配置网卡IP地址 要配置网卡IP 先获取网卡名字 使用ip addr获取网卡信息 类似下面的信息 ens33 就是网卡名字 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0a:23:25:d2:d1 brd ff:ff:ff:ff:ff:ff inet 192.168.1.2/24 brd 192.168.1.255 scope global noprefixroute dynamic ens33 valid_lft 35682sec preferred_lft 35682sec inet6 ba80::2aea:f3af:cddf:1232/64 scope link noprefixroute valid_lft forever preferred_lft forever 编辑ens33网卡配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 # 修改 BOOTPROTO="dhcp" ONBOOT="yes" 修改后这是 DHCP 模式 自动获取IP 配置静态IP地址 vi /etc/sysconfig/network-scripts/ifcfg-ens33 # 修改 bootproto=static onboot=yes # 在文件尾部追加 IPADDR=192.168.1.2 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=223.5.5.5 DNS2=8.8.8.8 修改后这是 静态 模式 重启网络服务 sudo systemctl restart network 结束! 添加开机启动 参考文章 yum 软件安装工具 yum - 软件包安装工具 更新软件包 yum update 安装软件 yum install <name> 卸载软件 yum uninstall <name> 查询已安装的软件 yum list #或 yum list <name> 查询所有软件库 yum search <name> 更新缓存yum源 yum clean all yum makecache 查看yum软件版本 yum repolist all | grep <name> 添加包签名到信任密钥列表 如: sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm CentOS 7安装Gnome GUI 图形界面 当你安装的centos是服务器版本的时候,系统默认是不会安装 CentOS 的图形界面程序的,比如:gnome或者kde, 那么如果你想在图形界面下工作的话,可以手动来安装CentOS Gnome GUI包。 在安装Gnome 包之前,我们需要先检查下安装源是否正常,因为我们要通过yum命令来安装gnome包,而yum命令式通过yum 源来下载安装包的。 在命令行下输入下面的命令来安装 Gnome 包 $ sudo yum groupinstall "GNOME Desktop" "Graphical Administration Tools" 更新系统的运行级别如果你想 在系统下次 启动的时候自动进入图形界面,那么我们需要更改系统的运行级别,输入下面的命令来启用图形界面。 $sudo ln -sf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target 重启系统 当系统再次启动的时候,就会默认进入图形界面。通过VNC登陆服务器 htop 进程管理查看工具 启用epel版本 htop工具在epel源中提供 启用epel版本命令 yum -y install epel-release yum 安装 htop yum -y install htop 运行htop htop htop常用按键 12345678910111213141516171819202122232425262728F1 : 查看htop使用说明F2 : 设置F3 : 搜索进程F4 : 过滤器,按关键字搜索F5 : 显示树形结构F6 : 选择排序方式F7 : 减少nice值,这样就可以提高对应进程的优先级F8 : 增加nice值,这样可以降低对应进程的优先级F9 : 杀掉选中的进程F10 : 退出htop/ : 搜索字符h : 显示帮助l :显示进程打开的文件: 如果安装了lsof,按此键可以显示进程所打开的文件u :显示所有用户,并可以选择某一特定用户的进程s : 将调用strace追踪进程的系统调用t : 显示树形结构H :显示/隐藏用户线程I :倒转排序顺序K :显示/隐藏内核线程M :按内存占用排序P :按CPU排序T :按运行时间排序上下键或PgUP, PgDn : 移动选中进程左右键或Home, End : 移动列表 Space(空格) : 标记/取消标记一个进程。命令可以作用于多个进程,例如 "kill",将应用于所有已标记的进程 相关文章 使用详解 安装 常用命令 菜鸟教程Linux页面 sudo 在命令前加入sudo 以root权限执行命令 进入root用户权限 sudo -i sudo su root systemctl 服务命令 在 /etc/systemd/system/ 或 /usr/lib/systemd/system/ 目录内创建testapp.service服务文件 内容 命令 //设置开机启动 sudo systemctl enable NAME.service //关闭开机启动 sudo systemctl disable NAME.service //启动服务 sudo systemctl start NAME.service //重启服务 sudo systemctl restart NAME.service //停止服务 sudo systemctl stop NAME.service //查询状态 sudo systemctl status NAME.service //修改service文件后 执行重载命令 systemctl daemon-reload 命令行/图形界面 切换 获取当前的默认target systemctl get-default 设置开机默认进入命令行 # 输入命令: sudo systemctl set-default multi-user.target # 重启: reboot 设置开机默认进入图形界面 # 输入命令: sudo systemctl set-default graphical.target # 重启: reboot Linux系统7个运行级别 0:关机,停机模式、 1:单用户模式、 2:多用户模式、 3:完整的多用户文本模式、 4:系统未使用,保留一般不用、 5:图形化模式、 6:重启模式 运行级就是操作系统当前正在运行的功能级别。这个级别从0到6 ,具有不同的功能。 具体说明:图形化模式,登陆后进入图形GUI模式或GNOME、KDE图形化界面,如X Window系统。命令行输入 # GUI模式 ln -sf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target # 命令行模式 ln -sf /lib/systemd/system/runlevel3.target /etc/systemd/system/default.target # 重启 reboot 切换界面 按键盘的 Control + Alt + {F1 - F7} ip addr 获取网卡信息 ip addr echo 输出到命令行窗口 $ echo 'abc\\n' //或 使用 -e 使用转义符 $ echo -e 'abc\\n' 输出到文件 // 修改覆盖文件内容 $ echo 'abc' > a.txt // 追加文件内容 原内容会保留 $ echo 'abc' >> a.txt ln 创建软链接命令 创建软连接 $ ln -s 程序路径包括程序文件名 /usr/bin/自定义程序名 # 例 $ ln -s /usr/local/bin/python3.6 /usr/bin/python3 # 设置后 可以在任意文件夹位置 执行python3 rm 删除文件/文件夹 rm命令-r 向下递归所有文件夹即文件 一并删除-f 就是直接强行删除,不作任何提示的意思。 # 强制删除文件/文件夹/路径下的所有文件 rm -rf <文件/文件夹名/路径> mkdir 创建文件夹 mkdir命令 mkdir <文件夹名> pwd 显示当前路径 pwd 命令 pwd cd 进入文件夹 进入当前路径下的abc文件夹 cd abc 进入绝对路径 cd /usr/bin # 进入用户文件夹 cd ~/ ls/dir/ll 显示文件/文件夹列表 显示当前路径列表 ls # 显示所有文件/文件夹 包括隐藏文件 ls -al 显示指定路径列表 ls /root # 显示root路径是否存在以a开头的文件/文件夹 ls /root/a* 帮助信息 ls --help mv 移动文件 移动文件 mv oldpath newpath 重命名 mv oldfilename newfilename ps 查进程 命令 ps 命令查找与进程相关的PID号: ps a 显示现行终端机下的所有程序,包括其他用户的程序。 ps -A 显示所有程序。 ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。 ps -e 此参数的效果和指定"A"参数相同。 ps e 列出程序时,显示每个程序所使用的环境变量。 ps f 用ASCII字符显示树状结构,表达程序间的相互关系。 ps -H 显示树状结构,表示程序间的相互关系。 ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。 ps s 采用程序信号的格式显示程序状况。 ps S 列出程序时,包括已中断的子程序资料。 ps -t <终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况。 ps u 以用户为主的格式来显示程序状况。 ps x 显示所有程序,不以终端机来区分。 常用命令 ps aux # 使用grep管道 查找指定程序名 ps aux | grep <程序名> # 查看所有进程 ps -ef kill 杀死进程 杀死指定PID号进程 可以用ps命令查找PID号 kill -9 333 杀死指定名的进程 kill -9 <NAME> reboot 重启 reboot poweroff 关机 poweroff sudo passwd 更改当前用户密码 sudo passwd top Linux系统状况 监控Linux系统状况 CPU 内存 查看内存使用说明 (shift+m 按照排名) 按 Q 退出 类似任务管理器 参考菜鸟教程 top free -m 查看内存占用 free -m df -h 查看硬盘占用率 df -h whereis 搜索命令 搜索包含python的路径名 whereis python nohup 后台运行程序 设置进程为后台进程 运行程序前面加 nohup 表示不挂断的运行命令 在运行程序后面加入 & 表示这个命令放在后台执行 # 使 dotnet CoreWebDemo.dll 在后台运行 即便关闭远程连接一样可以运行 nohup dotnet CoreWebDemo.dll & jobs 查看后台进程 查看后台进程 可以通过kill -9 进程ID 来结束进程 jobs -l chmod/chown/chgrp 修改文件/文件夹权限 chmod 命令 修改文件权限 # 增加写入权限 chmod u+w 文件名 # 去除写入权限 chmod u-w 文件名 # 直接修改权限 777 表示所有权限 chmod 777 文件名 chown 命令 修改文件所有者 # 将 /u 的属主更改为"root"。 chown root /u # 和上面类似,但同时也将其属组更改为"staff"。 chown root:staff /u # 将 /u 及其子目录下所有文件的属主更改为"root"。 chown -hR root /u # 将 /u 目录下所有文件和子目录的属主改为root chown -R root /u chgrp 命令 修改文件用户组 # 将 /u 的属组更改为"staff"。 chgrp staff /u # 将 /u 及其子目录下所有文件的属组更改为"staff"。 chgrp -hR staff /u # 如果要修改该目录下所有文件和目录,使用-R参数。 chgrp -R staff /u 用户/用户组管理 创建/删除用户 # 建立新用户账号 useradd # 删除用户 userdel 修改账户 # 设置用户密码 passwd user1 # 修改账户 usermod # 将用户 user1的登录名改为 u1 usermod –l u1 user1 # 将用户 user1 加入到 users组中, usermod –g users user1 # 将用户 user1 目录改为/users/us1 usermod –d /users/us1 user1 查看用户 # 查看当前用户 w who users # 查看系统中所有用户 grep bash /etc/passwd # 或 cat /etc/passwd | cut -f 1 -d: 查看磁盘空间占用 磁盘空间占用情况 命令 df -hl 查看指定目录空间占用情况 命令 du -hl --max-depth=1 /root 查看当前目录空间占用情况 命令 du -hl 常用工具vi/vim文本编辑工具 编辑文件 $ vim a.txt $ vi a.txt 进入文件后 按键盘 I 进入编辑模式 按 esc 退出编辑模式进入命令模式 命令模式: shift+g - 光标直接跳转到最后一行 shift+a - 光标跳转到本行末尾 并进入编辑模式 shift+z+z - 保存退出 I - 进入编辑模式 ESC - 退出编辑模式/进入命令模式 :w - 保存 :wq - 保存退出 :wq! - 强制保存退出 :q! - 强制退出不保存 curl 请求网页数据 参考文章 访问网页保存到文件 $ curl -o filename.txt http://192.168.1.1/1.txt 发送POST请求的数据体 $ curl -d'login=aaa&password=111'-X POST http://192.168.1.1/login # 或 $ curl -d 'login=aaa' -d 'password=111' -X POST http://192.168.1.1/login # 读取本地文件发送 $ curl -d '@data.txt' http://192.168.1.1/login 发送GET请求 $ curl -G -d 'login=aaa&password=111' http://192.168.1.1/login wget 下载工具 命令 wget http://1.1.1.1/abc.tar 会下载到当前文件夹 还可以用来测试网速 找一个大文件直接下载 netstat 查看活动连接 # centos7 默认没有netstat命令 需要安装 net-tools yum install -y net-tools netstat # 查看监听(Listen)的端口 netstat -lntp # 查看所有运行中的服务的详细信息 netstat -tulpn # 查看端口被占用情况 netstat -tunlp|grep 端口号 # 查看所有建立的TCP连接 netstat -antp # 查看所有端口占用情况 netstat -antp | grep : # 查看80端口被哪个服务占用 或 netstat -antpuel | grep ":22" | grep -v grep(过虑grep本身) netstat -antp | grep :80 arp 获取局域网信息 ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系 arp -a arp tar 解压/压缩工具 打包成tar.gz压缩包 # tar -zcvf renwolesshel.tar.gz /renwolesshel 解压tar.gz压缩包 # tar zxvf renwolesshel.tar.gz 打包成tar.bz2格式压缩包 # tar -jcvf renwolesshel.tar.bz2 /renwolesshel 解压tar.bz2格式的压缩包 # tar jxvf renwolesshel.tar.bz2 压缩成zip格式 # zip -q -r renwolesshel.zip renwolesshel/ 解压zip格式的压缩包 # unzip renwolesshel.zip Linux服务器流量带宽监控/统计 参考文章 (未经测试) Linux C语言生成可执行文件 参考文章 firewalld 防火墙 查看防火墙状态 sudo systemctl status firewalld 看到active(running)就意味着防火墙打开了 启动防火墙 sudo systemctl start firewalld 重启防火墙 sudo systemctl restart firewalld 临时关闭防火墙 sudo systemctl stop firewalld 开机启动防火墙 sudo systemctl enable firewalld 开机不启动防火墙 sudo systemctl disable firewalld 查看防火墙规则 firewall-cmd --list-all 查看防火墙所有开放的端口 firewall-cmd --zone=public --list-ports 用户配置目录 /etc/firewalld/ 添加自定义端口 firewall-cmd --permanent --add-port=9999/tcp firewall-cmd --permanent --add-port=9999/udp –permanent //设置为持久 –add-port //标识添加的端口 还可以增加Zone命令 区概念 //开放端口 firewall-cmd --zone=public --permanent --add-port=9999/tcp firewall-cmd --zone=dmz --permanent --add-port=9999/tcp //关闭端口 firewall-cmd --zone=public --permanent --remove-port=5672/tcp iptables 防火墙 查看规则列表 iptables -L -x -n 放行端口 iptables -I INPUT -p tcp --dport 80 -j ACCEPT 保存规则 使用保存规则前 必须关闭firewalld 和 安装 iptables-services systemctl disable firewalld //关闭防火墙 yum install iptables-services //安装iptables-services systemctl enable iptables //启用iptables-services service iptables save //保存规则 lsof 查看端口 # 查看端口被占用情况 lsof -i:端口号 .sh bash脚本 参考维基百科的bash页面 文件头加入 # 表示该程序由/bin/bash来解释运行 #!/bin/bash 打印命令 echo -e "\\n测试脚本\\n" 打印带颜色的字符 red='\\e[91m' none='\\e[0m' _red() { echo -e ${red}$*${none}; } echo -e "${red}这是红色${none}" 读取命令行输入 read -r $ 表示后面的字符是变量 a=1 echo -e $a # 输出的是 1 echo -e a # 输出的是 a 退出命令 exit 1 判断 # 判断yum是否已安装 if [[ $(command -v yum) ]]; then echo -e "已安装yum" else echo -e "未安装yum" fi # 判断变量的值 a=1 if ((a == 1));then ((a = a + 1)) echo -e $a else echo -e "a != 1" fi # 正则表达式 判断是否为数字 a=586445612533425 if [[ $a =~ (^)([0-9]+)($) ]] then echo -e "数字" else echo -e "非数字" fi case a=3 case $a in '1') echo -e "是1" ;; '2') echo -e "是2" ;; *) echo -e "都不是" ;; esac 变量 a = 1 # 使用事 a 前面加 $ 例如这也 $a 变量名 含义 $0 shell或shell脚本的名字 $* 以一对双引号给出参数列表 $@ 将各个参数分别加双引号返回 $# 参数的个数 $_ 代表上一个命令的最后一个参数 $$ 代表所在命令的PID $! 代表最后执行的后台命令的PID $? 获取上一个命令执行后的退出状态 echo $? 返回0执行成功 非0值执行失败 $abc abc是变量名 引用变量 转义符 转义字符 扩展成... \\a 响铃符 \\b 退格符 \\e ANSI转义符,等价于\\033 \\f 馈页符 \\n 换行符 \\r 回车符 \\t 水平制表符 \\v 垂直制表符 \\\\ 反斜杠 \\' 单引号 \\nnn 十进制值为nnn的8-bit字符(1-3位) \\xHH 十六进制值为HH的8-bit字符(1或2位) \\cx control-X字符 创建一个暂存文件 或 目录供shell script使用 # 创建一个暂存目录 path="$(mktemp -d)" echo $path # 创建一个暂存文件 tmpfile="$(mktemp -t)" echo $tmpfile","link":"/2022/03/10/System/Linux/"},{"title":"OpenWRT 路由系统","text":"~ 索引 索引 Openwrt 下载Openwrt 下载 转vmdk格式 安装Openwrt Vmware安装Openwrt 配置 使用 设置中文界面 opkg软件包管理器 禁用IPv6 Openwrt Openwrt是基于Linux的嵌入式软路由系统 官网地址 下载Openwrt下载 打开官网下载页面 找到 generic-ext4-combined-efi.img.gz 点击下载 解压后是img文件 如果在虚拟机中安装需要转换为vmdk格式 转vmdk格式 在Ubuntu系统使用qemu-utils工具进行转换 安装qemu-utilsd $ sudo apt-get install qemu-utils -y 转换命令 $ sudo qemu-img convert -f raw filename.img -O vmdk filename.vmdk 转换后得到vmdk文件 安装OpenwrtVmware安装Openwrt 创建新的虚拟机 选择Linux64 内核 名字随意 硬盘选择刚刚转换的vmdk文件 都选好直接启动就可以了 配置 配置网络 $ vi /etc/config/network config interface 'loopback' option device 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config globals 'globals' option ula_prefix 'fd04:665c:1159::/48' config device option name 'br-lan' option type 'bridge' list ports 'eth0' config interface 'lan' option device 'br-lan' option proto 'static' option ipaddr '192.168.0.8' //openwrt的IP地址 option netmask '255.255.255.0' option ip6assign '60' option gateway '192.168.0.1' //网关 填写路由器地址 list dns '223.5.5.5' list dns '223.6.6.6' list dns '8.8.8.8' 修改好后 按esc 输入:wq 保存 配置好网络 就可以在浏览器中通过 http://192.168.0.8 打开web界面了 使用设置中文界面 打开web页面后 进入 System - Software 点击 Update lists... 更新列表 更新完后 在 Filter 中输入 zh-cn 在下面列表中找到 luci-i18n-base-zh-cn 点击后面的 install... opkg软件包管理器 更新软件包 $ opkg update 禁用IPv6 进入web页面 依次进入 (网络 - 接口 - LAN - 修改/配置 - IPv6分配长度 - 修改为禁用 - 保存&应用) 依次进入 (网络 - 接口 - WAN6(外网网卡) - 修改/配置 - 高级设置 - 获取IPv6地址(如果没有就修改强制链路下面一个选项就是) - 修改为禁用 - 保存&应用)","link":"/2022/03/16/System/openwrt/"},{"title":"Windows","text":"~ 索引 索引 系统下载 取消默认打开方式 Win10 彻底关闭windows安全中心 系统下载 msdn.itellyou.cn 取消默认打开方式 打开注册表 regedit 在 HKEY_CLASSES_ROOT 目录 在里面找到相对应的后缀名 删除 在 HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts 目录里 找到后缀名 删除 2项都删除后 即可取消默认打开方式 Win10 彻底关闭windows安全中心 关闭 “实时保护” 和 “篡改保护”设置 > 更新和安全 > Windows安全中心 > 病毒和威胁防护 > 管理设置 > 关闭 实时保护 篡改防护 修改组策略运行 - gpedit.msc依次点击 计算机配置 > 管理模版 > Windows组件 > Windows Defender 防病毒程序右边找到 关闭 Windows Defender 防病毒程序 打开后 选择 已启用 点击确定 至此Windows安全中心 已彻底关闭","link":"/2022/03/20/System/windows/"},{"title":"SSH","text":"SSH(Secure Shell )是一种安全通道协议,主要用来实现字符界面的远程的登录、远程复制等功能。 SSH协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。因此SSH协议具有很好的安全性。 索引 索引 Server SSH配置 服务端使用的工具 SSH服务开启 状态查询 SSH配置 sshd支持两种连接方式 密钥 生成密钥对 配置服务器密钥 Client SSH配置 客户端使用的程序 客户端远程登录命令 ssh登录服务器 scp拷贝文件到服务器 sftp 问题错误 连接服务器时的错误信息 1 连接服务器时的错误信息 2 连接服务器时的错误信息 3 Server SSH配置 参考文章服务端使用的工具 OpenSSH OpenSSH 是实现 SSH 协议的开源软件项目,适用于各种 UNIX、Linux 操作系统。 CentOS7 系统默认已安装 OpenSSH 相关软件包,并已将 sshd 服务添加为开机自启动。 SSH服务开启 状态查询 开启 sudo systemctl start sshd 状态查询 sudo systemctl status sshd SSH配置 sshd 默认端口号为 22 /etc/ssh/sshd_config 针对服务端的配置文件 1vi /etc/ssh/sshd_config 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142# $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $# This is the sshd server system-wide configuration file. See# sshd_config(5) for more information.# This sshd was compiled with PATH=/usr/local/bin:/usr/bin# The strategy used for options in the default sshd_config shipped with# OpenSSH is to specify options with their default value where# possible, but leave them commented. Uncommented options override the# default value.# If you want to change the port on a SELinux system, you have to tell# SELinux about this change.# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER##Port 22 # 监听端口#AddressFamily any#ListenAddress 0.0.0.0 # 指定监听地址 0.0.0.0表示监听所有地址#ListenAddress ::HostKey /etc/ssh/ssh_host_rsa_key#HostKey /etc/ssh/ssh_host_dsa_keyHostKey /etc/ssh/ssh_host_ecdsa_keyHostKey /etc/ssh/ssh_host_ed25519_key# Ciphers and keying#RekeyLimit default none# Logging#SyslogFacility AUTHSyslogFacility AUTHPRIV#LogLevel INFO# Authentication:#LoginGraceTime 2m # 登录验证事件为2分钟#PermitRootLogin yes # 允许root用户登录#StrictModes yes#MaxAuthTries 6 # 重试最大次数为6#MaxSessions 10#PubkeyAuthentication yes # 启用密钥对验证# RSAAuthentication yes # RSA认证 非必须 不存在不添加此项# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2# but this is overridden so installations will only check .ssh/authorized_keysAuthorizedKeysFile .ssh/authorized_keys # 指定公钥库文件#AuthorizedPrincipalsFile none#AuthorizedKeysCommand none#AuthorizedKeysCommandUser nobody# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts#HostbasedAuthentication no# Change to yes if you don't trust ~/.ssh/known_hosts for# HostbasedAuthentication#IgnoreUserKnownHosts no# Don't read the user's ~/.rhosts and ~/.shosts files#IgnoreRhosts yes# To disable tunneled clear text passwords, change to no here!#PasswordAuthentication yes # 启用密码验证#PermitEmptyPasswords no # 是否允许空密码登录PasswordAuthentication yes# Change to no to disable s/key passwords#ChallengeResponseAuthentication yesChallengeResponseAuthentication no# Kerberos options#KerberosAuthentication no#KerberosOrLocalPasswd yes#KerberosTicketCleanup yes#KerberosGetAFSToken no#KerberosUseKuserok yes# GSSAPI optionsGSSAPIAuthentication yesGSSAPICleanupCredentials no#GSSAPIStrictAcceptorCheck yes#GSSAPIKeyExchange no#GSSAPIEnablek5users no# Set this to 'yes' to enable PAM authentication, account processing,# and session processing. If this is enabled, PAM authentication will# be allowed through the ChallengeResponseAuthentication and# PasswordAuthentication. Depending on your PAM configuration,# PAM authentication via ChallengeResponseAuthentication may bypass# the setting of "PermitRootLogin without-password".# If you just want the PAM account and session checks to run without# PAM authentication, then enable this but set PasswordAuthentication# and ChallengeResponseAuthentication to 'no'.# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several# problems.UsePAM yes#AllowAgentForwarding yes#AllowTcpForwarding yes#GatewayPorts noX11Forwarding yes#X11DisplayOffset 10#X11UseLocalhost yes#PermitTTY yes#PrintMotd yes#PrintLastLog yes#TCPKeepAlive yes#UseLogin no#UsePrivilegeSeparation sandbox#PermitUserEnvironment no#Compression delayed#ClientAliveInterval 0#ClientAliveCountMax 3#ShowPatchLevel no#UseDNS yes # 是否允许dns反向解析, 禁止可以提升反应速度#PidFile /var/run/sshd.pid#MaxStartups 10:30:100#PermitTunnel no#ChrootDirectory none#VersionAddendum none# no default banner path#Banner none# Accept locale-related environment variablesAcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGESAcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENTAcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGEAcceptEnv XMODIFIERS# override default of no subsystemsSubsystem sftp /usr/libexec/openssh/sftp-server# Example of overriding settings on a per-user basis#Match User anoncvs# X11Forwarding no# AllowTcpForwarding no# PermitTTY no# ForceCommand cvs server# AllowUsers root@192.168.1.1 test # 设置允许登录的用户 这里设置只允许test 和 root登录 而且root只允许在192.168.1.1访问# DenyUsers test2 # 禁止test2用户登录 /etc/ssh/ssh_config 针对客户端的配置文件 1vi /etc/ssh/ssh_config 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869# $OpenBSD: ssh_config,v 1.30 2016/02/20 23:06:23 sobrado Exp $# This is the ssh client system-wide configuration file. See# ssh_config(5) for more information. This file provides defaults for# users, and the values can be changed in per-user configuration files# or on the command line.# Configuration data is parsed as follows:# 1. command line options# 2. user-specific file# 3. system-wide file# Any configuration value is only changed the first time it is set.# Thus, host-specific definitions should be at the beginning of the# configuration file, and defaults at the end.# Site-wide defaults for some commonly used options. For a comprehensive# list of available options, their meanings and defaults, please see the# ssh_config(5) man page.# Host *# ForwardAgent no# ForwardX11 no# RhostsRSAAuthentication no# RSAAuthentication yes# PasswordAuthentication yes# HostbasedAuthentication no# GSSAPIAuthentication no# GSSAPIDelegateCredentials no# GSSAPIKeyExchange no# GSSAPITrustDNS no# BatchMode no# CheckHostIP yes# AddressFamily any# ConnectTimeout 0# StrictHostKeyChecking ask# IdentityFile ~/.ssh/identity# IdentityFile ~/.ssh/id_rsa# IdentityFile ~/.ssh/id_dsa# IdentityFile ~/.ssh/id_ecdsa# IdentityFile ~/.ssh/id_ed25519# Port 22# Protocol 2# Cipher 3des# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc# MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160# EscapeChar ~# Tunnel no# TunnelDevice any:any# PermitLocalCommand no# VisualHostKey no# ProxyCommand ssh -q -W %h:%p gateway.example.com# RekeyLimit 1G 1h## Uncomment this if you want to use .local domain# Host *.local# CheckHostIP noHost * GSSAPIAuthentication yes# If this option is set to yes then remote X11 clients will have full access# to the original X11 display. As virtually no X11 client supports the untrusted# mode correctly we set this to yes. ForwardX11Trusted yes# Send locale-related environment variables SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE SendEnv XMODIFIERS sshd支持两种连接方式 密码连接对服务器中本地系统用户的登录名称、密码进行验证。简便,但可能会被暴力破解 密钥对连接要求提供相匹配的密钥信息才能通过验证。通常先在客户端中创建一对密钥文件(公钥、私钥),然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证。能增强安全性,且可以免交互登录。 密钥生成密钥对 在客户端使用ssh-keygen命令 生成密钥对 默认存放在~/.ssh/中 { ~ 指的是系统用户目录} 命令选项 -b:指定密钥长度; -e:读取openssh的私钥或者公钥文件; -C:添加注释; -f:指定用来保存密钥的文件名; -i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥; -l:显示公钥文件的指纹数据; -N:提供一个新密语; -P:提供(旧)密语; -q:静默模式; -t:指定要创建的密钥类型。 生成密钥对命令 执行命令后会提示输入密码之类的信息 一路回车即可 //会在 ~/.ssh/ 中生成名为 id_rsa 的4096位密钥对 $ ssh-keygen -t rsa -b 4096 -C "your@email.com" //-f 自定义密钥名 $ ssh-keygen -t rsa -C "your@email.com" -f ~/.ssh/filename 生成好后会有2个文件 id_rsa 私钥 id_rsa.pub 公钥 配置服务器密钥 将生成的公钥 拷贝到远程主机的 ~/.ssh/ 目录, 命名为 authorized_keys 配置/etc/ssh/sshd_config //RSA认证 非必须 不存在不添加此项 RSAAuthentication yes //公钥认证 PubkeyAuthentication yes //禁止root登录 PermitRootLogin yes //是否密码认证 PasswordAuthentication no ChallengeResponseAuthentication no //指定密钥文件 AuthorizedKeysFile .ssh/authorized_keys 修改后重启服务 $ /bin/systemctl restart sshd.service 文件权限 1 .ssh目录的权限必须是700 chmod 700 ~/.ssh 2 .ssh/authorized_keys文件权限必须是600 chmod 600 ~/.ssh/authorized_keys Client SSH配置客户端使用的程序 客户端:Putty、Xshell、Xftp、CRT、Git、ssh 客户端远程登录命令1ssh [选项] root@192.168.1.1 123456789101112131415161718192021选项 说明-1 强制使用ssh协议版本1-2 强制使用ssh协议版本2-4 强制使用IPv4地址-6 强制使用IPv6地址-A 开启认证代理连接转发功能-a 关闭认证代理连接转发功能-b 使用本机指定的地址作为对位连接的源IP地址-C 请求压缩所有数据-F 指定ssh指令的配置文件,默认的配置文件为“/etc/ssh/ssh_config”-f 后台执行ssh指令-g 允许远程主机连接本机的转发端口-i 指定身份文件(即私钥文件)-l 指定连接远程服务器的登录用户名-N 不执行远程指令-o 指定配置选项-p 指定远程服务器上的端口-q 静默模式,所有的警告和诊断信息被禁止输出-X 开启X11转发功能-x 关闭X11转发功能-y 开启信任X11转发功能 ssh登录服务器 连接服务器 $ ssh username@hostip 自定义端口 $ ssh -p 6666 username@hostip 自定义密钥 ~/.ssh/key 自定义密钥名 $ ssh -i ~/.ssh/key username@hostip 客户端执行调试 会显示一些登录信息 $ ssh -v user@host scp拷贝文件到服务器 使用scp命令 scp -r ./down root@192.168.31.1:/tmp/ sftp 由于使用了加密/解密技术,所以传输效率比普通的FTP要低,但安全性更高。1234567sftp root@192.168.1.1root@192.168.1.1's password:Connected to 192.168.1.1.sftp> lssftp> get 文件名 #下载文件sftp> put 文件名 #上传文件sftp> exit #退出 问题错误连接服务器时的错误信息 1 no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1 方法1 打开~/.ssh/config文件 填入下面的内容 Host * KexAlgorithms +diffie-hellman-group1-sha1 方法2 打开/etc/ssh/ssh_config文件 在尾部加入 KexAlgorithms +diffie-hellman-group1-sha1 连接服务器时的错误信息 2 no matching host key type found. Their offer: ssh-rsa,ssh-dss Git安装目录 打开/etc/ssh/ssh_config 追加下面的内容 //修改主机名为你的 Host 123.123.123.123 HostkeyAlgorithms +ssh-rsa PubkeyAcceptedAlgorithms +ssh-rsa 连接服务器时的错误信息 3 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 出现以下错误 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the RSA key sent by the remote host is SHA256:yC12kr+kWYA5g/g2Pfz37mEJ9Rg0GmqMSZd12FJYd5Q. Please contact your system administrator. Add correct host key in /c/Users/S/.ssh/known_hosts to get rid of this message. Offending RSA key in /c/Users/S/.ssh/known_hosts:12 Host key for 192.168.8.8 has changed and you have requested strict checking. Host key verification failed. 解决方法 打开~/.ssh/known_hosts文件 删除你要连接的主机信息 如192.168.0.1,github.com","link":"/2022/03/03/Tools/ssh/"},{"title":"使用Acme申请SSL证书","text":"安装前准备 centos 安装acme之前可能需要安装socat yum makecache yum install socat 安装Acme 安装Acme curl https://get.acme.sh | sh 使用Acme申请SSL证书 在申请证书前 要放行80端口 iptables -I INPUT -p tcp --dport 80 -j ACCEPT 更换代码中的域名、邮箱为你解析的域名及邮箱 //注册一个账户 ~/.acme.sh/acme.sh --register-account -m xxx@xxx.com //返回以下信息表示注册成功 ACCOUNT_THUMBPRINT='p_JnG5CF3RA35s4GSZ2gvPUUuGtXdqTlOPEqOEyRK-c' 申请SSL证书 ~/.acme.sh/acme.sh --issue -d xxx.xxx.top --standalone //返回key后表示成功 安装SSL证书 安装证书到指定文件夹 更换代码中的域名为你解析的域名 ~/.acme.sh/acme.sh --installcert -d xxx.xxx.top --key-file /root/private.key --fullchain-file /root/cert.crt","link":"/2023/03/08/%E4%BD%BF%E7%94%A8Acme%E7%94%B3%E8%AF%B7SSL%E8%AF%81%E4%B9%A6/%E4%BD%BF%E7%94%A8Acme%E7%94%B3%E8%AF%B7SSL%E8%AF%81%E4%B9%A6/"}],"tags":[{"name":"Node.js","slug":"Node-js","link":"/tags/Node-js/"},{"name":"MySql","slug":"MySql","link":"/tags/MySql/"},{"name":"C#","slug":"C","link":"/tags/C/"},{"name":"Net Core","slug":"Net-Core","link":"/tags/Net-Core/"},{"name":"Dev","slug":"Dev","link":"/tags/Dev/"},{"name":"Encrypt","slug":"Encrypt","link":"/tags/Encrypt/"},{"name":"Nginx","slug":"Nginx","link":"/tags/Nginx/"},{"name":"Python","slug":"Python","link":"/tags/Python/"},{"name":"Github","slug":"Github","link":"/tags/Github/"},{"name":"Github Actions","slug":"Github-Actions","link":"/tags/Github-Actions/"},{"name":"Hexo","slug":"Hexo","link":"/tags/Hexo/"},{"name":"git","slug":"git","link":"/tags/git/"},{"name":"Github Desktop","slug":"Github-Desktop","link":"/tags/Github-Desktop/"},{"name":"Article","slug":"Article","link":"/tags/Article/"},{"name":"Icarus","slug":"Icarus","link":"/tags/Icarus/"},{"name":"Hexo Theme","slug":"Hexo-Theme","link":"/tags/Hexo-Theme/"},{"name":"Ubuntu","slug":"Ubuntu","link":"/tags/Ubuntu/"},{"name":"Linux","slug":"Linux","link":"/tags/Linux/"},{"name":"System","slug":"System","link":"/tags/System/"},{"name":"Openwrt","slug":"Openwrt","link":"/tags/Openwrt/"},{"name":"Windows","slug":"Windows","link":"/tags/Windows/"},{"name":"SSH","slug":"SSH","link":"/tags/SSH/"},{"name":"Tools","slug":"Tools","link":"/tags/Tools/"},{"name":"使用Acme申请SSL证书","slug":"使用Acme申请SSL证书","link":"/tags/%E4%BD%BF%E7%94%A8Acme%E7%94%B3%E8%AF%B7SSL%E8%AF%81%E4%B9%A6/"}],"categories":[{"name":"Dev","slug":"Dev","link":"/categories/Dev/"},{"name":"Next.js","slug":"Dev/Next-js","link":"/categories/Dev/Next-js/"},{"name":"Node.js","slug":"Dev/Node-js","link":"/categories/Dev/Node-js/"},{"name":"Nginx","slug":"Dev/Nginx","link":"/categories/Dev/Nginx/"},{"name":"MySql","slug":"Dev/MySql","link":"/categories/Dev/MySql/"},{"name":"Python","slug":"Dev/Python","link":"/categories/Dev/Python/"},{"name":".Net Core","slug":"Dev/Net-Core","link":"/categories/Dev/Net-Core/"},{"name":"GitHub","slug":"GitHub","link":"/categories/GitHub/"},{"name":"Hexo","slug":"Hexo","link":"/categories/Hexo/"},{"name":"System","slug":"System","link":"/categories/System/"},{"name":"Tools","slug":"Tools","link":"/categories/Tools/"},{"name":"使用Acme申请SSL证书","slug":"使用Acme申请SSL证书","link":"/categories/%E4%BD%BF%E7%94%A8Acme%E7%94%B3%E8%AF%B7SSL%E8%AF%81%E4%B9%A6/"},{"name":"Git","slug":"Git","link":"/categories/Git/"},{"name":"Linux","slug":"System/Linux","link":"/categories/System/Linux/"},{"name":"路由系统","slug":"System/路由系统","link":"/categories/System/%E8%B7%AF%E7%94%B1%E7%B3%BB%E7%BB%9F/"},{"name":"Windows","slug":"System/Windows","link":"/categories/System/Windows/"},{"name":"SSH","slug":"Tools/SSH","link":"/categories/Tools/SSH/"}]}