ShadowsocksR-Live / overtls

A simple proxy tunnel, minimalist tool for bypassing the GFW.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Tips

ssrlive opened this issue · comments

自定義安裝 overtls 服務

使用 overtls-install.sh 腳本並帶 service 和其它參數,可能導致一個 bash 軟件本身的一個詭異的 bug , 沒興趣繼續浪費時間折騰了,直接用另一個腳本解決:

#!/bin/bash

systemctl stop overtls
../install/overtls-install.sh service client /public/overtls /public/myconfig.json
systemctl start overtls
systemctl status overtls

這個腳本的作用是,預先將服務停掉,免得帶着參數 /public/overtls 執行腳本 overtls-install.sh 裏的 停止服務 操作時腳本崩潰,讓腳本能正常執行到最後;當然,腳本 overtls-install.sh 執行到最後一句 啓動服務 操作時還是會崩潰,但這時所有任務都已完成,崩潰了也沒啥;因爲外層套娃腳本的 啓動服務 的操作會再次執行,由於外層套娃腳本沒了 /public/overtls 參數,就不會崩潰了。就這麼奇葩。

在 macOS 里设置 overtls 作为 客户端 以 后台服务 的方式自启动

  • 创建文件 ~/Library/LaunchAgents/overtls.plist , 内容是这样的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>overtls</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
        <string>/Volumes/d/bin/overtls</string>
        <string>-r</string>
        <string>client</string>
        <string>-c</string>
        <string>/Volumes/d/config.json</string>
        <string>-d</string>
    </array>
    <key>WorkingDirectory</key>
    <string>/usr/local</string>
  </dict>
</plist>
  • 加载这个服务 launchctl load ~/Library/LaunchAgents/overtls.plist
  • 运行这个服务 launchctl start overtls

API Demo

Generate C header file

cbindgen --config cbindgen.toml -l C -o target/overtls.h

Build under macOS with Xcode

xcrun clang -o a test.c libovertls.a -framework Security

The demo test.c file

#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <signal.h>

#include "overtls.h"

void sigint_handler(int sig) {
    printf("\nCtrl-C pressed. Cleaning up and exiting...\n");
    over_tls_client_stop();
}

void callback(int port, void *p) {
    int *pp = (int *)p;
    printf("Listen on port = %d  -- %d\n", port, *pp);
}

int main() {
    char * f = "~/config.json";
    int p = 900;

    signal(SIGINT, sigint_handler);
    signal(SIGTERM, sigint_handler);

    over_tls_client_run(f, 1, callback, &p);

    printf("exited\n");

    return 0;
}