Linux 下几款快速启动器

本篇文章主要介绍 Linux 下几款常用的启动器,启动器顾名思义就是用来快速开启应用程序的程序。启动器最常用的功能就是用来快速启动另外一个程序,但是一款好的启动器应该提供一些常用的功能,比如说base64 编解码,比如当前Unix时间戳,再比如搜索Google,计算器,打开文件,单位转化,甚至是执行系统命令等等。

本文主要要介绍的是这三款: GNOME Do,cerebroApp,albertlauncher。

GNOME Do

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

cerebroApp 是一款用 Javascript 实现的启动器,跨平台,支持插件,界面友好。一般启动器能够实现的功能他都有。安装方法可参考其官网: https://cerebroapp.com/ 非常简单,几乎一键。

代码地址: https://github.com/KELiON/cerebro

改变快速启动hotkeys

当尝试在 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

albertlauncher

同样是一款开源启动器,不过他只有 Linux 版本,安装过程也是比较简单。功能区别不是很大。它使用 C/C++ Qt 写成。同样支持插件。

安装过程可参考: https://albertlauncher.github.io/docs/installing/

项目地址: https://github.com/albertlauncher/albert

总的来说比较推荐 cerebroApp ,在三者区别不大的情况下,跨平台还是比较吸引我的,并且UI小清新。

  1. 参考维基 


2018-02-09 linux , launcher , command , app

每天学习一个命令:uniq 打印唯一行

查看 man uniq 得知这个命令是用来显示,或者隐藏重复行的命令,一般情况下使用管道命令组合其他 cat, grep, awk, sort 等等使用。可用来过滤重复行,或者找到文本中重复的行。

基本使用

uniq 的基本使用如下:

uniq [OPTION]... [INPUT [OUTPUT]]

uniq 会从标准输入读取数据,过滤相邻的行,并将结果输出到标准输出。如果没有其他选项,重复的行会合并到第一次出现的行上。

一些常用参数

  • -c 在每一行前打印行出现的次数
  • -d 只打印重复的行,重复的行只打印一次
  • -D 打印出所有重复的行
  • -f 在比较时跳过前N个fields
  • -i 在比较重复行时忽略大小写
  • -s 在比较时忽略前N字符
  • -u 只打印唯一的行
  • -w 比较时只比较每一行的前N个字符

通常情况下field是由空格或者 TABs 分割的。

通常情况下,uniq 会和 sort 搭配使用。

命令返回 0 或者 >0 的数值表示退出,如果为 0 表示运行成功,>0 的数值表示发生错误。

实例

打印重复行的数量

sort file.txt | uniq -c

可以使用 -s 参数跳过开头N个字符

cat /var/log/nginx.log | uniq -s 10

2018-02-06 uniq , linux , command , awk

Linux 管理开机启动

如果想要科学的管理Linux 的开机启动项,那么了解 Linux 开机启动流程是非常有必要的。链接的文章将Linux开机启动流程讲述的非常通俗易懂,这里就不再详述。简单地归纳:

  1. 加载内核 ,读入 /boot 目录下内核文件
  2. 内核加载完成后,运行第一个程序 /sbin/init(PID为1),用来初始化系统环境
  3. 依据运行级别启动守护进程(daemon 或者称为服务)
  4. 加载开机启动程序
  5. 用户登录
  6. 进入login shell,依据不同的登录方式(命令行登录,ssh登录,图形界面登录),系统加载不同的shell配置,基本上就完成启动了

这篇文章涉及到的开机启动项内容主要就是集中在上述的第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自启动脚本。

rcconf

使用命令 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

update-rc.d

上一个 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       # 移除服务自启动 

sysv-rc-conf

使用命令安装 apt-get install sysv-rc-conf ,然后使用管理员运行 sudo sysv-rc-conf

systemctl

还有一个命令 systemctl 涉及太多 systemd 的内容,略过

手动

如果先要自己写一个服务,或者脚本开机启动,那么可以把文件放到 /etc/init.d/ 目录下,改权限

chmod +x /etc/init.d/startup.sh
ln -s /etc/init.d/startup.sh /etc/rc.d/

reference


2018-02-05 linux , startup , script , shell , command

每天学习一个命令:ed 行编辑器

ed 是一个面向行的文本编辑器。ed 命令还有一个严格的 red 命令,red 命令只能编辑当前目录中的文件,并且不能够执行shell命令。

当使用 ed 命令明确指定一个文件时,文件的一份拷贝被读入编辑器的缓存,所有的编辑都是保存在缓存中,而不是直接在文件中修改。如果退出 ed 却没有显示的使用 w 命令来保存修改的话,所有的修改内容都会丢失。

