正则表达式必知必会学习笔记。
正则表达式的两种基本用途:搜索和替换。
1 | hello //这里的正则表达式直接使用纯本文 |
1 | # .字符可以匹配到任何一个单个字符 |
1 | # .字符在正则表达式里有着特殊的含义。如果模式里需要一个.,需要在.前面加上一个\字符来怼它进行转义 |
1 | # [abc] |
1 | # 以下两者等价 |
字符区间还包括以下这些:
- A-Z,匹配从A到Z的所有大写字母
- a-z,匹配从a到z的所有小写字母
- A-F,匹配从A到F的所有大写字母
- A-z,匹配从ASCII字符A到ASCII字符z的所有字母。这个模式一般不常用。
注:-(连字符)是一个特殊的额元字符,作为元字符它只能用在[和]之间。在字符集合以外的地方,-只是一个普通字符,只能与-本身相匹配。因此在正则表达式里面,-字符不需要被转义。
1 | # 在同一个字符集合里可以给出多个字符区间。 |
除了那个字符集合里的字符,其他字符都可以匹配。
1 | [ns]a[^0-9]\.xls |
注:^的效果将作用于给定字符串集合里的所有字符或字符区间,而不是仅限于紧跟在^字符后面的那一个字符或字符区间。
1 | # 匹配一个包含着[和]字符的JavaScript数组 |
元字符 | 说明 |
---|---|
[\b] | 回退(并删除)一个字符(Backspace键) |
[\f] | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符(Tab键) |
\v | 垂直制表符 |
匹配数字(与非数字)
元字符 | 说明 |
---|---|
\d | 任何一个数字字符(等价于[0-9]) |
\D | 任何一个非数字字符(等价于[^0-9]) |
匹配字母和数字(与非字母和数字)
元字符 | 说明 |
---|---|
\w | 任何一个字母数字字符(大小写均可)或下划线字符(等价于[a-zA-Z0-9]) |
\W | 任何一个非字母数字或非下划线字符(等价于[^a-zA-Z0-9_]) |
匹配空白字符(与非空白字符)
元字符 | 说明 |
---|---|
\s | 任何一个空白字符(等价于[\f\n\r\t\v]) |
\S | 任何一个非空白字符(等价于[^\f\n\r\t\v]) |
匹配一个或多个字符:要想匹配同一个字符(或字符集合)的多次重复,只要简单地给这个字符(或字符集合)加上一个+字符作为后缀就行了。+匹配一个或多个字符(至少一个;不匹配零个字符的情况)。
在给一个字符集合加上+后缀的时候,必须把+放在这个字符集合的外面。比如[0-9]+。
1 | # 匹配邮箱 |
+是一个元字符。如果需要匹配+本身,就必须使用它的转义序列\+
注:一般来说,当在字符集合里使用的时候,像.和+这样的u按字符将被解释为普通字符,不需要转义,但转义了也没有坏处。[\w.]的使用效果与[\w\.]是一样的。
匹配零个或多个字符:*的用法和+完全相同。
1 | # 匹配邮箱(邮箱第一个字符必须是一个字母或数字字符) |
匹配零个或一个字符:?只能匹配一个字符(或字符集合)。
1 | http:\/\/[\w./]+ |
重复次数用{ }字符来给出,把数值写在它们之间。
{ }是元字符。如果需要匹配{ }本身,就应该用\对它们进行转义(有时候不转义也能正确处理)。
1 | # 继续上面RGB那个例子 |
为重复匹配次数设定一个区间:{2,4},表示最少重复2次、最多重复4次。
1 | # 检查日期的格式 |
匹配至少重复多少次:{3,}表示至少重复三次。
常用的贪婪型元字符和它们的懒惰型版本:懒惰型元字符的写法很简单,只需要给贪婪型元字符加上一个?后缀即可。
贪婪型元字符 | 懒惰型元字符 |
---|---|
* | *? |
+ | +? |
{n,} | {n,}? |
1 | # 文本为:living in <B>AK</B> and <B>HI</B> |
1 | # 文本为:The cat scattered his food all over the room. |
需要解决的问题:模式把文本中所有cat都找了出来,但是scattered里的那个cat我们不需要。
解决办法:使用边界
第一种边界(也是最常用的边界)是由限定符\b指定的单词边界。顾名思义,\b用来匹配一个单词的开始或结尾。
\b匹配的是一个这样的位置,这个位置位于一个能够用来构成单词的字符(字母、数字和下划线,也就是与\w相匹配的字符)和一个不能用来构成单词的字符(也就是与\W相匹配的字符)之间。
1 | # 上一个例子 |
如果不像匹配一个单词边界,请使用\B。
1 | # 文本为:Please enterthe nine-digit id as it appears on your color - coded pass-key. |
用来定义字符串边界的元字符有两个:要给是用来定义字符串开头的^,另一个是用来定义字符串结尾的$。
如果^实在一个字符集合的外面并位于一个模式的开头,^将匹配字符串的开头。
1 | # ^匹配一个字符串的额开头位置,所有^\s*将匹配一个字符串的开头位置和随后的零个或多个空白字符(这解决了<?xml>标签前允许有空格、制表符、换行符等空白字符的问题)。 |
有许多正则表达式都支持使用一些特殊的元字符去改变另外一些元字符行为的做法,用来启用分行匹配模式的(?m)记号就是一个能够改变其他元字符行为的元字符序列。在分行匹配模式下,^不仅匹配正常的字符串开头,还将匹配行分隔符(换行符)后面的开始位置(这个位置是不可见的):类似的,$不仅匹配正常的字符串结尾,还将匹配行分隔符(换行符)后面的结束位置。
1 | # 使用正则表达式把一段Java代码里的注释内容全部查出来 //注释 |
注:有许多正则表达式实现不支持(?m)。
子表达式是一个更大的表达式的一部分;把一个表达式划分为一系列子表达式的目的是为了把那些子表达式当作一个独立元素来使用。子表达式必须用( ) 括起来。
( )是元字符。如果需要匹配( )本身,就必须使用它的转义序列\(和\)
1 | # 不正确写法,将会重复匹配多个; |
以下语句是为了把文本中的年份数字完整的匹配出来,这个模式里的|字符是正则表达式里的或操作符,19|20将匹配数字序列19或20。
1 | 19|20\d{2} |
例子: 优化前面IP匹配的模式
解决思路:
1 | ((2(5[0-5]|[0-4]\d))|(1\d{0,2})|0|[2,3,4,5,6,7,8,9](\d){0,1})(\.((2(5[0-5]|[0-4]\d))|(1\d{0,2})|0|[2,3,4,5,6,7,8,9](\d){0,1})){3} |
需要解决的问题:假设有一段文本,你想把这段文本里所有连续重复出现的单词找出来。
1 | # 文本为:This is a block of of text, several words here are are repeated, and and they should not be. |
这个模式的最后一部分是\1:这是一个回溯引用,而它引用的正是前面划分出来的那个子表达式:当(\w+)匹配到单词of的时候,\1也匹配单词of;当(\w+)匹配到单词and的时候,\1也匹配单词and。
例子:
1 | # 文本: |
这里我们把[1-6]用括号括起来了,使它成为一个子表达式。然后就可以在结束标签</[hH]\1>中用\1来引用这个子表达式了。
例1:将原始文本里的电子邮件地址全都转换为可点击的链接。
1 | # 文本 |
例2:电话号码格式转换。
1 | # 文本 |
用来进行大小写转换的元字符
元字符 | 说明 |
---|---|
\E | 结束\L或\U转换 |
\l | 把下一个字符转换为小写 |
\L | 把\L到\E之间的字符全部转换为小写 |
\u | 把下一个字符转换为大写 |
\U | 把\U到\E之间的字符全部转换为大写 |
\l和\u只能把下一个字符(或子表达式)转换为小写或大写。\L和\U将把它后面的所有字符转换为小写或大写,直到遇到\E为止。
例子:把一级标题(
1 | # 文本 |
注:该例子在调试工具中报错,不知道问题出在那里。
目前为止,我们见过的正则表达式都是用来匹配文本的,但有时我们还需要用正则表达式标记要匹配文本的位置(而不仅仅是文本本身)。这里就需要用到前后查找的概念
向前查找指定了要给必须匹配但不在结果中返回的模式。从语法上看,一个向前查找模式其实就是一个以?=
开头的子表达式,需要匹配的文本跟在=
的后面。
例子:将文本中的url地址的协议名部分提取出来(为下一步处理做准备)
1 | # 文本 |
向后查找操作符是?<=
,?<=
与?=
的具体使用方法大同小异;它必须用在一个子表达式里,而且后面跟要匹配的文本。
例子:从产品目录中把产品价格提取出来。
1 | # 文本 |
例子:把一个WEB页面的页面标题提取出来(title标签内的内容)。
1 | # 文本 |
各种前后查找操作符
操作符 | 说明 |
---|---|
(?=) | 正向前查找 |
(?!) | 负向前查找 |
(?<=) | 正向后查找 |
(?<!) | 负向后查找 |
嵌入条件的两种情形:
例子:把一段文本里的标签全都找出来;不仅如此,如果某个标签是一个链接(被括在A标签之间)的话,你还要把整个链接标签匹配出来。
语法:(?(backreference)true-regex)
1 | # 文本 |
Git学习笔记😷
使用git config
进行配置(配置文件三种不同的存储位置)
用户信息
1 | git config --global user.name "haitao" |
检查配置信息
1 | git config --list |
获取帮助
1 | git help <verb> |
获取git仓库
1 | git init |
检查当前文件状态
1 | git status |
跟踪新文件
1 | git add README |
暂存已修改文件
1 | git status |
状态简览
1 | git status --short |
注:
'??'
表示新添加的跟踪文件;
'A '
表示新添加到暂存区中的文件;
' M'
出现在右边的M表示该文件被修改了但是还没放入暂存区,比如commit之后进行的修改;
'AM'
表示添加暂存区之后被修改了,比如哦add之后进行的修改;
'M '
出现在左边的M表示该文件被修改了并放入了暂存区,比如在commit之后进行修改并且将修改保存到暂存区;
'MM'
这种情况出现在commit之后进行修改,并将修改保存到暂存区,然后再对文件进行修改。
' D'
表示保存到暂存区或者commit之后的文件从磁盘被删除。
'R '
表示commit之后,文件被renamed。
忽略文件
一般创建一个.gitignore
的文件,列出要忽略的文件模式。具体规则无需记忆,GitHub上有一个十分详细的针对数十种语言的.gitignore文件列表。
git status
显示了哪些文件被修改了,而git diff
则通过文件补丁的格式显示具体哪些行发生了改变。git diff --cached
或者git diff --staged
,二者效果相同。提交更新
1 | git commit -m "message" |
跳过使用暂存区域
git commit加上-a选项。
移除文件
确切的说,是从暂存区移除文件,然后提交。依次执行如下命令:
1 | rm -rf test.md |
还有一种情况是把文件保留在磁盘中,但是从暂存区中删除,比如有时候不小心将很大的日志文件添加到暂存区。
1 | git rm --cached output.log |
移动文件
对于暂存区中的文件可以使用
1 | git mv file_from file_to |
查看历史提交记录
1 | git log |
除此之外,git log还有很多格式化提交记录信息的方式。比如可以限制输出长度或者限制在一定时间范围内。
撤销操作
情景一:有时我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了,这是可以用:
1 | git commit --amend |
例如:你提交后发现忘记了暂存某些需要的修改,可以这样操作:
1 | git commit -m "init" |
执行最后一条命令后会弹出编辑器,然后在里面修改提交信息。编辑后保存会覆盖原来的提交信息。最终只会有一个提交记录。
取消暂存的文件
1 | git reset HEAD <file> |
撤销对文件的修改
如果不想保留对文件的修改的,将他还原成上次提交时的样子。(针对修改后还未保存到暂存区的文件)
1 | git checkout -- <file> |
查看远程仓库
1 | git remote |
添加远程仓库
1 | git remote add <shortname> <url> |
从远程仓库中抓取与拉取
1 | git fetch [remote-name] |
这个命令将会从远程分支拉取所有你还没有的数据(包括所有分支)。所以git fetch
会抓取上一次抓取之后新推送的所有工作。但是并不会自动合并或修改你当前的工作,必须进行手动合并。
而git pull
这个命令则是自动抓取然后合并远程分支到当前分支。另外,如果你clone一个仓库,会自动将其添加为远程仓库并默认以origin
为简写。
推送到远程仓库
1 | git push origin master |
查看某个远程仓库
1 | git remote show origin |
这个命令列出了当你在特定的分支上执行git push
会自动地推送到哪一个远程分支。它也同样地列出了哪些远程分支不在你的本地,哪些远程分支已经从服务器上移除了,还有当你执行git pull
时哪些分支会自动合并。
远程仓库地移除与重命名
如果想要重命名引用的名字可以运行git remote rename取修改一个远程仓库的简写名。例如,将origin重命名为paul:
1 | git remote rename origin paul |
如果要从服务器上移除一个远程仓库:
1 | git remote rm paul |
参考:https://git-scm.com/book/en/v2
记录在云服务器上安装配置Oracle的过程,以便忘记后回顾🤦♂️
Oracle官方网站,我的机器安装的是CentOS7 64位系统,因此下载的Oracle版本也是64位的。然后将文件通过Xftp上传到 /db/
安装之前,首先将yum源更改为aliyun源,这样下载速度快一些。
1 | cd /etc |
修改完成后,安装依赖包:
1 | yum -y install binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel expat gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers libaio libaio-devel libgcc libstdc++ libstdc++-devel make pdksh sysstat unixODBC unixODBC-devel |
使用如下命令检查依赖包是否安装完整:
1 | rpm -q binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel expat gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers libaio libaio-devel libgcc libstdc++ libstdc++-devel make pdksh sysstat unixODBC unixODBC-devel | grep "not installed" |
发现 pdksh 没有安装,执行 yum -y install pdksh,发现CentOS 7 没有相关安装包可用,通过wget命令直接下载pdksh的rpm包,我下载到了/tmp/
1 | wget -O /tmp/pdksh-5.2.14-37.el5_8.1.x86_64.rpm http://vault.centos.org/5.11/os/x86_64/CentOS/pdksh-5.2.14-37.el5_8.1.x86_64.rpm |
下载完成后,进入 /tmp/
1 | cd /tmp |
再次检查依赖包是否安装完整
1 | rpm -q binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel expat gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers libaio libaio-devel libgcc libstdc++ libstdc++-devel make pdksh sysstat unixODBC unixODBC-devel | grep "not installed" |
执行命令:
1 | groupadd oinstall |
添加完成后,查看oracle用户
1 | id oracle |
初始化oracle用户的密码
1 | passwd oracle |
配置命令
1 | vim /etc/hosts |
127.0.0.1 centos-orcl
测试hostname
1 | ping -c 3 centos-orcl |
kernel.shmmax 参数设置为物理内存的一半
1 | vim /etc/sysctl.conf |
使参数生效
1 | sysctl -p |
编辑文件
1 | vim /etc/security/limits.conf |
1 | vim /etc/pam.d/login |
1 | vim /etc/profile |
让环境变量立即生效
1 | source /etc/profile |
创建目录
1 | mkdir -p /db/app/oracle/product/11.2.0 |
编辑文件
1 | su - oracle |
以上配置完成后,个人建议重启下系统
1 | reboot |
命令
1 | cd /db/ |
解压完成后
1 | mkdir -p /db/etc/response/ |
1 | oracle.install.option=INSTALL_DB_SWONLY |
开始安装
1 | su - oracle |
安装期间可以使用tail命令监听oracle的安装日志,比如:
1 | tail -f /db/app/oracle/inventory/logs/installActions2017-07-12_03-48-37PM.log |
安装完成,提示Successfully Setup Software
,回车即可。
1 | su root |
配置命令
1 | su - oracle |
查看监听端口
1 | netstat -tnulp | grep 1521 |
TOTALMEMORY
设置为总内存的80%
1 | vi /db/etc/response/dbca.rsp |
1 | GDBNAME = "orcl" |
执行静默建库
1 | dbca -silent -responseFile /db/etc/response/dbca.rsp |
查看oracle实例进程
1 | ps -ef | grep ora_ | grep -v grep |
查看监听状态
1 | lsnrctl status |
登录sqlplus,查看实例状态
1 | sqlplus /nolog |
激活scott用户
1 | alter user scott account unlock; |
创建用户并授权
1 | create user lihtao identified by "232408" |
开放1521端口
1 | firewall-cmd --zone=public --add-port=1521/tcp --permanent |
如果是服务器,则需要在安全组中配置相应的规则。
下载 instantclient-basic,解压压缩文件。
配置Navicat
编辑文件
1 | vi /db/app/oracle/product/11.2.0/bin/dbstart |
1 | vi /db/app/oracle/product/11.2.0/bin/dbshut |
1 | vi /etc/oratab |
1 | vi /etc/rc.d/init.d/oracle |
开机启动oracle
1 | systemctl enable oracle |
交换空间
解决方法:创建交换空间
1 | swapon -s |
如果返回的信息概要是空的,则表示 Swap 文件不存在。
1 | df -hal |
1 | 1 dd if=/dev/zero of=/swapfile bs=1024 count=512k |
参数解读:if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >bs=bytes:同时设置读入/输出的块大小为bytes个字节count=blocks:仅拷贝blocks个块,块大小等于bs指定的字节数。
格式化并激活 Swap 文件上面已经创建好 Swap 文件,还需要格式化后才能使用
1 | mkswap /swapfile |
激活 Swap
1 | swapon /swapfile |
以上步骤做完,再次运行命令
1 | swapon -s |
你会发现返回的信息概要:
1 | Filename Type Size Used Priority |
如果要机器重启的时候自动挂载 Swap ,那么还需要修改 fstab 配置。用 vim 打开 /etc/fstab 文件,在其最后添加如下一行:
1 | /swapfile swap swap defaults 0 0 |
最后,赋予 Swap 文件适当的权限:
1 | chown root:root /swapfile |
权限不足
为了防止oracle安装时没有文件或者文件夹的权限,建议通过chown
命令更改/db
文件夹为oracle这个账号所有。
1 | chown -R oracle:oinstall /db/ |
参考:https://blog.csdn.net/Kenny1993/article/details/75038670
参考:https://blog.csdn.net/qq_35893120/article/details/80655645
参考:https://blog.csdn.net/sunhua2013/article/details/78396445
算法第四版windows环境配置的简单过程。
将下载好的algs4.jar
文件放到任意一个不包含中文路径的文件夹里;
鼠标右击我的电脑
配置系统环境变量,如下图:
修改成功后一路确定保存退出;
新建项目
测试
测试用例在书中22页
如果代码中包含中文,编译代码时需要执行这条命令javac -encoding UTF-8 test.java
VMware中CentOS与Win10共享文件夹的设置教程。
第一步,CentOS关机,打开虚拟机设置
第二步,选择win10下的一个用于共享的文件夹
CentOS开机,安装VMware tools
挂载VMware tools,拷贝至个人home目录,解压
1 | tar -zxvf VMwareTools-10.3.2-9925305.tar.gz |
在运行vmware-install.pl
前先把依赖安装好
1 | sudo yum install gcc |
运行vmware-install.pl
,一路回车,
1 | sudo ./vmware-install.pl |
此时CentOS的/mnt/hgfs/ShareFile/
文件已经和win10同步了。完成后显示
1 | Enjoy, |
最后查看即可
1 | cd /mnt/hgfs |
推荐几个好用Windows端软件待更新
效果图如下:
个人比较喜欢简单的桌面。
可以将win10的任务栏更改为win7样式,对于不太习惯win10的人可能有一定的帮助,同时也可以更改图标大小,个人觉得比起win10系统自带的任务栏要好看一些,如果配合下面的TranslucentTB一起使用的话,效果可能更好一些。
任务栏状态(选择一种 - 可以在除正常之外的每个状态上自定义):
动态模式(这些模式可以一起使用,每个模式都提供您可以自定义的任务栏状态和颜色):
能够显示或隐藏Aero Peek按钮。可定制的意愿或动态。
这个软件就是增强了鼠标的操作性,可以使用鼠标的滚轮切换虚拟桌面、调节音量、标签页、翻页等。
快捷键快速填充自定义的字符,类似这样
当然功能肯定不止这些,看个人需要使用吧,也可以去官网看看。
这里介绍几个个人用着不错的工具软件。
是我用过的Windows上最好用的截图软件,而且是免费,强烈推荐!!
具体的使用方法和更多功能介绍就不再赘述,大家可以去官网看看。
类似的软件有Everything,两个软件各有其优点,但是日常中我用Listarty更多一些,主要用它快速启动软件,因为我不喜欢在桌面放软件图标。如果你也和我一样,那就用它吧。
类似下面这样子
可以模糊搜索,对于安装很多的软件的人来说,尤其好用。
这个就不用我多说了吧,已经很有名气了,确实好用,强烈推荐
用过win10的人,大概都被各种流氓软件经常恶心,这个软件是我用过的在卸载软件这方面做的最好的软件吧,但是好像是收费的,大家在万能淘宝买一个账号就可以使用了。
刚开始确实挺好用的,但是后来我的账号好像被百度限速了,所以说大家酌情使用,哈哈,对于百度这种我的真的没脾气的。一边骂着百度垃圾,一边还续费着百度网盘的超级会员。
这个也属于不用很有名的哈,大家自己了解了解,还是那句话,根据自己需求选择。
使用win10的过程中,我们常常遇到一种情况就是有些文件夹、文件删除不了,什么权限不足之类的。这个时候就可以使用这个软件强力删除,但是注意别删错了!!!
大家可能好奇为什么不用360自带的强力删除,因为我有强迫症,从不使用360这种不断弹窗的软件。
有些笔记本电脑没有大小写提示灯,不知道大家用着有没有觉得很难受,我是真的受不了。打字本来就很慢,再tm打错大小写,简直要命,特别是有时候输密码的时候,没有大小写开关的提示,感觉真的是极其不方便。
这个软件可以显示CapsLock,NumLock 和 ScrollLock键的状态。
在右下角大概这样显示,一个黑色的小方块。
一个非常非常好用的markdown编辑器,配合Sublime使用也很不错。之前一直使用马克飞象,后来发现了这个,相见恨晚,哈哈哈,强烈推荐!!!
使用截图
算是一本比较小众的播放器吧,但是确实很好用。唯一不太满意的地方就是界面稍稍有点不太好看。
外观大概就是这样子
也有一些经过自定义的,使用起来可能更加方便一些,但是影响也不是很大。
这个软件简直不要太强大,之前一直找pdf批量转换的工具,试了不少都不是很好用,直到用了这个,淘宝几块钱可以买到破解版,如果需要的话,也可以留言我要网盘链接。
可以转换整个文件夹,并将生成的pdf保存到指定的文件夹中。其它功能还未尝试。
一个类似Linux的终端,感觉覆盖了Linux下很多的命令操作。我用这个干嘛呢,偶尔连接一下服务器,一般连接服务器我使用的是MobaXteam,有一次我给我的mp3下载音乐,下载歌词后感觉适配不是很好,想删除,我去网上找了找批量删除同一类型文件的工具,但是都觉得比较麻烦。如果命令行的话,只需输入
1 | rm -rf *.lrc |
回车,即可。
百度网盘链接,提取码:6269
待更新
Frp内网穿透+Aria2 BT下载器+Nginx反代,实现远程下载,这样就不会浪费寝室的宽带了,断网之后就可以直接看下载下来的视频了。
1 | sudo apt update |
创建配置文件
1 | sudo mkdir /etc/aria2 |
1 | #文件的保存路径(可使用绝对路径或相对路径),默认:当前启动位置 |
1 | #测试启动Aria2,如果没有提示任何错误信息可以Ctrl + C停止 |
1 | sudo nano /etc/init.d/aria2c |
1 | sudo chmod +x /etc/init.d/aria2c |
1 | # 下载aira-ng |
我在这一篇文章中也有写frp的相关内容,大家可以作为参考。
同样的,也只需看其中frp的部分即可。
下面我放出我的配置文件,具体网上的参考很多
1 | bind_port = 7000 |
1 | [common] |
frp是可以配置多站点的,并且是以名称来区分的,比如上面的web1和web2
nginx的安装配置可以看我的这几篇文章,写的比较详细。
大家只需看其中nginx的部分即可,其它可以略过
只需在server部分添加如下模块:
1 | location / { |
server部分的完整配置如下:
1 | server { |
配置完成后只需重启nginx
即可。
samba的安装配置可以参考这篇文章
首先在浏览器中输入网址,这里我们输入:aria2.lihtao.com
效果如下:
这里还需要一些配置
为了清楚一点,我以图片的形式展示
好像只能下载磁力链接。
]]>其中包含samba网络共享、树莓派书籍推荐待更新
待更新
其实相比在各种论坛求教,看书可以解决90%的问题,再说,还可以Google嘛。玩树莓配硬件还是要懂一些的,当然我也不是很懂,学习中🤦♂️,哈哈
作者是树莓派的共同创始人之一,所以相当于一本树莓派的说明书吧
内容要比前一本书更丰富,包含基本的python编程知识、以及一些python高级特性。同时还介绍了机器视觉、硬件基础、控制硬件、电机、数字输入、传感器、显示设备、物联网以及arduino等相关知识。
使用场景:你想把树莓派用作网络存储服务器,即从网络中的电脑访问树莓派连接的大容量USB驱动器(比如硬盘)。
1 | sudo apt-get install samba samba-common-bin |
查看硬盘状态: sudo fdisk -l
, 找到挂载的移动硬盘(以 /dev/sda1 为例)
查看挂载状态: df -h
挂载: sudo mount -t /dev/sda1 /home/pi/usb
1 | cd /home/pi/usb |
修改配置文件/etc/samba/smb.conf
,具体如下:
1 | sudo vim /etc/samba/smb.conf |
寻找其中的workgroup = WORKGROUP
,如果你是用win系统,则使用默认即可
最后,根据自己的需要,在文件尾部添加如下内容,每个模块是独立的:
1 | [smb1] |
注册登陆用户
1 | sudo smbpasswd -a pi |
保存文件,重启Samba。
1 | sudo samba restart |
然后打开windows资源管理器中的网络和共享中心
输入如下命令即可查看到共享文件。
1 | \\树莓派IP |
手机同理。
挂载硬盘后发现无法写文件
解决办法:
1 | // 安装 nfts 支持 |
这篇文章主要介绍如何通过frp穿透内网,访问树莓派上的web站点,主要记录关键的操作步骤和容易出错的地方,以便大家参考。
都需要用哪些工具呢?
公网IP可以用类似花生壳这样的工具代替,但是如果有自己的服务器最好,就不用再买其它套餐了,而且速度还快!
域名也可以申请免费的域名,在这个网站freenom.com申请
这里我使用的是用hexo生成静态博客的方式,本博客也是基于此。具体的生成方法可以参考一下两篇文章。
这两篇文章详细的记录的生成的每一个步骤,大家可以作为参考。
首先推荐大家去看frp的官网文档,因为frp仍然处于开发阶段,我并不能保证本教程一致适用,但是大家遇到问题可以留言。
在树莓派上:
1 | wget https://github.com/fatedier/frp/releases/download/v0.24.0/frp_0.24.0_linux_arm.tar.gz |
在服务器上:
1 | wget https://github.com/fatedier/frp/releases/download/v0.24.0/frp_0.24.0_linux_amd64.tar.gz |
一定要根据自己服务器和树莓派的系统选择合适的版本,并且服务器端和客户端的版本号必须一致,比如像上面这样,两端都必须使用V0.24.0!!!
1 | # frps.ini |
1 | ./frps -c ./frps.ini |
1 | [common] |
1 | ./frpc -c ./frpc.ini |
将www.yourdomain.com
的域名A记录解析到IPx.x.x.x
,如果服务器已经有对应的域名,也可以将CNAME
记录解析到服务器原先的域名。
通过浏览器访问http://www.yourdomain.com:8888
即可访问到处于内网机器上的web服务。
看了很多网上的资料,感觉还是在/etc/profile.d/
写一个简单的脚本最为简单。
1 |
|
Linux系统启动时默认会执行/etc/profile.d/
文件夹下的所有文件。
这是我运行在寝室树莓派上的网站:rpi.lihtao.com🤓
其实它就运行在这样一个锈迹斑斑的Raspberry Pi 3B
上🤭🤭🤭
欢迎大家访问!🤗🤗🤗
]]>
现在服务器都很贵,那么同一服务器配置多个站点就很有必要。本教程教大家如何配置多站点,以及安装SSL证书。
操作系统:CentOS 7.6 64位
nginx版本:nginx-1.14.2
nginx多站点的配置其实很简单,但是我上网搜索到的很多资料写的不详细,而且版本都很旧。所有打算写博客记录一下。
简而言之,就是将nginx.conf
中的server部分复制几份,然后配置不同的域名即可。
下面是我的server部分的配置文件,以lihtao.com
和lihaitao.net.cn
作为站点一二。
1 | # 站点一 |
SSL即配置443端口
,和80端口
的配置差别不大。需要注意的是:我们需要在80端口的配置部分通过rewrite
实现url的重写,将其重写成https://lihtao.com
的形式。以下为我server部分的完整配置。
1 | # HTTP server |
注意:如果重启nginx时报错,很可能时没有安装ssl模块
安装nginx
部分就可以,需要注意一个步骤,就是将./configure
替换为./configure --with-http_ssl_module
即可,其它部分不变。ssl证书可以在阿里云和腾讯云免费申请,我的证书使用的是腾讯云提供的免费证书,证书的申请以及安装网上都有很多的资料可以参考。本文就不再赘述。
]]>首先祝大家新春快乐!!嘻嘻🙃🙃
不废话了,开始吧。
网上有很多的Android端的代理客户端,但是为了防止后台上传服务器地址和端口偷用流量,我们还是使用GitHub上开源的手机端app—shadowsocks-android,然后将下载好的apk文件安装到手机。
打开手机端app,然后点击右上角奥的”+”,选择手动配置,然后填写配置选项,如下图:
其中服务器填写服务器IP地址就可以,远程端口根据服务器端的设置填写,密码和加密方式也一样,带规则根据自己的需要进行选择,全局代理就是所有的流量都会走代理,所以如果访问国内的网站会很慢。我们一般选择PAC模式,也就是绕过局域网和中国大陆。这样如果访问防火墙以外的网站的就会自动走代理,但是有时候可能PAC规则更新不够及时,会导致一些墙外的网站无法在PAC模式下访问,这时就需要更改到全局模式。
其实PC端使用的方法和上面的手机端大同小异,这里还是简单介绍一下配置方法。
同样的网上的开源程序也有很多,所以我们同样选择GitHub上的开源软件,我使用的软件我忘了GitHub地址,所以只好放在网盘里供大家使用了。
点击下载,提取码:9y0b
下载好之后进行配置,如下图:
配置同上。
然后右键右下方的小飞机,设置如下图:
其中系统代理模式可以选择不同的代理模式,不同代理模式的区别同上,然后根据自己需要进行选择。
浏览器中输入google.com看是否可以正常使用Google
待更新
对于刚拿到手的树莓派应该如何配置呢?这里记录了一些基本的配置方法。
下图是我买的树莓派套餐:
首先去官网下载镜像
然后使用Win32DiskImager将下载好的镜像烧录到16G的TF卡中,软件可以点击这里下载。
如果没有显示器,则可以使用如下方法来配置ssh进行远程登陆。
镜像烧录好之后打开文件夹,然后在文件夹中创建一个名为ssh
的文件。
注意:文件名是ssh,不是ssh.txt
同样的,如果没有显示器,需要向上一步一样创建一个名为wpa_supplicant.conf
的文件。文件内容如下:
1 | country=GB |
系统安装成功后,配置文件所在位置为:/etc/wpa_supplicant/wpa_supplicant.conf
其中network可以配置多个,并分配不同的优先级
其他教程是使用如下命令来连接树莓派的:
1 | $ ssh pi@raspberrypi.local |
但是我没有连接成功,我使用的命令是ssh pi@IP地址
,那么问题来了,我们怎么知道树莓派的IP地址呢?这里介绍两种方法来查看树莓派的IP。
方法一:查看路由器,在win命令行中输入ipconfig
找到默认网关,然后在浏览器中输入默认网关地址查看树莓派的IP地址
方法二:使用扫描工具扫描IP段,我使用的工具是Advanced IP Scanner
,扫描结果如下图所示:
然后使用ssh连接即可
有一种尴尬的情况就是突然网断了,接着也就和树莓派失去了联系。我们应该如何防止这种突发状况呢?
我们可以使用一个脚本进行定时检测,然后自动重连WiFi。
下面为配置方法:
1、Python 代码 autowifi.py,放在 /home/pi 目录下:
1 | #!/usr/bin/python |
2、Shell脚本autowifi.sh,也放在 /home/pi 目录下:
1 | !/bin/sh |
3、开机自动启动以上脚本:在终端窗口执行以下命令即可
1 | $ sudo cp -f /home/pi/autowifi.sh /etc/init.d/ |
1 | $ sudo raspi-config |
Advanced Options
,回车Expand Fliesystem
1 | $ df -h |
在树莓派中python
的2和3默认都有安装,但是默认版本是python2
,命令行输入python -V
即可查看当前的python版本。如需更换为python3
,只需要创建一个软链接到/usr/bin/
路径下。具体步骤如下:
python
版本1 | $ python -V |
/usr/bin/
目录下,查看已经安装所有的python版本号1 | $ cd /usr/bin |
/usr/bin
下面的python
文件,创建一个新的软链接1 | $ sudo rm /usr/bin/python |
说明:只需修改下面的12.x
中的数字,按照自己的需要修改即可
1 | $ curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - |
根据官网先做如下配置
1 | $ sudo apt-get update |
添加docker官方的GPG密钥
1 | $ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - |
设置docker源
1 | $ echo "deb [arch=armhf] https://download.docker.com/linux/debian \ |
更新 安装
1 | $ sudo apt-get update |
将用户加入docker用户组内
1 | $ sudo gpasswd -a ${USER} docker |
然后退出用户(pi)并重新登陆。
/etc/apt/sources.list
文件,删除原文件所有内容,用以下内容取代:1 | deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib |
/etc/apt/sources.list.d/raspi.list
文件,删除原文件所有内容,用以下内容取代:1 | deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui |
sudo apt-get update
命令,更新软件源列表,同时检查您的编辑是否正确。修改ssh的配置文件/etc/ssh/sshd_config
,将其中的#permitRootLogin prohibit-password
修改为permitRootLogin yes
。
为root账号设置密码
1 | # 切换到root账号,并设置密码 |
1 | /etc/init.d/ssh restart |
vim鼠标不能右键粘贴,解决方法:
方法一:在普通模式下键入:set mouse-=a
方法二:编辑 ~/.vimrc 文件,加入如下代码:
1 | if has('mouse') |
方法一每次打开vim时都需要设置一次。
方法二改了配置文件后,问题就解决了。
参考:http://www.ruanyifeng.com/blog/2017/06/raspberry-pi-tutorial.html
参考:https://man.linuxde.net/ln
参考:https://mirror.tuna.tsinghua.edu.cn/help/raspbian/
参考:https://gpiozero.readthedocs.io/en/stable/
参考:https://docs.docker.com/engine/install/debian/
反向代理
(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。
二、 反向代理服务器的工作原理
如果您的内容服务器具有必须保持安全的敏感信息,如信用卡号数据库,可在防火墙外部设置一个代理服务器作为内容服务器的替身。当外部客户机尝试访问内容服务器时,会将其送到代理服务器。实际内容位于内容服务器上,在防火墙内部受到安全保护。代理服务器位于防火墙外部,在客户机看来就像是内容服务器。 当客户机向站点提出请求时,请求将转到代理服务器。然后,代理服务器通过防火墙中的特定通路,将客户机的请求发送到内容服务器。内容服务器再通过该通道将结果回传给代理服务器。代理服务器将检索到的信息发送给客户机,好像代理服务器就是实际的内容服务器。如果内容服务器返回错误消息,代理服务器会先行截取该消息并更改标头中列出的任何 URL,然后再将消息发送给客户机。如此可防止外部客户机获取内部内容服务器的重定向 URL。
这样,代理服务器就在安全数据库和可能的恶意攻击之间提供了又一道屏障。与有权访问整个数据库的情况相对比,就算是侥幸攻击成功,作恶者充其量也仅限于访问单个事务中所涉及的信息。未经授权的用户无法访问到真正的内容服务器,因为防火墙通路只允许代理服务器有权进行访问。
三、博客反向代理免备案方案 + SLL证书
80端口
。所以我们在nginx
的配置文件中将其端口改为2324
配置如下:
1 | server { |
接着配置服务器A,大体的思路就是在服务器A上配置SSL
证书,默认将80端口
的访问rewrite到443端口
,然后在443端口下进行相关配置。
配置如下:
1 | server { |
如果还要进行图片防盗链、公益404等功能的配置,都可以直接在B服务器2324端口
下配置。
如果有什么疑问可以留言
]]>发现很多使用过的Linux命令总是忘记,所以打算把常用的命名整理到这里 待更新
参数 | 作用 |
---|---|
-P | 设置默认策略 |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I num | 在规则链的头部加入新规则 |
-D | 删除某一条规则 |
-s | 匹配来源地址 IP/MASK,加叹号“!”表示除这个 IP 外 |
-d | 匹配目标地址 |
-i | 匹配从这块网卡流入的数据 |
-o | 匹配从这块网卡流出的数据 |
-p | 匹配协议,如 TCP、 UDP、 ICMP |
–dport num | 匹配目标端口号 |
-sport num | 匹配来源端口号 |
在 iptables 命令后添加-L 参数查看已有的防火墙规则链:
1 | iptables -L |
在 iptables 命令后添加-F 参数清空已有的防火墙规则链:
1 | iptables -F |
把 INPUT 规则链的默认策略设置为拒绝:
1 | iptables -P INPUT DROP |
向 INPUT 链中添加允许 ICMP 流量进入的策略规则:
1 | iptables -I INPUT -p icmp -j ACCEPT |
删除 INPUT 规则链中刚刚加入的那条策略(允许 ICMP 流量),并把默认策略设置为允许:
1 | iptables -D INPUT 1 |
将 INPUT 规则链设置为只允许指定网段的主机访问本机的 22 端口,拒绝来自其他所有主机的流量:
1 | iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT |
注意:防火墙策略规则是按照从上到下的顺序匹配的,因此一定要把允许动作放到拒绝动作前面,否则所有的流量就将被拒绝掉,从而导致任何主机都无法访问我们的服务。
1 | iptables -I INPUT -p tcp --dport 12345 -j REJECT |
1 | iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT |
1 | iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT |
请特别注意,使用 iptables 命令配置的防火墙规则默认会在系统下一次重启时失效
1 | service iptables save |
ACCEPT(允许流量通过)、REJECT(拒绝流量通过)、LOG(记录日志信息)、DROP(拒绝流量通过),DROP是直接将流量丢弃而且不响应;REJECT则会在拒绝流量后再回复一条“您的信息已经收到,但是被扔掉了”信息,从而让流量发送方清晰地看到数据被拒绝的响应信息
与 Linux 系统中其他的防火墙策略配置工具一样,使用 firewalld 配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且随着系统的重启会失效。如果想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用firewall-cmd 命令正常设置防火墙策略时添加–permanent参数,这样配置的防火墙策略就可以永久生效了。但是,永久生效模式有一个“不近人情”的特点,就是使用它设置的策略只有在系统重启之后才能自动生效。如果想让配置的策略立即生效,需要手动执行 firewall-cmd –reload 命令。
1 | firewall-cmd --get-default-zone |
1 | firewall-cmd --get-zone-of-interface=eno16777728 |
1 | firewall-cmd --permanent --zone=external --change-interface=eno16777728 |
1 | firewall-cmd --set-default-zone=public |
1 | firewall-cmd --panic-on |
1 | firewall-cmd --zone=public --query-service=ssh |
1 | firewall-cmd --zone=public --add-service=https |
1 | firewall-cmd --permanent --zone=public --remove-service=http |
1 | firewall-cmd --zone=public --add-port=8080-8081/tcp |
流量转发命令格式为 firewall-cmd –permanent –zone=<区域> –add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标 IP 地址>
1 | firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10 |
1 | ssh -p 888 192.168.10.10 //或者 |
1 | nmcli connection show |
网络回话应用场景:如果我们在公司网络中使用笔记本电脑时需要手动指定网络的IP地址,而回到家中则是使用DHCP自动分配IP地址。这就需要麻烦地频繁修改IP地址,但是使用了网络会话功能后一切就简单多了—只需在不同的使用环境中激活相应的网络会话,可以实现网络配置信息的自动切换了。
con-name
参数指定公司所使用的网络会话名称company
,然后依次用ifname
参数指定本机的网卡名称,用`autoconnect no 参数设置该网络会话默认不被自动激活,以及用 ip4 及 gw4 参数:1 | nmcli connection add con-name company ifname ens33 autoconnect no type ethernet ipv4.addresses 192.168.45.10/24 ipv4.gateway 192.168.45.1 |
1 | nmcli connection add con-name house ifname ens33 |
1 | nmcli connection show |
1 | nmcli connection up house |
1 | nmcli connection delete house |
如果使用的是虚拟机,请把虚拟机系统的网卡(网络适配器)切换成桥接模式
1、Linux下关闭终端继续运行进程
后台运行:
1 | ./test.sh & |
就是在相应命令的后面添加 &
,其他可执行文件一样
关闭终端之后继续运行:
1 | nohup ./test.sh & |
显示当前正在执行的进程:
top命令
2、端口及进程管理
查看端口占用情况:
1 | lsof -i :端口号 |
强制中止端口进程:
1 | kill -9 $(lsof -i tcp:端口号 -t) |
]]>这篇文章中的很多内容来自刘遄老师的《Linux就该这么学》,一来防止忘记,二来方便以后查看。
1 | mysql -uroot -p(密码) |
1 | GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION; |
‘%’代表在任何一台电脑都可以登陆
1 | flush privileges; |
1 | SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user; |
用exit
退出mysql
修改mysql
1 | vim /etc/mysql/mysql.conf.d/mysqld.cnf |
bind-address 127.0.0.1
改为bind-address 0.0.0.0
1 | /etc/init.d/mysql restart |
1 | show global variables like 'port'; |
这篇文章整理一下安装Kali虚拟机的过程,以及一些简单的配置问题。
官网下载Vm虚拟机的压缩包
解压,然后直接在VMware中打开
更改/etc/network/interfaces
文件中的内容
如果虚拟机无法连接网络,在interfaces
中添加:
1 | auto eth0 |
修改并保存,然后/etc/init.d/networking restart
重启网络。
更改/etc/network/interfaces
文件:
1 | auto eth0 |
重启网络同上。
将主机VPN代理设置为允许来自局域网的连接
一般端口都为1080
,也可以自己设置,只要端口不被占用就可以。
然后设置虚拟机网络代理为手动
,设置设置如下:
之后就可以使用google了:
1 | apt-get update |
1 | apt-get install fcitx |
1 | apt-get install fcitx-googlepinyin |
1 | reboot |
之后就可以使用ctrl+空格
切换中英文输入
浏览器中下载chrome的.deb安装包,如下:
然后使用gdebi
进行安装
gdebi
1 | apt-get install gdebi -y |
1 | gdebi google-chrome-stable_current_amd64.deb |
安装后发现chrome无法打开
打开终端,输入
1 | cd /usr/bin |
在最后输入--no-sandbox
,保存。
然后就可以启动chrome了。
终端快捷键
博客一直放在GitHub上面,今天放到了服务器上,记录了一下简单的流程。供大家参考!
hexo相关文章:
1 | yum install git |
1 | adduser git |
1 | ## Allow root to run any commands anywhere |
1 | git ALL=(ALL) ALL |
1 | chmod 400 /etc/sudoers |
1 | sudo passwd git |
su git
切换到git用户,再执行下列操作:1 | # 切换到git用户目录 |
1 | ssh -v git@服务器ip地址 |
这样git用户就添加好了。
1 | yum install gcc-c++ |
Ubuntu系统安装命令如下:
1 | sudo apt-get install libpcre3 libpcre3-dev |
1 | find -name nginx |
如果系统已经安装了nginx,那么就先卸载
1 | yum remove nginx |
然后开始安装
首先进入/usr/local
目录
1 | cd /usr/local |
从官网下载最新版的nginx
1 | wget -c https://nginx.org/download/nginx-1.14.2.tar.gz |
(注:版本号可更改,去官网查看最新版本号修改即可)
解压nginx压缩包
1 | tar -zxvf nginx-1.14.2.tar.gz |
会产生一个nginx-1.14.2 目录,这时进入nginx-1.14.2 目录
1 | cd nginx-1.14.2 |
接下来安装,使用–prefix参数指定nginx安装的目录,make、make install安装
1 | ./configure |
(默认安装在/usr/local/nginx,推荐使用默认设置)
1 | make |
1 | make install |
如果没有报错,顺利完成后,最好看一下nginx的安装目录
1 | whereis nginx |
(where和is要连这些,中间没有空格)
1 | cd /usr/local/nginx/sbin/ |
查询nginx进程:
1 | ps aux | grep nginx |
1 | ./nginx -s quit |
1 | ./nginx -s reload |
启动成功后,在浏览器可以看到如下页面:
即在rc.local增加启动代码就可以了。
1 | vim /etc/rc.local |
增加一行
1 | /usr/local/nginx/sbin/nginx |
到这里,nginx安装完毕,启动、停止、重启操作也都完成。
1 | # 回到git目录 |
我们的git裸仓库已经建立好了,离成功又近了一步。为了以防万一,我们要检查一下之前的blog.git、.ssh、blog目录的用户组权限是否都为git:git
1 | # 还记得/var/www/吗?这是之前配置nginx时,我们自己选定的网站根目录,请依据你自己的设置更改,如果没有的话自己 |
如果有哪个不是,执行下面相应的命令后再查看
1 | sudo chown git:git -R /var/www/blog |
简单来说,我们使用一个钩子文件:post-receive,每当git仓库接收到内容的时候,就会自动调用这个钩子,把内容同步到网站根目录。
在git用户下执行:
1 | # 新建一个post-receive文件并编辑 |
在里面输入以下内容,注意修改为自己的设置:
1 | #!/bin/bash |
保存退出后,进入/home/git/blog.git/hooks
执行:chmod +x post-receive
赋予这个文件可执行权限。
好了,以上就是服务器端需要配置的内容。我们还差最后一步就可以完成整个部署了!
修改上面的配置文件:
1 | vim /usr/local/nginx/conf/nginx_config |
然后修改其中两个部分,如下所示:
然后重启nginx
,方法见nginx安装
部分。
非常简单,只需要找到本地Hexo博客的站点配置文件_config.yml,找到以下内容并修改:
1 | deploy: |
保存后,剩下的就是Hexo的日常操作了,这里就不赘述了,写完文章后,在你的本地博客根目录执行以下命令:
1 | hexo c && hexo g -d |
就可以实现线上博客的自动更新了!一切搞定!
1 | yum -y install vim* |
最近用hexo搭建了自己的博客,之前是挂在GitHub上,今天又将博客放在了自己的服务器上,中间遇到了不少坑,分享一下搭建博客的过程。
hexo相关文章:
[TOC]
大概就这些吧。
安装Hexo
根据官方文档,安装Hexo的前提是先安装Node.js和Git(安装过程很简单,网上有很多教程,此处不详细展开)
安装Hexo只需要在终端(cmd、Git bash、Node.js、command prompt均可)中敲入如下命令:
1 | npm install -g hexo-cli |
建立站点
1 | npm config set registry "https://registry.npm.taobao.org" |
1 | hexo init |
执行完这两条命令后,Blog下的目录结构如下:
_config.yml
文件存放着网站的配置信息,可以在这里配置大部分的参数。package.json
文件存放着插件信息,从中可以查看那些插件已经安装。scaffolds
是模板文件夹,新建文章时,Hexo 会根据 scaffold 来建立文件,不过这个模板和后面的主题里指的模板不一样。source
是存放用户资源的地方的文件夹,除 _posts
文件夹之外,开头命名为 _
(下划线) 的文件 / 文件夹和隐藏的文件将会被忽略。Markdown 和 HTML 文件会被解析并放到 public
文件夹(别急,等下会生成的),而其他文件会被拷贝过去。themes
主题文件夹,Hexo 会根据主题来生成静态页面,我们以后自己安装的主题也都会放在这个文件夹下面,默认的 landscape 主题已经在里面了。hexo server
,可以在 http://localhost:4000/ 中查看网站的样子。_config.yml
文件中,我们暂时可以修改其中的title
,subtitle
和author
,替换成自己网站的名字和作者名字即可。_posts
文件夹下,新建一个 Markdown 文件,或者把你以前有的 Markdown 文件复制进来,根据 Hexo 的官方文档 基本操作 — Front-matter ,写好你的第一篇文章。---
分割线内的内容即为Front-matter1 | hexo generate |
Hexo 会替我们刚加入到 _posts
文件夹下的 markdown 文件生成静态文件。运行 hexo server
可以在 http://localhost:4000/ 中看到我们新添加的网页内容了。至此,我们采用默认主题 landscape 的网站已经生成了,且相信你已经掌握了关于 Hexo 的大部分操作,如果自感还不熟悉,可以再看看 Hexo 的官方文档 开始使用 — 命令,
hexo init [folder]
: 新建一个网站。如果没有设置 folder
,Hexo 默认在目前的文件夹建立网站;hexo generate
: 生成静态文件;hexo server
: 启动服务器。默认情况下,访问网址为: http://localhost:4000/
;hexo deploy
: 部署网站(后文会用得);hexo clean
: 清除缓存文件 (db.json
) 和 public
文件夹下已生成的静态文件。我们可以去 Themes | Hexo 中挑选喜欢的主题。
1 | $ git clone https://github.com/tufu9441/maupassant-hexo.git themes/maupassant |
依此执行上面三条命令,完成安装
Blog/_config.yml
中的theme
的值又默认的landscape
改为maupassant
。1 | hexo clean |
现在我们就可以在本地4000端口查看网站的样式
要在 Github 上创建项目,当然首先需要注册 Github帐号。在注册完成后,Github 的官方文档 Create a new repository on GitHub 已经图文并茂将如何建立一个 repository 交待得非常清楚明白了,唯一要注意的是,第二步里的 Repository name 一定要是 your_name.github.io
,your_name
是你的 Github 用户名。
根据 Github 的官方文档 Setting up Git,这一操作的目的是 Tell Git your name so your commits will be properly labeled 和 Tell Git the email address that will be associated with your Git commits,也就是告诉版本控制软件 Git 接下来这台电脑上提交的文件是 E-mail 地址是什么的谁谁谁提交的。在 Git Bash 中执行如下代码即可:
1 | git config --global user.name "YOUR NAME" |
其中,YOUR NAME
是自己取的名字,YOUR EMAIL ADDRESS
是自己的邮箱。由于自己的博客网站就自己一个人提交,所以就都设置成跟 Github 用户名和邮箱相同了。但其实是可以不同的,因为对于很多项目,并不只有一个开发者,Github 允许多人向同一个 Repo 提交,这里提供用户名和邮箱,只是为了搞清楚哪些代码是谁谁谁提交的。
根据 Github 的官方文档 Generating a new SSH key , 我们在 Git Bash 下执行如下命令,生成 SSH key
1 | ssh-keygen -t rsa -b 4096 -C "your_email@example.com" |
其中,`your_email@example.com` 是你的 Github 注册邮箱。然后,Git Bash 中会出现
1 | Generating public/private rsa key pair. |
表示新的 SSH 已经生成了。随后会出现
1 | Enter a file in which to save the key |
这里 id_rsa
是生成的 key 文件的文件名,默认都是这个;如果不是,在后面用到 id_rsa
的地方请替换成出现的名字。这条信息是让你选择 SSH key 存放的地点,按回车选择默认的即可。回车后,还会出现
1 | Enter passphrase (empty for no passphrase): [Type a passphrase] |
让你设置使用 SSH 密钥时的密码,由于我们都是在自己个人的电脑上操作,所以仍然回车,不设置密码即可。
根据 Wikipedia,ssh-agent 是一个在本地登录会话持续时间内,将未加密的密钥存储在内存中,并使用 Unix 域套接字与 SSH 客户端进行通信的程序。根据 Github 的官方文档 Adding your SSH key to the ssh-agent , 我们在 Git Bash 下执行如下命令,开启 ssh-agent
1 | eval "$(ssh-agent -s)" |
然后我们要将这个 SSH key 添加到 ssh-agent 里去,运行如下命令,其中 id_rsa
是你的 key 文件的文件名:
1 | ssh-add ~/.ssh/id_rsa |
Github 的官方文档 Adding a new SSH key to your GitHub account 已经图文并茂将如何在 Github
帐号中添加 SSH 介绍的非常清楚了。先是在 Git Bash 中将 SSH Key 拷贝出来:
1 | $ clip < ~/.ssh/id_rsa.pub |
id_rsa
是你刚才的 SSH Key 文件。此时,SSH Key 已经在我们的剪切板里了。然后登录 Github 帐号,依次点击自己的头像,Settings,SSH and GPG keys,New SSH key 或者 Add SSH key, 在 Title 这里输入 Key 的label,比如 your_name - PC
,然后在 Key 里面把 SSH Key 粘贴进去,点击 Add SSH key 大功告成。
回想一下,操作了那么多 SSH 相关的命令,我们在干嘛?个人的理解,就是在生成身份认证的凭证 SSH key,分别放在自己本地电脑和 Github 服务器上,以后向 Github 提交内容的时候,两者的 Key 匹配就可以了,省去了我们每次输密码的时间。
在大功告成之前,为了稳妥起见,我们来测试一下自己跟 Github 服务器 SSH 连接是否已经建立起来了。Github 的官方文档 Testing your SSH connection 已经将次环节介绍得非常详细了。我们要做得就是在 Git Bash 中敲入
1 | ssh -T git@github.com |
你可能会看到类似于
1 | The authenticity of host 'github.com (192.30.252.1)' can't be established. |
没关系的,输入 yes
敲回车,就可以看到如下的成功信息了
1 | Hi username! You've successfully authenticated, but GitHub does not |
至此为止,我们已经建立起了跟 Github 服务器的连接。其实我们也可以用 git push
命令,提交 public
文件夹下面的内容,不过 Hexo 更我们提供了更方便的途径。
Hexo 提供了 hexo deploy
命令,可以方便地将整个 public
文件夹部署到 Github 服务器上去。根据 Hexo 的官方文档 基本操作 — 部署 我们只需要做以下两步:
hexo-deployer-git
插件:1 | npm install hexo-deployer-git --save |
_config.yml
中的参数:1 | deploy: |
其中,your_name 是你的 Github 帐号名。repo
对应的是你 your_name.github.io
这个项目的库(Repository)地址,进入这个项目的主页,点击 Clone or download 下拉菜单也能看到。branch
是分支名称,如果使用的是 GitHub 或 GitCafe 的话,程序会尝试自动检测,通常都是 master
。 注意,冒号后的空格非常重要,一定要有!
看到这里,恭喜你已经拥有了域名为 your_name.github.io
的个人博客网站了,进一步的,就是希望能够在浏览器中输入自己的域名,比如 your.site
,就可以看到自己的网站。停下来思考一下,要实现这一目的,我们需要干什么?首先,当然我们要去买一个域名。买完域名后呢?怎么要让浏览器知道这个域名对应的网站内容在 Github 服务器上?这就是域名解析的事情啦。这是浏览器这里,还有 Github 服务器呢?Github 服务器上存放着那么多个人网站,怎么在收到浏览器一个要访问我的域名为 your.site
这个站点内容的时候,准确的把我的站点的内容送出来呢?这就是要在自己提交的 public
文件夹下添加 CNAME
文件了。一共 3 个环节,我们一个一个来介绍。
我的域名是在阿里云的万网上买的
阿里云提供域名的免费解析,当然你也可以其他的域名解析服务
GitHub
your_name.github.io
对应那个域名在 source
文件夹下添加一个 CNAME
文件,里面就一行内容,写上自己的域名,比如 your.site
。 在终端中运行
1 | hexo generate |
Hexo 在生成 public
文件夹内容的时候,会自动把 CNAME
文件复制过去,这样,public
文件夹下就也有 CNAME
文件了。再运行
1 | hexo deploy |
将其部署到 Github,让 Github 知道 your_name.github.io
对应哪个域名。
其实官方文档说的已经很清楚了,当然还是有一些小坑,我就填一下吧。
hexo相关文章:
等等
Hexo添加评论系统,这篇文章写的很详细,步骤都很简单
_config.yml
文件中的busuanzi
为true1 | if theme.busuanzi == true |
将上面代码中的dn-lbstatics.qbox.me
修改为busuanzi.ibruce.info
即可。
注:
添加捐赠按钮
首先修改主题中间中donate相关的配置,再将相应的图片放到\themes\maupassant\source\img\
文件夹下
网站图片
若要设置网站Favicon,可以将favicon.ico放在Hexo根目录的source文件夹下,建议的大小:32px*32px。
注:因为浏览器缓存的原因,可以换个浏览器,或者等待一段时间重新加载
添加页面
在根目录的source文件夹下添加相应的文件夹,例如:about、guestbook、history等。并在相应的文件中添加index.md
文件。
根目录下的source目录结构如下:
![目录结构](https://lihtao-1257343120.cos.ap-shanghai.myqcloud.com/blog/hexo2.png)
设置中文
将根目录下的_config.yml
中的language
设置如下:
1 | language: zh-CN |
即可
申请友链最好直接发邮件给我,博客的留言邮件提醒功能时好时坏