gg 是一个命令行工具,可在 Linux 环境下对任意命令进行一键代理,而无需安装 v2ray 等其他工具。
你只需要在想代理的命令之前添加 gg
即可,例如: gg python -m pip install torch
.
感谢 graftcp 带来的灵感,gg 是它的一个纯 Go 语言实现,并且拥有更多的有用特性。
我为什么编写 go-graft?
我已经厌倦了我在科研和开发中所遇到的糟糕的网络状况。但我并不希望在我的几台工作服务器上安装 v2ray,因为它太笨重了,且配置麻烦。
因此,我需要一个轻巧便携的命令行工具来帮助我在各种服务器上下载和安装依赖项和软件。
优势
相比较于 proxychains 或 graftcp,go-graft 拥有以下优势:
- gg 下载即用,不需要安装任何额外的工具。
- 支持 UDP,从而有效应对 DNS 污染。
- 支持 Go 语言编写的程序。见 applications built by Go can not be hook by proxychains-ng 。
-
运行如下命令下载安装 go-graft 最新的版本:
sudo sh -c "$(curl -L https://github.com/mzz2017/gg/raw/main/release/go.sh)"
不使用
sudo
时,gg 将会安装到用户目录。如果安装完毕后 gg 命令运行
失败
,请检查$PATH
.你也可以创建一个到 /usr/bin 的软链接。
例如:
sudo ln -s /usr/local/bin/gg /usr/bin/gg
-
测试安装是否成功:
$ gg --version gg version 0.1.1
例如:
配置你的订阅地址:
gg config -w subscription='https://example.com/path/to/sub'
克隆 linux 仓库来试试效果:
gg git clone --depth=1 https://github.com/torvalds/linux.git
输出:
Cloning into 'linux'... ... Receiving objects: 100% (78822/78822), 212.19 MiB | 7.04 MiB/s, done. Resolving deltas: 100% (7155/7155), done.
或者直接代理整个 shell session:
gg bash
git clone --depth=1 https://github.com/torvalds/linux.git
curl ipv4.appspot.com
使用节点的分享链接
# 如果你之前没有写过配置项,将会提示你输入节点链接。
gg wget -O frp.tar.gz https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
Enter the share-link of your proxy: ******** ... Saving to: ‘frp.tar.gz’ frp.tar.gz 100%[=====================================================>] 8.44M 12.2MB/s in 0.7s 2021-12-06 09:21:08 (12.2 MB/s) - ‘frp.tar.gz’ saved [8848900/8848900]
或者显式地使用 --node
:
gg --node ss://[email protected]:17247 speedtest
Retrieving speedtest.net configuration... Testing from Microsoft (13.xx.xx.xx)... ... Hosted by xxx: 55.518 ms Testing download speed................................................................................ Download: 104.83 Mbit/s Testing upload speed...................................................................................................... Upload: 96.35 Mbit/s
使用订阅地址
默认情况下 gg 会从你的订阅中自动挑选第一个可用的节点:
gg --subscription https://example.com/path/to/sub docker pull caddy
Using default tag: latest latest: Pulling from library/caddy 97518928ae5f: Pull complete 23ccae726125: Pull complete 3de6a61c89ac: Pull complete 39ed957bdc00: Pull complete 0ae44c2d42dd: Pull complete Digest: sha256:46f11f4601ecb4c5a37d6014ad51f5cbfeb92b70f5c9ec6c2ac39c4c1a325588 Status: Downloaded newer image for caddy:latest docker.io/library/caddy:latest
你也可以手动选择节点:
gg --subscription https://example.com/path/to/sub --select curl ipv4.appspot.com
WARN[0000] Test nodes... Use the arrow keys to navigate: ↓ ↑ → ← and / toggles search Select Node 🛪 [200Mbps] LoadBalance (323 ms) [200Mbps] LoadBalance Trojan (448 ms) [30M] CN2-US Cera (560 ms) [1Gbps] 4837-US (781 ms) [10Gbps] CN2-DE (811 ms) [300Mbps] Macau (1023 ms) [300Mbps] IPv6 LoadBalance (-1 ms) ↓ [1Gbps] RackNerd (-1 ms) --------- Detail ---------- Name: [200Mbps] LoadBalance Protocol: shadowsocks Support UDP: true Latency: 323 ms
你可以使用 -w
来写入配置项:
设置订阅地址:
gg config -w subscription=https://example.com/path/to/sub
gg curl ipv4.appspot.com
13.141.150.163
设置节点链接:
gg config -w node=vmess://MY_VMESS_SERVER_SHARE_LINK
gg curl ipv4.appspot.com
53.141.112.10
列出所有配置项:
gg config
node= subscription.link=https://example.com/path/to/sub subscription.select=first subscription.cache_last_node=true cache.subscription.last_node=trojan-go://MY_TROJAN_GO_SERVER_SHARE_LINK no_udp=false test_node_before_use=true
清除、重置某个特定配置项:
gg config -u node
node=
读取某个特定配置项:
gg config node
vmess://MY_VMESS_SERVER_SHARE_LINK
-
Q: 当我使用
sudo gg xxx
时,尽管我已经设置了配置项,它还是每次都要求我都输入分享链接。怎样解决这个问题?A: 使用
sudo -E gg xxx
即可。 -
Q: 我能否在我的 IPv6-only 单栈机器上使用?
A: 当然没有问题,只要你的代理服务器有 IPv6 入口即可。
-
Q: 当我运行
gg sudo xxx
,我得到了一个错误sudo: effective uid is not 0, ...
,怎样解决这个问题?A: 你应该运行
sudo gg xxx
,因为setuid
和ptrace
不能共存。详情见 stackoverflow 。 -
Q: 我正在使用
oh-my-zsh
,使用 gg 时我得到一个错误git:'gui' 不是一个 git 命令。参见 'git --help'。
,怎样解决这个问题?A: 这个问题源于
oh-my-zsh
,它默认将 gg 别名为了git gui
。你可以添加以下内容至~/.zshrc
:unalias gg
如果您想在使用 gg 的时候能够补全其他命令,请参考以下方法:
在 ~/.bashrc
加上一行:
complete -F _command gg
在 ~/.zshrc
加上一行:
compdef _precommand gg
如果你收到 complete:13: command not found: compdef
这样的错误提示,那请将下面内容添加到 ~/.zshrc
文件的开头:
autoload -Uz compinit
compinit
将以下内容写在 ~/.config/fish/completions/gg.fish
:
# fish completion for gg
function __fish_gg_print_remaining_args
set -l tokens (commandline -opc) (commandline -ct)
set -e tokens[1]
if test -n "$argv"
and not string match -qr '^-' $argv[1]
string join0 -- $argv
return 0
else
return 1
end
end
function __fish_complete_gg_subcommand
set -l args (__fish_gg_print_remaining_args | string split0)
__fish_complete_subcommand --commandline $args
end
# Complete the command we are executed under gg
complete -c gg -x -a "(__fish_complete_gg_subcommand)"
- Linux/amd64
- Linux/arm
- Linux/arm64
- Linux/386
- HTTP(S)
- Socks5
- VMess(AEAD, alterID=0) / VLESS
- TCP
- WS
- TLS
- GRPC
- Shadowsocks
- AEAD Ciphers
- Stream Ciphers
- simple-obfs (not tested)
- v2ray-plugin
- ShadowsocksR
- Trojan
- Trojan-gfw
- Trojan-go
- Base64 (v2rayN, etc.)
- Clash
- SIP008
- Surge
- Quantumult
- Quantumult X