编辑的内容可以通过两种不同的方式:commandinput 两种模式。使用第一种命令模式时,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 通常包含一行或者多行

Line Address

可以使用下面的方式来表示行序号,以下所有的行序号都是 buffer 缓冲中行序号:

Tag Description
. buffer 中 当前行
$ 最后一行
n 第 n 行,行的范围是 [0,$]
- or ^ 前一行
-n or ^n 前 n 行
+ or +n 后一行及后n行
, or % 全部行,等同于 1,$
; 当前行到最后一行 .,$
/re/ 下一个包含正则 re 的行
?re? 上一个包含正则 re 的行

Commands

所有的 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 的行。脚本张使用程序语言的优点是提供了控制编程的语句,包括表达式,条件判断,循环等等结构。

reference


2018-02-02 linux , command , unix , ed , line , editor

每天学习一个命令: rename 批量修改文件名

虽然 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

其中包含三个部分:

  • 原字符串oldname:将要被替换的字符串;
  • 目标字符串newname:原字符替换成的目标字符串;
  • 文件file:指定要改变文件名的文件列表。

其中每一个部分都可以使用正则,以上命令的解释可以理解为对于要重命名的 file 匹配的文件列表,将文件名中的 oldname 替换为 newname。

然后再来看选项options 部分,rename 支持以下的选项:

  • -v 将重命名的内容都打印到标准输出,v 可以看成 verbose
  • -n 测试会重命名的内容,将结果都打印,但是并不真正执行重命名的过程
  • -f force 会覆盖本地已经存在的文件
  • -h -m -V 分别为帮助,帮助,版本
  • -e 比较复杂,可以通过该选项,写一些脚本来做一些复杂的事情

rename 支持通配符

?  可替代单个字符
*  可替代多个字符

当命令中最后 file 为 * 时表示,匹配当前文件夹下所有文件,如果为 ? 时则匹配只有一个字符的文件名。

rename支持正则表达式

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/$/.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/" *

() 匹配的内容取出来放到替换部分。


2018-01-31 linux , command , rename , file

v2ray

v2ray 是一个模块化的代理工具,支持 VMess,Socks,HTTP,Shadowsocks 等等协议,并且附带很多高级功能,HTTP 伪装, TLS 等等。

安装 install

root 账户下执行

