之前因为学习 Docker 也总结了一批经常使用的 Docker 命令 然后回头过来看唯独漏掉了 Docker 监控的一块,一方面也是当时看的文档并没有覆盖到这个领域,另一方面也是最近看到 Google cAdvisor 才开始注意到 Docker 监控的命令。
直接运行,查看所有当前运行的 Docker 状态及资源消耗
docker stats
该命令执行后会返回下列数据
查看容器中启动的进程
docker top [CONTAINER] [ps options]
使用如下命令查看容器日志
docker logs [OPTIONS] CONTAINER
使用参数 -f
来追踪打印未来的日志
docker logs -f CONTAINER
Linux 下查看网络流量的命令有很多,之前 也介绍过使用 nethogs
来按照进程查看网络流量。但其实 Linux 下有很多命令同样可以达到效果。
使用 apt install bmon
安装,使用非常简单直接运行即可。
bmon
的介绍说是一个网络监控和调试工具,能够提供一个可视化的界面。
其他还有 nload, slrum, speedometer, netload
常用的有 iftop,iptraf
iftop 使用 pcap 库来捕获进出网络适配器的数据包,然后汇报总数据包大小和数量。iftop 报告每一个连接所使用的带宽,但是没有办法报告进程名和编号。使用 iftop
时如果系统包含多个网络接口可能需要指定监控的接口 sudo iftop -i eth0
,类似 top 命令,iftop
可以在运行时改变显示:
h
帮助n
是否解析域名s
是否显示源地址d
是否显示目标地址S
是否显示端口号iptraf 是一款交互式的网络监控工具,它可以显示每个连接和主机之间的传输数据。按连接/端口查看流量。
ifstat: 按设备查看流量
[[ethtool]]: 诊断工具
ss: 连接查看工具
本篇文章主要介绍 Linux 下几款常用的启动器,启动器顾名思义就是用来快速开启应用程序的程序。启动器最常用的功能就是用来快速启动另外一个程序,但是一款好的启动器应该提供一些常用的功能,比如说base64 编解码,比如当前Unix时间戳,再比如搜索Google,计算器,打开文件,单位转化,甚至是执行系统命令等等。
本文主要要介绍的是这三款: GNOME Do,cerebroApp,albertlauncher。
GNOME Do 是最初由David Siegel开发的一个GNU/Linux下的流行的自由应用程序启动器1,GNOME Do 不仅能够用来启动程序,也能够快速打开文件,控制媒体文件等等。
通过下面命令安装
sudo apt install gnome-do
他的官网地址:https://do.cooperteam.net/ 安装之后我最喜欢的设置就是将启动 Do 的快捷键设置为 Alt+Space
不过可惜的是 GNOME Do 已经很多年没有更新 ,版本也永远的停留在了 GNOME Do 0.95。总结来看 Do 虽然不是最好的启动器,但是应付日常使用完全没有任何问题。
cerebroApp 是一款用 Javascript 实现的启动器,跨平台,支持插件,界面友好。一般启动器能够实现的功能他都有。安装方法可参考其官网: https://cerebroapp.com/ 非常简单,几乎一键。
代码地址: https://github.com/KELiON/cerebro
当尝试在 Perferences 中修改启动快捷键时你会发现无法修改,查看官方的文档可以看到:
Config file path
Windows: %APPDATA%/Cerebro/config.json
Linux: $XDG_CONFIG_HOME/Cerebro/config.json or ~/.config/Cerebro/config.json
macOS: ~/Library/Application Support/Cerebro/config.json
修改配置文件,可以看到默认定义的快捷键是 Control + Space
我习惯使用 Alt + Space
安装插件非常简单,在 cerebro 中直接输入 plugins hash
即可。
在 Cerebro 中访问粘贴板 https://github.com/codingmatty/cerebro-plugin-clipboard
直接在 Cerebro 中获取 hash ,安装 cerebro-hash ,然后先键入 hash 加上空格后面是需要 hash 的字符串。
hash [input]
hash (algorithm) [input]
(algorithm) [input]
有道翻译插件 https://github.com/lcjnil/cerebro-youdao 输入 youdao hello
来查询
还有 BASE64 加密解密,时间戳 等等插件,自己添加即可。
更多有用的 Cerebro 扩展插件可以在这里获取: https://github.com/lubien/awesome-cerebro
同样是一款开源启动器,不过他只有 Linux 版本,安装过程也是比较简单。功能区别不是很大。它使用 C/C++ Qt 写成。同样支持插件。
安装过程可参考: https://albertlauncher.github.io/docs/installing/
项目地址: https://github.com/albertlauncher/albert
总的来说比较推荐 cerebroApp ,在三者区别不大的情况下,跨平台还是比较吸引我的,并且UI小清新。
uniq 命令从标准输入读取过滤邻近的相同的行,然后写回标准输出,在此过程中 uniq 会将重复的行 merge 合并到第一个结果中,所以 uniq 可以用来排除文件中重复的行。因此 uniq 经常和 sort 合用,先排序,然后使用 uniq 来过滤重复行。
查看 man uniq
得知这个命令是用来显示,或者隐藏重复行的命令,一般情况下使用管道命令组合其他 cat
, grep
, awk
, sort
等等使用。可用来过滤重复行,或者找到文本中重复的行。
命令格式:
uniq [OPTION]... [INPUT [OUTPUT]]
uniq
会从标准输入读取数据,过滤相邻的行,并将结果输出到标准输出。如果没有其他选项,重复的行会合并到第一次出现的行上。
uniq
的基本使用如下:
一些常用参数
-c
在每一行前打印行出现的次数-d
只打印重复的行,重复的行只打印一次-D
打印出所有重复的行-f
在比较时跳过前 N 个 fields-i
在比较重复行时忽略大小写-s
在比较时忽略前 N 字符-u
只打印唯一的行-w
比较时只比较每一行的前 N 个字符通常情况下 field 是由空格或者 TABs 分割的。
通常情况下,uniq
会和 sort
搭配使用。
命令返回 0
或者 >0
的数值表示退出,如果为 0
表示运行成功,>0
的数值表示发生错误。
假设有如下四行在文件 cat file.txt
中:
uniq line
repeat line
test line
repeat line
最为常用的 -c
选项,可以打印重复行的数量
sort file.txt | uniq -c
2 repeat line
1 test line
1 uniq line
使用 -d
打印重复的行,那么不重复的行就不会输出
sort file.txt | uniq -dc
2 repeat line
显示不重复的行 -u
sort file.txt | uniq -u
test line
uniq line
可以使用 -s
参数跳过开头 N 个字符
cat /var/log/nginx.log | uniq -s 10
如果想要科学的管理 Linux 的开机启动项,那么了解 Linux 开机启动流程是非常有必要的。链接的文章将 Linux 开机启动流程讲述的非常通俗易懂,这里就不再详述。简单地归纳:
/boot
目录下内核文件/sbin/init
(PID 为 1),用来初始化系统环境这篇文章涉及到的开机启动项内容主要就是集中在上述的第 3,4 步。Linux 预置七种运行级别 (0-6),系统在 /etc
目录会有各个运行级别对应的子目录,目录中指定要加载的程序
/etc/rc0.d /etc/rc1.d /etc/rc2.d /etc/rc3.d /etc/rc4.d /etc/rc5.d /etc/rc6.d
目录中的 rc
表示 run command,最后的 d
表示 directory 目录。/etc/rcN.d
(其中 N 表示的 run level) 目录下是一系列启动脚本。文件都是以 字母 S+ 两位数字 + 程序名
的形式构成。字母 S 表示 Start,如果第一个字母是 K,那么表示 Kill 关闭。中间两位数字表示处理顺序,数字越小表示处理越早。不建议直接手动修改 /etc/rcN.d
目录下的文件。这就要涉及到本文的重点,如何科学的管理 Linux 自启动脚本。
使用命令 apt-get install rcconf
来安装, rcconf 使用了一个非常友好的界面来管理启动项,使用 sudo rcconf
就能看到一个开机启动时可以执行的程序列表,使用空格选中就能添加到开机启动,同理撤销选中就取消开机启动,最后 OK,保存就行。rcconf 是 update-rc.d
命令的 TUI(Text User Interface)。
几个重要的文件
/var/lib/rcconf/services
用来保存服务启动 number,如果服务的启动顺序不是 20(默认),那么 rcconf 会将服务的启动顺序保存到该文件中以备重新启用时恢复。/var/lib/rcconf/lock
Lock 锁/var/lib/rcconf/guide
管理员用来定义的 Guide上一个 rcconf
命令中就提到了其实 rcconf 就是这个 update-rc.d
命令的封装,update-rc.d
命令可以用来安装或者移除 init 脚本。
update-rc.d [-n] [-f] name remove
update-rc.d [-n] name defaults
update-rc.d [-n] name disable|enable [ S|2|3|4|5 ]
其中 -n
选项,不会做任何实际操作,但是会显示运行命令之后会执行的操作,可以用来检查命令。-f
命令可以记忆为 force
表示强行删除链接。
当执行该命令时,就是用将 /etc/rcN.d/[SK]NNname
指向 /etc/init.d/name
,如果有任何的 /etc/rcN.d/[SK]??name
存在的话,update-rc.d
不会做任何改动。
update-rc.d service enable
update-rc.d samba defaults
update-rc.d mysql defaults 10 10 # 启动优先级,顺序
update-rc.d apache2 start 10 2 3 4 5 . stop 90 0 1 6 . # 指定优先级,启动时 10,关闭时 90,后面的 `2 3 4 5` 表示 run level
update-rc.d -f samba remove # 移除服务自启动
使用命令安装 apt-get install sysv-rc-conf
,然后使用管理员运行 sudo sysv-rc-conf
。
还有一个命令 systemctl
涉及太多 systemd
的内容,暂时先略过
如果先要自己写一个服务,或者脚本开机启动,那么可以把文件放到 /etc/init.d/
目录下,改权限
chmod +x /etc/init.d/startup.sh
ln -s /etc/init.d/startup.sh /etc/rc.d/
ed
是一个面向行的文本编辑器。ed
命令还有一个严格的 red
命令,red
命令只能编辑当前目录中的文件,并且不能够执行shell命令。
当使用 ed
命令明确指定一个文件时,文件的一份拷贝被读入编辑器的缓存,所有的编辑都是保存在缓存中,而不是直接在文件中修改。如果退出 ed
却没有显示的使用 w
命令来保存修改的话,所有的修改内容都会丢失。
编辑的内容可以通过两种不同的方式:command
和 input
两种模式。使用第一种命令模式时,ed
命令通过从标准输入读取命令并将修改执行在编辑器缓存中。一个典型的命令
,s/old/new/g
这一行命令会将文本中所有的 old 字符串替换为 new,这和vim中有些相似。
当使用命令输入比如,a
(append), i
(insert), c
(change) 时,ed
编辑器会进入 input
模式,这意味着给文件添加内容。在这个模式中所有命令都不再支持,相反的,所有的输入都会被写到缓冲中。input
模式将在输入 .
时自动结束并退出。
ed
编辑器的命令针对的是整行,或者数行,比如,d
命令意味着删除行,m
命令意味着移动行。如果要修改某一行中的内容,唯一的方法就是使用替换,就和上面的例子中类似。例子中的 s
命令也是针对的整行。
通常来说,ed
编辑器包含0或者多行行序号,通常后面跟随着命令及参数,他的基本结构如下:
[address [,address]] command [parameters]
address 通常包含一行或者多行
可以使用下面的方式来表示行序号,以下所有的行序号都是 buffer 缓冲中行序号:
Tag | Description |
---|---|
. |
buffer 中 当前行 |
$ |
最后一行 |
n |
第 n 行,行的范围是 [0,$] |
- or ^ |
前一行 |
-n or ^n |
前 n 行 |
+ or +n |
后一行及后n行 |
, or % |
全部行,等同于 1,$ |
; |
当前行到最后一行 .,$ |
/re/ |
下一个包含正则 re 的行 |
?re? |
上一个包含正则 re 的行 |
所有的 ed
命令都是单个字符,一些需要其他额外的参数。如果命令跨越了多行,每一行都需要 \
来结尾。p
(print),l
(list) 或者 n
(enumerate) 打印。如果输入了 ed
不认识的命令,ed
会打印一个 ?
作为错误消息。
Command | Description |
---|---|
(.)a | 添加到行 |
(.,.)c | 改变行 |
(.,.)d | 删除行 |
(.)i | 添加到行首 |
还有很多命令可以参考下面的链接。
通常情况下,输入数字开始的行号,可以直接跳转到该行。
ed
的一个更有趣的特征是脚本化编辑工作的能力,将编辑命令放到独立的文件中并将它们作为行编辑器的输入:
ed filename < ed_script
这个特征使得 ed 成为了可编程的编辑器,也就是说,可以脚本化任何手动执行的操作。
sed 是作为特殊目的的编辑器而创建,专门执行脚本,与 ed 不同,不能交互使用。 sed 与 ed 的主要区别在于它是面向字符流的。默认情况下 sed 的所有输入都会经过处理并且转为标准输出。输入文件本身并不发生改变。如果想要改变输入文件,一般使用 shell 的重定向。ed 不是面向字符流的,并且文件本身会发生改变,ed 脚本必须包含保存文件并且退出编辑器,不能输出到屏幕。
awk 是作为可编程的编辑器而开发的,同 sed 一样,面向字符流,并且解释编辑命令的脚本。awk 与 sed 不同的是它废弃了行编辑器的命令集,提供了仿效 C 语言的程序设计语言,例如使用 print 语句代替了p 命令,但延续了 寻址的概念
/regular/ { print }
用来打印匹配 regular
的行。脚本张使用程序语言的优点是提供了控制编程的语句,包括表达式,条件判断,循环等等结构。
虽然 Linux 下有很多方式可以重命名文件,比如 mv filename newfilename
,设置可以使用 cat
命令来将一个文件输出重定向到文件 cat file > newfile
,或者可以拷贝的时候重命名 cp file newfile
。
但是其实 Linux 下有一个命令 rename
顾名思义,就是用来重命名文件的,并且能够按照正则批量重命名文件。他的基本使用方式就是
rename [options] "s/oldname/newname/" file
这个命令可以分开几部分来讲,首先对于整体命令先不看选项(options) 部分
rename "s/oldname/newname/" file
其中包含三个部分:
其中每一个部分都可以使用正则,以上命令的解释可以理解为对于要重命名的 file 匹配的文件列表,将文件名中的 oldname 替换为 newname。
然后再来看选项options 部分,rename
支持以下的选项:
-v
将重命名的内容都打印到标准输出,v 可以看成 verbose-n
测试会重命名的内容,将结果都打印,但是并不真正执行重命名的过程-f
force 会覆盖本地已经存在的文件-h
-m
-V
分别为帮助,帮助,版本-e
比较复杂,可以通过该选项,写一些脚本来做一些复杂的事情rename 支持通配符
? 可替代单个字符
* 可替代多个字符
当命令中最后 file 为 *
时表示,匹配当前文件夹下所有文件,如果为 ?
时则匹配只有一个字符的文件名。
rename
支持 perl 的正则表达式
rename "s/AA/aa/" * # 把文件名中的AA替换成aa
这一行命令的解释就是,对当前文件夹下满足 *
的所有文件,文件名中包含 AA
字符的替换为 aa
其中 "s/pattern/new/"
中的 /
一个都不能少。
rename "s/.html/.php/" * # 把.html 后缀的改成 .php后缀
rename "s/.png/.jpg/" * # 将 png 改为 jpg
批量修改文件后缀名
或者匹配最后的部分:
rename "s/oldExt$/newExt/" *.oldExt
rename "s/$/.txt/" * # 把所有的文件名都以txt结尾
因为支持正则表达式,那么 $
表示的就是结尾,将结尾替换为 .txt
也就意味着给所有文件添加 .txt
的后缀
rename "s/.txt//" * # 把所有以.txt结尾的文件名的.txt删掉
同理,结尾有 .txt
的内容替换为空,也就是删掉后缀了。
假如需要在批量修改的时候保留部分文件名,可以使用引用 \1
,比如有下面格式的文件
Screenshot from 2019-01-02 15-56-49.jpg
我只希望保留其中的日期部分,那么可以
rename -n "s/Screenshot from ([0-9\\- ]+).jpg/\1.jpg/" *
将 ()
匹配的内容取出来放到替换部分。
MyBatis generator 自动生成的 mapper 文件中有两个 insert 方法,insert
和 insertSelective
,这两个方法都可以插入一条数据
对于 insert:
int insert(T record);
对于 insertSelective
int insertSelective(T record);
insertSelective
对应的 SQL 语句加入了 NULL 检验,只会插入数据不为 null 的字段,而 insert
会插入所有字段,会插入 null 数据。
也就意味着如果定义了表 default 字段,使用 insert 还是会插入 null 而忽略 default
insertSelective 当字段为 null 时会用 default 自动填充。
同理,更新 update 的操作也有对应的两个方法
updateByPrimaryKey
对你注入的字段全部更新(不判断是否为 Null)updateByPrimaryKeySelective
会对字段进行判断再更新(如果为 Null 就忽略更新)和 insert , insertSelective 类似,带有 selective
的方法会检查对象的值是否 null,如果为 null 则不会更新。
v2ray 是一个模块化的代理工具,支持 VMess,Socks,HTTP,Shadowsocks 等等协议,并且附带很多高级功能,HTTP 伪装, TLS 等等。
root 账户下执行
bash <(curl -L -s https://install.direct/go.sh)
该脚本会自动安装 unzip
和 daemon
。脚本执行成功后,进行如下操作:
vim /etc/v2ray/config.json
来配置service v2ray start
来启动 v2rayservice v2ray start|stop|status|reload|restart|force-reload
来控制 v2rayv2ray 使用 JSON 格式的配置文件,大致配置格式如下:
{
"log": {},
"dns": {},
"routing": {},
"policy": {},
"inbound": {},
"outbound": {},
"inboundDetour": [],
"outboundDetour": [],
"transport": {}
}
更加详细的配置详解可以参考官方的文档
v2ray 支持以下协议,默认的协议为 VMess
如果想要修改 clients 下面的 id,可以访问 https://www.uuidgenerator.net/ 网站生成 UUID,对于服务端配置来说,主要关心 inbound
中配置,包括端口,协议,和 id 以及 alterId。这些配置需要和客户端一致。
{
"log" : { // 日志配置
"access": "/var/log/v2ray/access.log", // 访问日志
"error": "/var/log/v2ray/error.log", // 错误日志
"loglevel": "warning" // 日志等级
},
"inbound": { // 主传入连接
"port": 10800, // 端口
"protocol": "vmess", // 协议
"settings": {
"clients": [
{
"id": "d931e571-c9d2-4527-9223-9ef1cdeaf4b2", // 客户端需要和服务端一致
"level": 1,
"alterId": 64 // 客户端需要和服务端一致
}
]
}
},
"outbound": {
"protocol": "freedom",
"settings": {}
},
"outboundDetour": [
{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}
],
"routing": {
"strategy": "rules",
"settings": {
"rules": [
{
"type": "field",
"ip": [
"0.0.0.0/8",
"10.0.0.0/8",
"100.64.0.0/10",
"127.0.0.0/8",
"169.254.0.0/16",
"172.16.0.0/12",
"192.0.0.0/24",
"192.0.2.0/24",
"192.168.0.0/16",
"198.18.0.0/15",
"198.51.100.0/24",
"203.0.113.0/24",
"::1/128",
"fc00::/7",
"fe80::/10"
],
"outboundTag": "blocked"
}
]
}
}
}
观察服务端配置基本上能看到两大块重点,一个重点就是 inbound
另一个重点就是 outbound
,对应客户端也是同样的配置,对于服务端来说,他的流入就是客户端的流出,对于服务端来说,需要在 inbound
中配置,然后客户端需要在 outbound
中配置和服务端一致的配置,然后就能连入。
根据自己的系统选择下载客户端版本:https://github.com/v2ray/v2ray-core/releases
客户端配置中,需要特殊关心的就是 outbound
中内容,需要关心服务器地址,端口,ID,和 alterId。
{
"inbound": {
"port": 1080, // 监听端口
"protocol": "socks", // 入口协议为 SOCKS 5
"settings": {
"auth": "noauth" //socks 的认证设置,noauth 代表不认证,由于 socks 通常在客户端使用,所以这里不认证
}
},
"outbound": {
"protocol": "vmess", // 出口协议
"settings": {
"vnext": [
{
"address": "serveraddr.com", // 服务器地址,请修改为你自己的服务器 ip 或域名
"port": 16823, // 服务器配置端口
"users": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811", // 用户 ID,必须与服务器端配置相同
"alterId": 64 // 此处的值也应当与服务器相同
}
]
}
]
}
}
}
总的来说,各大客户端只需要关心几个配置,服务器地址,配置协议,端口,及认证方式。对于 VMess 协议,需要知道 id,alterId。
下载对应 Linux 的客户端,执行 ./v2ray --config=config.json
来启动客户端,如果看到日志正常表示已经连接成功。
Linux GUI
Linux 客户端可参考 https://github.com/jiangxufeng/v2rayL
安装方法:
bash <(curl -s -L http://dl.thinker.ink/install.sh)
更新及卸载方法见 GitHub 页面。
2021 年更新
Linux 下推荐自己使用 Clash 命令行,或者 Clash For Windows 的 Linux 版本。
类似 Linux,启动客户端配置本地,其他选择还有
Windows 下 V2RayW, MacOS 下 V2RayX。
macOS 下推荐 ClashX(ClashX Pro),或者 Clash For Windows 的 macOS 版本,使用体验非常不错。
Android 客户端现在为止有 V2RayNG、Actinium,本人测试前一个比较好用,但是也存在问题,长时间连接容易掉线。
2020 年更新,推荐一款 BifrostV 的应用,Play Store 有下载。
2021 年,Android 上推荐 Clash 这个应用。
使用 ShadowRocket,美区下载,支持 VMess 协议。如果没有 ShadowRocket ,其他可供选择的还有 Kitsunebi 和 ShadowRay ,如果 App Store 搜不到请用美区账号。
也不废话了直接放链接:
在花费了一些精力和防火墙躲猫猫后,我也没有太多的时间再投入到自己找服务器,自己搭建服务,遇到单点故障后也没有再继续,所以后面渐渐的用了认识人一起共建的 SS 和 SSR,而最近用了一段时间的 无界 感觉日常使用也没啥问题,所以也在此推广一下。无界不仅可以使用如上提到的所有兼容 v2ray 的 客户端,也在他们后台提供了定制版本的客户端,方便小白使用。
如果你也熟悉了 Clash 在 Android/iOS,macOS/Windows/Linux 上的使用,也欢迎使用这个服务,一键订阅使用 Board。
另外也写了一篇文章来告诉你如何对对一家代理服务进行测速。你可以根据自身的情况合理的选择。
如果不折腾 v2ray 那么也推荐 Cisco 的解决方案,香港的 VPN,可以访问其官网查看具体使用,或者直接访问注册页面。
ownCloud 是一个文件分享服务,可以将个人的文件内容,比如文本,图片,音频等等存储到一个中心服务器上,类似于 Dropbox。但是与 Dropbox 不同之处在于 ownCloud 是开源的,任何人都可以检视其源代码并且可以为之贡献代码,这意味着他将文件的控制权交给了个人,敏感的文件任何人都无法查看,但于此同时他也将文件的安全交给了个人管理。
[[OwnCloud]] 安装之前确保有 sudo
权限,并且 ownCloud 需要
安装
apt install nginx mysql-server php7.0 php-bz2 php-curl php-gd php-imagick php-intl php-mbstring php-xml php-zip
更多的安装详细教程可以查看 DigitalOcean 的教程
按照教程 使用 snap 安装。
或者手动安装