Mac 使用笔记

使用 Mac 时的一些经验分享

关于代理

科学上网(shadowsocks + VPS)

搭建 shadowsocks 代理服务器

在 DigitalOcean 买一个 VPS(5$/mo),然后安装 shadowsocks,网上有很多教程(例如 这个),再次不再累述。

使用 supervisor 管理 shadowsocks,配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# cat /etc/supervisor/conf.d/shadowsocks.conf

[program:shadowsocks]
command=ssserver -c /etc/shadowsocks.json
autorestart=true
user=nobody
stdout_logfile=/tmp/shadowsocks.out.log
stderr_logfile=/tmp/shadowsocks.err.log

# cat /etc/shadowsocks.json

{
"server":"::",
"server_port":8836,
"local_port":1080,
"password": "xx_x_xx",
"timeout":600,
"method":"aes-256-cfb",
"fast_open": false,
"prefer_ipv6": true
}

本地下载安装 shadowsocks 客户端,然后如下图所示进行配置。

shadowsocks-client

参考 supervisor 进程管理

关于 shadowsocks 安装错误

  1. ShadowSocks 启动时,会报错 undefined symbol EVP_CIPHER_CTX_cleanup

    • 错误信息

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      2018-12-09 12:38:00 INFO     loading libcrypto from libcrypto.so.1.1
      Traceback (most recent call last):
      File "/usr/local/bin/ssserver", line 11, in <module>
      sys.exit(main())
      File "/usr/local/lib/python2.7/dist-packages/shadowsocks/server.py", line 34, in main
      config = shell.get_config(False)
      File "/usr/local/lib/python2.7/dist-packages/shadowsocks/shell.py", line 262, in get_config
      check_config(config, is_local)
      File "/usr/local/lib/python2.7/dist-packages/shadowsocks/shell.py", line 124, in check_config
      encrypt.try_cipher(config['password'], config['method'])
      File "/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py", line 44, in try_cipher
      Encryptor(key, method)
      File "/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py", line 83, in __init__
      random_string(self._method_info[1]))
      File "/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py", line 109, in get_cipher
      return m[2](method, key, iv, op)
      File "/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py", line 76, in __init__
      load_openssl()
      File "/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py", line 52, in load_openssl
      libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,)
      File "/usr/lib/python2.7/ctypes/__init__.py", line 379, in __getattr__
      func = self.__getitem__(name)
      File "/usr/lib/python2.7/ctypes/__init__.py", line 384, in __getitem__
      func = self._FuncPtr((name_or_ordinal, self))
      AttributeError: /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup
    • 原因

      openssl 升级到 1.1.0 以上版本,导致 shadowsocks2.8.2 启动报 undefined symbol: EVP_CIPHER_CTX_cleanup 错误。

    • 解决方法

      修改 /usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py,将 CIPHER_CTX_cleanup 替换为 CIPHER_CTX_reset (应该有两处)

      参考方案

使用 Proxifier 全局代理

shadowsocks 只能实现 socks 代理,限制了很多应用的使用。Proxifier 可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理。 Proxifier 的使用非常简单,装好之后写 rules 就可以了。如下图所示,目前我只是将 Google Drive 的请求转发到 socks 上

proxifier-example

让 iOS 使用 SSH 代理访问 Web 服务

思路是在本地局域网内想办法建立一个 SSH 代理,然后让 iOS 设备将请求转发到这个代理上。

我们在一台 Macbook 和一个 iPad 的环境下实现这样的操作。具体操作步骤如下:

  1. 在 Macbook(IP 地址是 192.168.0.8) 上搭建一个 SSH 代理

    ssh -g -N -D 192.168.0.8:8000 mypc # -g 表示外部机器可以连到这个地址

  2. 创建一个PAC文件 proxy.pac,指定如何配置proxy。

    1
    2
    3
    function FindProxyForURL(url, host) {
    return "SOCKS 192.168.0.8:8000";
    }
  3. 在 Macbook 上开启 web 服务,并将 proxy 文件放在 web 服务上。

    cp proxy.pac /Library/WebServer/Documents sudo apachectl start

    可以通过 http://192.168.0.8/proxy.pac 访问这个代理文件。

  4. 在iOS上设置。

    通过“Settings”->”WLAN Networks”找到现在连上的Wifi,查看details(蓝色箭头)在最下面有设置http proxy的地方。选择”Auto”, 填入 http://192.168.0.8/proxy.pac (注意:需要添加 http 头)

Done!

这样在 Macbook 开启代理的情况下,iOS 设备可以通过该代理访问web服务。

参考:

  1. Mac OS X 启用 Web 服务器
  2. 让iOS使用SSH Tunnel

关于 WebDav

参考 How To Configure WebDAV Access with Apache on Ubuntu 14.04

关于工具

  • Alfred

    常用插件

    • Dict
    • Kill Process
    • TerminalFinder
    • IP Address
  • Atom

    常用插件

    • atom-beautify
    • autocomplete-python
    • vim-mode-plus
    • platformio-ide-terminal
    • go-plus
    • Remote FTP
  • Visual Studio Code

  • Zotero (这在 Zotero 使用笔记 讲过)

  • Vim

    环境配置使用 The Ultimate vimrc

  • Emacs

    环境配置使用 spacemacs