第一章

1.1 引言

1.2 UNIX 体系结构

从底层到上层:

  • 内核
  • 系统调用
  • 公共函数
  • shell
  • 应用程序

1.3 登录

/etc/passwd 定义了登录用户、口令、登录之后的起始目录
登录之后运行的 shell 取决于 /etc/passwd 文件中列出的对应 shell
常见的 shell 的种类 sh bash csh ksh tcsh

1.4 文件和目录

  • 根目录 /
  • 目录命名规则
  • 文件名、路径名
  • 进程的工作目录 默认工作目录是启动当前进程的目录,所以会有一些(PHP)框架调用 chdir 函数改变工作目录,使得框架中可以方便地无歧义地使用相对路径
  • 实例 列出指定目录下的文件

1.5 输入和输出

  • 文件描述符

    就是一个非负整数用来标识一个 进程正在访问的文件
  • 标准输入、输出、错误

    每当运行新程序时,shell 都会为它开启3个文件描述符,就是标准输入、输出、错误
    可以通过 < 和 > 以及 | 重定向输入输出到其他文件或命令
  • 不带缓冲的 I/O
    几个 UNIX 函数提供了不带缓冲的 I/O,并且用到了文件描述符,函数(c 函数)出错,大多数情况返回 -1
  • 标准 I/O (带缓冲)

1.6 程序和进程

  • 每个进程都有一个唯一的进程 ID 是个非负整数。
  • 可以用 fork、exec、waitpid 控制进程 (在 C 语言中 NULL 和 0 是等价的)

    文中提到 fork 调用一次 返回两次(分别在子进程和父进程中),这里还不是很清楚 后面进行深入了解。
  • 进程与线程

    线程用线程 ID 标识,线程 ID 只在所属进程内有意义
    一个进程内的所有线程共享地址空间、文件描述符、栈、进程相关属性。
    由于线程共享存储区,多线程访问时要做好同步措施。

1.7 出错处理

  • UNIX 系统函数出错通常返回负值,也有返回 null 的
  • 可从 errno 变量中读取具体错误标识

1.8 用户标识

  • 用户、用户组、附属组
  • root 用户 ID 为 0
  • 支持多个附属组(16 个以上)

    1.9 信号

  • 可以注册自定义函数处理信号
  • 信号有系统默认的处理方式

1.10 时间值

  • 日历时间
    UNIX 时间戳
  • 进程时间
    每个进程有 3 个进程时间,分别是:时钟时间、用户 CPU 时间、系统 CPU 时间
    可以使用 time -p + 命令 的形式查看运行这个命令所需的时间

1.11 系统调用和库函数

UNIX 中每个系统调用都对应一个名字相同的 C 函数(在 C 标准库中) 应用程序可以直接调用系统调用和库函数

  • 系统调用使用 C 语言定义
    系统调用是直接进入被和的入口点
    早期操作系统使用汇编定义
  • 库函数使用 C 语言定义

1.12 小结

第二章

ss 是 shadowsocks 的简称。

这里以 Ubuntu 16.04 为例

  1. 买好墙外的服务器
  2. 使用 root 用户登录到服务器(如使用非 root 用户,下面的所有命令前加 sudo)
  3. apt update && apt upgrade && apt autoremove
  4. apt install python-pip
  5. pip install --upgrade pip
  6. pip install setuptools
  7. pip install git+https://github.com/shadowsocks/shadowsocks.git@master
  8. vi /etc/shadowsocks.json 写入配置文件 格式如下:

    {
     "server": "这台服务器的 IP",
     "server_port": 8388,
     "local_address": "127.0.0.1",
     "local_port": 1080,
     "port_password": {
         "1234": "12345678"
     },
     "timeout":300,
     "method":"aes-256-cfb",
     "fast_open": false
    }

    其中 port_password 字段可以添加多条。前面的数字代表对外提供服务的端口,后面的字符串代表使用前面的端口登录到 ss 的密码。

  9. ssserver -c /etc/shadowsocks.json

可以在 .bashrc 中加几个别名,后续操作方便一些
alias ssstart='ssserver -c /etc/shadowsocks.json -d start'
alias ssstop='ssserver -c /etc/shadowsocks.json -d stop'
alias ssrestart='ssserver -c /etc/shadowsocks.json -d restart'

有时候想写点什么东西,但是打开编辑器之后,突然一个字都蹦不出来了。不爽啊!

过两天把这个博客迁移了吧,不用阿里云了。换 Vultr。这个还是比较便宜的。
同等配置只需要阿里云一半不到的的价格,可以说是非常良心了。而且选择日本/新加坡机房访问速度快,还能 fq,很舒服。
只是这个主机商比较年轻,不知道稳定性如何,应该问题不大。跑了一个多月的 SS 也挺稳定,速度挺快。

今天网上随便看东西的时候,看到一个名为【任何技能都是从模仿开始,逐步升华。】的博客。地址

以前想写一个 PHP 框架来练手,总是想着不能模仿别人的框架,要自己设计,但到最后总觉得差点什么,做出来的东西自己都不喜欢。
今天看到这句话,还是有点感触的。该模仿就模仿,该抄就抄,逐步升华。不是天才,不可能自己悟出来,只能借鉴前人的东西,借鉴多了,慢慢的也就有了自己的东西。

今天入职新公司,但是发现网络访问并不自由。。公司内的 WiFi 想要访问外网,要使用公司的内部代理,这就蛋疼了,shadowsocks 都用不了了。但是我发现 ssh 可以直连前几天买的日本服务器,经龙哥提醒,可以使用 ssh 来做代理从而突破限制。下面就是具体方法了。

其实命令很简单
通过 ssh -f -NT -D 127.0.0.1:7001 username@host 在本地开一个端口,然后使用 Proxy SwitchySharp (Chrome 扩展) 设置一个 socks5 代理即可(代理设置为 127.0.0.1:7001)。当然这个有一个前提就是,要把自己电脑的 public_key 放到远程服务器,不然要输入密码,体验就大打折扣了。

对各个参数的解释参考了这里,在此对博主表示感谢。

  • -f 表示后台执行ssh指令
  • -D 表示通过动态端口转发方式打开 ssh 通道
  • -N 表示只连接远程主机,不打开远程shell
  • -T 表示不为这个连接分配TTY
  • -NT 两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作

虽然命令足够简单,但是作为一个懒惰的程序员,怎么可能做重复的事情,所以要写一个 alias 来简化它,直接贴代码。

# ssh proxy
alias jpproxy='ssh -f -NT -D 127.0.0.1:7001 username@host &> /dev/null'
alias jpproxystop="ps aux | grep username@host | grep -v grep | awk '{print \$2}' | xargs kill"

这是我用日本服务器搞的 ssh 代理。
第一个 alias 用来开启代理
第二个 alias 用来关闭代理,$xxx 在 shell 里代表变量,所以要用 \ 转义 $

至此我们已经成功翻过两堵高墙,来到了真正的互联网,顿时感觉整个人都自由了。

但是还有个问题,目前代理并不是全局的,之后要看下怎么搞成全局,因为电脑版微信收到的图片都看不了。。。头像也不出来


更新:
可以通过 proxifier 来指定哪个软件走代理
Google 查的注册码 P427L-9Y552-5433E-8DSR3-58Z68 软件还是有点小贵的...