bash <(curl -L -s https://install.direct/go.sh)

该脚本会自动安装 unzipdaemon。脚本执行成功后,进行如下操作:

  1. 编辑文件 vim /etc/v2ray/config.json 来配置
  2. 运行 service v2ray start 来启动 v2ray
  3. 使用 service v2ray start|stop|status|reload|restart|force-reload 来控制 v2ray

配置 config

v2ray 使用 JSON 格式的配置文件,大致配置格式如下:

{
  "log": {},
  "dns": {},
  "routing": {},
  "policy": {},
  "inbound": {},
  "outbound": {},
  "inboundDetour": [],
  "outboundDetour": [],
  "transport": {}
}

更加详细的配置详解可以参考官方的文档

v2ray 支持以下协议,默认的协议为 VMess

  • Blackhole
  • Dokodemo-door
  • Freedom
  • HTTP
  • Shadowsocks
  • Socks
  • 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

下载对应 Linux 的客户端,执行 ./v2ray --config=config.json 来启动客户端,如果看到日志正常表示已经连接成功。

Windows/MacOS

类似 Linux,启动客户端配置本地,其他选择还有

Windows 下 V2RayW, MacOS 下 V2RayX

Android

Android 客户端现在为止有 V2RayNG、Actinium,本人测试前一个比较好用,但是也存在问题,长时间连接容易掉线。

Play Store 链接 备用 GitHub 地址

iOS

使用 ShadowRocket,美区下载,支持 VMess 协议。如果没有 ShadowRocket ,其他可供选择的还有 Kitsunebi 和 ShadowRay ,如果App Store搜不到请用美区账号。

安装 ShadowRocket 还有一个简单的方法,搜索 爱思助手

reference


2018-01-26 linux , windows , mac , socks , http , shadowsocks , proxy , vmess

自建网络硬盘 ownCloud

ownCloud 是一个文件分享服务,可以将个人的文件内容,比如文本,图片,音频等等存储到一个中心服务器上,类似于 Dropbox。但是与 Dropbox 不同之处在于 ownCloud 是开源的,任何人都可以检视其源代码并且可以为之贡献代码,这意味着他将文件的控制权交给了个人,敏感的文件任何人都无法查看,但于此同时他也将文件的安全交给了个人管理。

ownCloud 安装

安装之前确保有 sudo 权限,并且 ownCloud 需要

  • web 服务器,比如 nginx 或者 Apache
  • 数据库 MySQL
  • PHP

安装

apt install nginx mysql-server php7.0 php-bz2 php-curl php-gd php-imagick php-intl php-mbstring php-xml php-zip

更多的安装详细教程可以查看 DigitalOcean 的教程

Nextcloud

按照教程 使用 snap 安装。

或者手动安装

reference


2018-01-25 linux , cloud , drive , owncloud

又一款抓包分析软件 wireshark

Wireshark 是一款网络分析工具,也是学习网络协议的工具,原先介绍过的 Charlesmitmproxy 等HTTP抓包工具,都局限于 HTTP/HTTPS 请求,对于更底层的 TCP/IP,UDP 等协议就无能为力了。Wireshark 可以抓取网卡上的网络包,并实时展示,Wireshark 包括了过滤器,协议显示等等工具。

Wireshark 和其他工具的区别,比如 Charles,mitmproxy,Fiddler 等。Charles, mitmproxy,Fiddler是专门用来捕获HTTP,HTTPS请求的。Wireshark 能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以Wireshark看不懂HTTPS中的内容。总结,如果是处理HTTP,HTTPS 还是用Charles, mitmproxy, Fiddler 等, 其他协议比如TCP,UDP,IP,ICMP 等就用Wireshark

安装

各大系统的安装文件:https://www.wireshark.org/download.html

Linux 下可以使用 PPA

sudo add-apt-repository ppa:wireshark-dev/stable && sudo apt-get update
sudo apt-get install wireshark

简单使用

打开 Wireshark 就可以看到很多网络硬件可以选择,任选其中一块网卡就能够抓取经过这个网卡的所有流量包。常见的设备名字,或者网卡名字有这样几个:

  • eth0 物理网卡,一般连接网线会获取到IP地址
  • eth1 第二块网卡
  • wlan0 是无线网卡,一般连接无线网会获取到IP地址
  • lo 设备虚拟端口,自身回环,一般指向 127.0.0.1

还有一些设备名字可以参考之前的文章。比如我笔记本使用无线网卡连接了WIFI,那么进入 Wireshark 之后选择 wlan0 设备,自动进入抓包,可以看到经过无线网卡的所有请求包。

wireshark-windows

Wireshark 的界面大致可以分成三个部分,最上面的部分为原始数据包预览,可以在该面板中看到抓取的包大致内容,包括序号,耗时,原始地址,目标地址,协议,长度,基本信息等等,分别使用不同的颜色标记了,这个颜色可以在设置 View -> Coloring Rules 中设置,根据不同的协议,或者自定义一些过滤规则,将关心的内容以不同的颜色标记出。

面板中间是封包详细信息 (Packet Details Pane),这个面板是最重要的,用来查看协议中的每一个字段。各行信息分别为

  • Frame: 物理层的数据帧概况
  • Ethernet II: 数据链路层以太网帧头部信息
  • Internet Protocol Version 4: 互联网层IP包头部信息
  • Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP
  • Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议

面板最下面一栏是数据包真正传输的内容,以十六进制和 ASCII 显示出来。

过滤器

https://wiki.wireshark.org/CaptureFilters

两种过滤器的目的是不同的。

捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中。需要在开始捕捉前设置。捕捉过滤器是数据经过的第一层过滤器,它用于控制捕捉数据的数量,以避免产生过大的日志文件。

显示过滤器(DisplayFilters):在捕捉结果中进行详细查找。他们可以在得到捕捉结果后随意修改。显示过滤器是一种更为强大(复杂)的过滤器。它允许您在日志文件中迅速准确地找到所需要的记录。

两种过滤器使用的语法是完全不同的。

http://openmaniak.com/cn/wireshark_filters.php

三次握手

Wireshark实际分析下三次握手的过程

在wireshark中输入http过滤, 然后选中GET /tankxiao HTTP/1.1的那条记录,右键然后点击”Follow TCP Stream”,

这样做的目的是为了得到与浏览器打开网站相关的数据包

可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。

第一次握手数据包

客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。

第二次握手的数据包

服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的ISN加1以.即0+1=1

第三次握手的数据包

客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1


2018-01-16 wireshark , charles , mitmproxy , proxy

每天学习一个命令:sed

sed 是字符流编辑器,一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。sed 主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

awk 的典型示例是将数据转化为格式化报表。

行编辑器ed

awk 的起源追溯到sed和grep,再往前追溯就到了ed,最初的unix行编辑器。关于ed编辑器可以参考之前的[文章]

sed使用参数

sed [-neifr] [命令]

选项与参数:

  • -n :只有经过sed 特殊处理的那一行(或者命令)才会被列出来。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。
  • -e :直接在命令列模式上进行 sed 的命令编辑;
  • -f :从文件执行 sed 命令,-f filename 则可以运行 filename 内的 sed 命令;
  • -r :sed 默认支持正则表达式,使用 -r 开启扩展的正则表达式
  • -i :直接修改读取的文件内容,而不是输出到终端。

命令说明: [n1[,n2]]command

n1, n2 :在n1到n2行之间使用命令,举例来说,如果我的命令是需要在 10 到 20 行之间进行的,则 10,20[命令行为]

command:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :替换,通常这个 s 的命令可以搭配正则 `1,20s/old/new/g` 

实例

行删除及增加

以行为单位的新增/删除

将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!

nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

sed 的命令为 ‘2,5d’ , d 就是删除。sed 后面接的命令,请务必以 ‘’ 两个单引号括住喔!

只要删除第 2 行

nl /etc/passwd | sed '2d' 

要删除第 3 到最后一行

nl /etc/passwd | sed '3,$d' 

在第二行后(即是加在第三行)添加内容

nl /etc/passwd | sed '2a drink tea'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

那如果是要在第二行前

nl /etc/passwd | sed '2i drink tea' 

如果是要增加两行以上,在第二行后面加入两行字

nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer ?'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

以行为单位替换

以行为单位的替换与显示

将第2-5行的内容替换为自己的内容

nl /etc/passwd | sed '2,5c No 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync

显示特定行

仅列出 /etc/passwd 文件内的第 5-7 行

nl /etc/passwd | sed -n '5,7p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

这个 sed 的以行为单位的显示功能,就能够将某一个文件内的某些行号选择出来显示。

数据的搜寻并显示

搜索 /etc/passwd有root关键字的行

nl /etc/passwd | sed '/root/p'
1  root:x:0:0:root:/root:/bin/bash
1  root:x:0:0:root:/root:/bin/bash
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
4  sys:x:3:3:sys:/dev:/bin/sh
5  sync:x:4:65534:sync:/bin:/bin/sync

如果root找到,除了输出所有行,还会输出匹配行。

使用-n的时候将只打印包含正则的行。

nl /etc/passwd | sed -n '/root/p'
1  root:x:0:0:root:/root:/bin/bash

输出指定的行数 (输出2-5行的数据)

sed -n '2,5p' file

数据搜寻删除

删除/etc/passwd所有包含root的行,其他行输出

nl /etc/passwd | sed  '/root/d'
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh

搜索执行命令

搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:

nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
1  root:x:0:0:root:/root:/bin/blueshell

如果只替换/etc/passwd的第一个bash关键字为blueshell,就退出

nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'    
1  root:x:0:0:root:/root:/bin/blueshell

最后的q是退出。

数据的搜寻并替换

sed ‘s/要被取代的字串/新的字串/g’

多点编辑

一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell

nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
1  root:x:0:0:root:/root:/bin/blueshell
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh

-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。

直接修改文件内容

sed 可以启用 -i 选项直接修改文件的内容,不必使用管道命令或者重定向。

sed -i 's/\.$/\!/g' filename.txt         # 将文件每一行最后的. 替换为!
sed -i '$a # add to last' filename.txt   # 每一行后面($) 增加(a) 后面的内容

sed 可以直接修改文件内容,这样对于大文本,可以不需要使用 vim 打开在进行编辑,直接使用 sed 行读取编辑就能够实现行修改和替换的作用。

reference


2018-01-15 linux , command , sed , editor

使用 Chevereto 自建照片分享

Chevereto 是一款分享照片的程序,可以非常轻松得在自己的服务器上搭建照片分享程序,功能强大,外观精美。Chevereto 本身是收费使用的,一次性付费,终身使用,但是其开源版本可以免费使用。

安装

在安装之前请先检查需要的系统配置,至少保证 VPS 安装有

  • nginx 或者 Apache web server
  • MySQL
  • PHP

安装依赖

apt-get install nginx mysql-server php7.0 php7.0-common php7.0-curl php7.0-mysql php7.0-gd php7.0-xml php7.0-mbstring

从官网下载最新版本 压缩包

wget https://github.com/Chevereto/Chevereto-Free/archive/1.0.9.tar.gz

Nginx 配置

新建虚拟主机,修改域名 A 记录指向 VPS,然后配置对应的 vim /etc/nginx/sites-enabled/photo.einverne.info

由于 chevereto 默认提供基于 Apache 环境的伪静态规则,故 nginx 的配置是不能用的,需要自己添加规则

server {
    listen 80;
    listen [::]:80;

    root /var/www/photo.einverne.info/html;
    index index.php index.html index.htm;

    server_name server_domain_or_IP;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

nginx 配置中还要注意一个 vim /etc/nginx/nginx.conf 配置中增加:

server { client_max_body_size 20M; //other lines… }

修改完重新加载 Nginx 配置 /etc/init.d/nginx reload

配置 MySQL

安装完 MySQL 之后需要为 Chevereto 新建一个数据库:

mysql -u root -p          # 登录mysql
create database photo;    # 创建 photo 数据库

修改 PHP 配置

默认的PHP上传大小在配置中略有不同,如果想要增大每张照片上传的大小,不仅上面 Nginx 中需要配置,同理 PHP 配置中也需要修改如下 vim /etc/php/7.0/fpm/php.ini

max_execution_time
max_input_time
memory_limit
post_max_size
upload_max_filesize

修改完重新加载PHP配置 /etc/init.d/php7.0-fpm reload

在做完这一系列配置之后,将之前下载的压缩包,在 /var/www/photo.einverne.info/html/ 目录下解压,然后使用域名访问。如果一切都没有问题,那么 Chevereto 会显示要求数据配置。要求填写:数据库名、数据库用户名、数据库用户密码,还有数据库表头。

这几项在前面安装时都已经完成,新建的数据库名,还有 MySQL 的用户名和密码,最后的数据表头名可以不变。然后下一步会填写管理员的一些信息,最后完成就好。

使用

设置中文,网上很多说需要修改密码,其实,在设置管理员面板中能够直接修改语言为中文。

修改图片存储路径:默认是在/images文件夹内,修改方法为在config.php修改define(‘DIR_IM’,’images/‘); ,这一步其实现在也能够在设置中直接修改。

Error

如果上传遇到问题,界面上显示

Server error (Internal server error)

一般的情况就是 Nginx 或者 PHP 的上传大小设置不对,上传的图片大于了 Nginx 或者 PHP 能够处理的大小,这是时候调整上传的大小就可以。调试方法如下;

没有给出任何信息,查看 nginx 错误日志

tailf /var/log/nginx/error.log

发现如下错误

2018/02/05 19:21:12 [error] 2693#2693: *8 client intended to send too large body: 1318270 bytes, client: 172.xxx.xxx.xxx, server: photo.einverne.info, request: "POST /json HTTP/1.1", host: "photo.einverne.info", referrer: "http://photo.einverne.info/dashboard/settings/system"

解决办法

vi /etc/nginx/nginx.conf

添加

client_max_body_size 20M;

然后 /etc/init.d/nginx reload 重新加载 nginx 服务配置。

reference


2018-01-15 php , photo , google , flickr

电子书

Google+

最近文章

  • 清空Chrome缓存的301重定向 可能是之前测试短域名生成服务的时候,添加了 http://localhost:8080 的跳转,导致了此后所有对该地址的访问都被重定向到了另一个网址,即使我在 8080 端口的服务已经停止,并且已经更换了其他测试的服务,Chrome 依然缓存了 301 重定向。
  • Linux 下的防火墙 ufw UFW,全称 Uncomplicated Firewall,是通过 iptables 实现的防火墙工具。ufw 是对 iptables 的封装,iptables 的规则太过于复杂,不适合新手。这篇文章也是如何增强VPS安全性的扩展篇,在修改了SSH端口,登录用户之后,最好清楚自己开放了VPS的哪些端口访问,把他们用 ufw 管理起来,防止被滥用。
  • Qnap Virtualization Station 使用 这里主要是介绍威联通NAS上面的 Virtualization Station (虚拟机工作站),这个应用能够在 NAS 上运行虚拟机,支持 Windows, Linux,Android 等等系统。威联通的虚拟机功能可以让用户在一台机器上同时运行多个系统。
  • 使用 git bisect 来快速定位出错版本 在整理之前那篇 [Git 分支管理]1 的时候接触了 git bisect ,用了那么长时间的 git 竟然又出现了一个不曾用过的命令,于是就看了下文档学习下使用。 Git 分支管理 ↩
  • 使用 yourls 专属自己的短域名服务 YOURLS是Your Own URL Shortener,是一个非常强大的短链接平台。