Зачем: - отделить переносимый прокси-интерфейс от общих Bash-функций - запускать агентские CLI через явный внешний или управляемый прокси Что: - добавлен stow-пакет xray-proxy с CLI, Bash-модулем и примерами - реализованы строгий разбор VLESS и управляемый запуск Xray - добавлены проверки процесса, порта, сигналов и отсутствия утечек - сохранены спецификация и очередь следующих тикетов Проверка: - python3 tests/test_xray_proxy.py — 22/22 - python3 tests/test_xray_proxy_managed.py — 16/16 - bash tests/test_proxy_launchers.sh — 9/9 - bash tests/test_install.sh - bash -n, Python 3.8 grammar, git diff --check
7.5 KiB
xray-proxy
Переносимый Linux/Bash-интерфейс для безопасного запуска команд через явно настроенный внешний прокси или через управляемый пользовательский Xray.
CLI требует Python 3.8+ и использует только стандартную библиотеку. Он ничего не
устанавливает и не запускает без явной подкоманды. start использует первый
xray из PATH; скачивания и установки при запуске нет.
Подключение
В составе dotfiles:
cd ~/dotfiles
stow xray-proxy
source ~/.config/xray-proxy/shell.bash
Полный ./install.sh выполняет тот же stow вместе с остальными пакетами, а
.bash_custom подключает модуль автоматически.
Без остальных dotfiles можно создать две ссылки:
mkdir -p ~/.local/bin ~/.config/xray-proxy
ln -s /path/to/xray-proxy/.local/bin/xray-proxy ~/.local/bin/xray-proxy
ln -s /path/to/xray-proxy/.config/xray-proxy/shell.bash \
~/.config/xray-proxy/shell.bash
printf '%s\n' 'source ~/.config/xray-proxy/shell.bash' >> ~/.bashrc
Вместо ссылок файлы можно скопировать в те же пути. Исполняемому файлу нужен
режим chmod 755. Каталог ~/.local/bin должен входить в PATH.
Машинный конфиг
Скопируйте пример и отредактируйте его:
mkdir -p ~/.config/proxy
cp ~/.config/xray-proxy/examples/config ~/.config/proxy/config
Формат строгий: одна секция [proxy], пять обязательных ключей без повторов и
неизвестных полей.
[proxy]
type = external
name = Hiddify
address = hproxy.local
port = 12334
no_proxy_extra = .example.internal,git.example.internal
address — IPv4, IPv6 без квадратных скобок или ASCII DNS-имя без схемы и
порта. no_proxy_extra — список через запятую; значение может быть пустым.
Поддержка CIDR в NO_PROXY различается между программами, поэтому надёжнее
указывать точные IP и домены.
Если файла нет, используется прежний внешний Hiddify на
hproxy.local:12334, включая .concept-software.ru в NO_PROXY. Это не
переключает тип прокси автоматически.
Для управляемого Xray задайте явный тип, loopback IP и нужный локальный порт:
[proxy]
type = xray
name = Local Xray
address = 127.0.0.1
port = 12334
no_proxy_extra = .example.internal,git.example.internal
Секретный профиль хранится отдельно. Скопируйте синтетический пример, замените его одной настоящей VLESS-ссылкой и закройте права конечного файла:
cp ~/.config/xray-proxy/examples/default.url ~/.config/xray-proxy/default.url
chmod 600 ~/.config/xray-proxy/default.url
Файл должен содержать ровно одну непустую строку. Можно передать другой файл
через xray-proxy start -f /path/to/profile.url. Если это симлинк, проверяются
права конечного файла.
Команды
xray-proxy status
xray-proxy start [-f PROFILE]
xray-proxy stop
xray-proxy env
xray-proxy run -- COMMAND ARG...
proxy_on
proxy_off
pclaude [ARG...]
pcodex [ARG...]
myip
Для external команды status, env и run проверяют настроенный адрес и
порт. Для xray они дополнительно требуют закрытое состояние именно того
супервизора и дочернего Xray, который запустил CLI. Один открытый порт или чужой
PID не принимается. run никогда не запускает Xray скрыто.
start поддерживает Xray 25.12.8 и 26.3.27, сначала выполняет
xray version и xray run -test, затем остаётся на переднем плане. Используйте
отдельную панель tmux. После готовности один loopback-порт принимает HTTP и
SOCKS. stop ограниченно ждёт завершения супервизора и Xray, очищает служебные
файлы и возвращает исходный start в терминал. Команда stop работает и после
явного переключения машинного типа на external.
run передаёт восемь proxy-переменных только дочернему процессу и сохраняет
аргументы и код возврата. proxy_on атомарно применяет те же восемь переменных
к текущей Bash-сессии; proxy_off удаляет их.
Таймаут проверки задаётся положительным числом секунд:
export PROXY_PREFLIGHT_TIMEOUT=2
Значение по умолчанию — 2 секунды. env при успехе печатает только восемь строк
KEY=value; для обычной диагностики используйте status или myip.
Поддерживаемые профили
Поддерживаются только VLESS TCP/RAW с REALITY и VLESS XHTTP с TLS. Неизвестные,
повторные и несовместимые query-параметры отклоняются. XHTTP поддерживает ALPN
http/1.1, h2 и h3; extra должен быть JSON-объектом без повторных ключей.
Xray 26.3.27 использует pcs и vcn, а устаревшие allowInsecure и
insecure не переносит. Истинное legacy-значение даёт предупреждение, но
обычная проверка сертификата остаётся включённой. Xray 25.12.8 предназначен
только для явной старой совместимости: согласованное true переносится как
allowInsecure=true с предупреждением об отключённой проверке сертификата;
pcs и vcn для этой версии запрещены. Автоматического перехода между
версиями или типами прокси нет.
Сводка скрывает UUID и ключи. Содержимое XHTTP path не показывается — только
его длина. Сгенерированный JSON и состояние лежат в закрытом каталоге
$XDG_STATE_HOME/xray-proxy либо ~/.local/state/xray-proxy и удаляются после
штатной остановки. Сбой диагностики внешнего IP через локальный HTTP-прокси
показывается как предупреждение и не останавливает уже готовый Xray.