Repository: ServerTechnologies/simple-xray-core Branch: main Commit: 6aa8cd84c006 Files: 3 Total size: 24.7 KB Directory structure: gitextract_6eq6gcwa/ ├── Readme.md ├── xhttp-xray-install └── xray-install ================================================ FILE CONTENTS ================================================ ================================================ FILE: Readme.md ================================================ # Скрипт для лёгкой установки и настройки ядра X-ray без графического интерфейса Вы все знакомы с такими панелями управления, как 3x-ui, Marzban и другими. Все эти панели являются всего лишь графическими надстройками над ядром X-ray и служат для удобного управления им, а также для создания подключений и настроек. Ядро же может работать без всяких панелей и управляться полностью через терминал. Основное преимущество использования «голого» ядра заключается в том, что вам не нужно заморачиваться с доменами и TLS-сертификатами. Само ядро можно установить и администрировать вручную с помощью официальной документации. Этот скрипт предназначен для упрощения этой задачи: он автоматически установит ядро на сервер, создаст конфигурационные файлы и несколько исполняемых файлов для удобного управления пользователями. ## VPS для панели Для установки панели нам понадобится VPS-сервер. Приобрести его можно в [ishosting](https://bit.ly/3rOqvPE). В сервисе доступны более 36 локаций. Если вам не нужна какая-то конкретная страна, выбирайте ту, что ближе к вам. ## Системные требования - 1 CPU - 1 GB RAM - 10 GB диска - ОС Ubuntu 22 x64 или Ubuntu 24 x64 ## Как пользоваться скриптом. Старая инструкция из видео. Установка с протоколом Vless TCP Reality Скрипт создавался и тестировался под ОС Ubuntu 22 x64 и Ubuntu 24 x64. На других ОС может работать некорректно. Чтобы скачать и запустить скрипт, используйте эту команду: ```sh wget -qO- https://raw.githubusercontent.com/ServerTechnologies/simple-xray-core/refs/heads/main/xray-install | bash ``` ## Команды для управления пользователями **Вывести список всех клиентов:** ```sh userlist ``` **Вывести ссылку и QR-код для подключения основного пользователя:** ```sh mainuser ``` **Создать нового пользователя:** ```sh newuser ``` **Удалить пользователя:** ```sh rmuser ``` **Создать ссылку для подключения:** ```sh sharelink ``` В домашней папке пользователя будет создан файл `help` — в нём содержатся подсказки с описанием команд. Посмотреть его можно с помощью команды (нужно находиться в домашней папке пользователя): ```sh cat help ``` ## Проблемы с доступом по протоколу Vless на транспорте TCP. > Многие заметили, что с доступностью Vless на транспорте TCP наблюдались некоторые проблемы. Я добавил вариацию этого скрипта с протоколом XHTTP. Важно! XHTTP - сравнительно новый транспорт, поэтому далеко не все клиенты его поддерживают. Список клиентов есть в текстовой версии видео на Github. - [Ссылка на видео YouTube про XHTTP](https://youtu.be/XASBkzQE00s) - [Текстовая версия видео на Github](https://github.com/ServerTechnologies/3x-ui-with-xhttp) Если вы уже установили ядро по видео с транспортом tcp, не спешите все сносить и устанавливать XHTTP. Для начала просто обновите ядро командой ```sh bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install ``` Если обновление не помогло, то можно приступать к установке новой версии скрипта с транспортом XHTTP. На всякий случай создадим бэкап файла конфигурации и файла с ключами, если вдруг захочется откатится обратно на tcp ```sh cp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.old cp /usr/local/etc/xray/.keys /usr/local/etc/xray/.keys.old ``` Чтобы восстановить конфигурацию, введите: ```sh wget -qO- https://raw.githubusercontent.com/ServerTechnologies/simple-xray-core/refs/heads/main/xray-install | bash mv /usr/local/etc/xray/config.json.old /usr/local/etc/xray/config.json mv /usr/local/etc/xray/.keys.old /usr/local/etc/xray/.keys systemctl restart xray ``` Будет переустановлено ядро, восстановлена старая конфигурация, в том числе старые клиенты. ## Установка с транспортом XHTTP. Установка производится слудующей командой. Внимание! Все пользователи будут удалены - их придется подключать заново. ```sh wget -qO- https://raw.githubusercontent.com/ServerTechnologies/simple-xray-core/refs/heads/main/xhttp-xray-install | bash ``` Команды для управления пользователями те же самые, что и в предыдущем пункте ## Полезные ссылки - [GitHub проекта X-ray Core](https://github.com/XTLS/Xray-core) - [Официальная документация на русском](https://xtls.github.io/ru/) ## Клиенты для подключения **Windows** - [v2rayN](https://github.com/2dust/v2rayN) - [Furious](https://github.com/LorenEteval/Furious) - [Invisible Man - Xray](https://github.com/InvisibleManVPN/InvisibleMan-XRayClient) **Android** - [v2rayNG](https://github.com/2dust/v2rayNG) - [X-flutter](https://github.com/XTLS/X-flutter) - [SaeedDev94/Xray](https://github.com/SaeedDev94/Xray) **iOS & macOS arm64** - [Streisand](https://apps.apple.com/app/streisand/id6450534064) - [Happ](https://apps.apple.com/app/happ-proxy-utility/id6504287215) - [OneXray](https://github.com/OneXray/OneXray) **macOS arm64 & x64** - [V2rayU](https://github.com/yanue/V2rayU) - [V2RayXS](https://github.com/tzmax/V2RayXS) - [Furious](https://github.com/LorenEteval/Furious) - [OneXray](https://github.com/OneXray/OneXray) **Linux** - [Nekoray](https://github.com/MatsuriDayo/nekoray) - [v2rayA](https://github.com/v2rayA/v2rayA) - [Furious](https://github.com/LorenEteval/Furious) ## Если вдруг нужно удалить, то воспользуйтесь этими командами: ```sh bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ remove rm /usr/local/etc/xray/config.json rm /usr/local/etc/xray/.keys rm /usr/local/bin/userlist rm /usr/local/bin/mainuser rm /usr/local/bin/newuser rm /usr/local/bin/rmuser rm /usr/local/bin/sharelink ``` ================================================ FILE: xhttp-xray-install ================================================ #!/bin/bash echo "Будет установлен Vless с транспортом XHTTP" sleep 3 apt update apt install qrencode curl jq -y # Включаем bbr bbr=$(sysctl -a | grep net.ipv4.tcp_congestion_control) if [ "$bbr" = "net.ipv4.tcp_congestion_control = bbr" ]; then echo "bbr уже включен" else echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf sysctl -p echo "bbr включен" fi # Устанавливаем ядро Xray bash -c "$(curl -4 -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install [ -f /usr/local/etc/xray/.keys ] && rm /usr/local/etc/xray/.keys touch /usr/local/etc/xray/.keys echo "shortsid: $(openssl rand -hex 8)" >> /usr/local/etc/xray/.keys echo "uuid: $(xray uuid)" >> /usr/local/etc/xray/.keys xray x25519 >> /usr/local/etc/xray/.keys export uuid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/uuid/ {print $2}') export privatkey=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/PrivateKey/ {print $2}') export shortsid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}') # Создаем файл конфигурации Xray touch /usr/local/etc/xray/config.json cat << EOF > /usr/local/etc/xray/config.json { "log": { "loglevel": "warning" }, "routing": { "domainStrategy": "IPIfNonMatch", "rules": [ { "type": "field", "domain": [ "geosite:category-ads-all" ], "outboundTag": "block" }, { "type": "field", "ip": [ "geoip:cn" ], "outboundTag": "block" } ] }, "inbounds": [ { "listen": "0.0.0.0", "port": 443, "protocol": "vless", "settings": { "clients": [ { "email": "main", "id": "$uuid", "flow": "" } ], "decryption": "none" }, "streamSettings": { "network": "xhttp", "xhttpSettings": { "path": "/" }, "security": "reality", "realitySettings": { "show": false, "target": "github.com:443", "serverNames": [ "github.com", "www.github.com" ], "privateKey": "$privatkey", "minClientVer": "", "maxClientVer": "", "maxTimeDiff": 0, "shortIds": [ "$shortsid" ] } }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls", "quic" ] } } ], "outbounds": [ { "protocol": "freedom", "tag": "direct" }, { "protocol": "blackhole", "tag": "block" } ], "policy": { "levels": { "0": { "handshake": 3, "connIdle": 180 } } } } EOF # Исполняемый файл для списка клиентов touch /usr/local/bin/userlist cat << 'EOF' > /usr/local/bin/userlist #!/bin/bash emails=($(jq -r '.inbounds[0].settings.clients[].email' "/usr/local/etc/xray/config.json")) if [[ ${#emails[@]} -eq 0 ]]; then echo "Список клиентов пуст" exit 1 fi echo "Список клиентов:" for i in "${!emails[@]}"; do echo "$((i+1)). ${emails[$i]}" done EOF chmod +x /usr/local/bin/userlist # исполняемый файл для ссылки основного пользователя touch /usr/local/bin/mainuser cat << 'EOF' > /usr/local/bin/mainuser #!/bin/bash protocol=$(jq -r '.inbounds[0].protocol' /usr/local/etc/xray/config.json) port=$(jq -r '.inbounds[0].port' /usr/local/etc/xray/config.json) uuid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/uuid/ {print $2}') pbk=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/Password/ {print $2}') sid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}') sni=$(jq -r '.inbounds[0].streamSettings.realitySettings.serverNames[0]' /usr/local/etc/xray/config.json) ip=$(timeout 3 curl -4 -s icanhazip.com) link="$protocol://$uuid@$ip:$port?security=reality&path=%2F&host=&mode=auto&sni=$sni&fp=firefox&pbk=$pbk&sid=$sid&spx=%2F&type=xhttp&encryption=none#vless-$ip" echo "" echo "Ссылка для подключения": echo "$link" echo "" echo "QR-код:" echo ${link} | qrencode -t ansiutf8 EOF chmod +x /usr/local/bin/mainuser # Исполняемый файл для создания новых клиентов touch /usr/local/bin/newuser cat << 'EOF' > /usr/local/bin/newuser #!/bin/bash read -p "Введите имя пользователя (email): " email if [[ -z "$email" || "$email" == *" "* ]]; then echo "Имя пользователя не может быть пустым или содержать пробелы. Попробуйте снова." exit 1 fi user_json=$(jq --arg email "$email" '.inbounds[0].settings.clients[] | select(.email == $email)' /usr/local/etc/xray/config.json) if [[ -z "$user_json" ]]; then uuid=$(xray uuid) jq --arg email "$email" --arg uuid "$uuid" '.inbounds[0].settings.clients += [{"email": $email, "id": $uuid, "flow": ""}]' /usr/local/etc/xray/config.json > tmp.json && mv tmp.json /usr/local/etc/xray/config.json systemctl restart xray index=$(jq --arg email "$email" '.inbounds[0].settings.clients | to_entries[] | select(.value.email == $email) | .key' /usr/local/etc/xray/config.json) protocol=$(jq -r '.inbounds[0].protocol' /usr/local/etc/xray/config.json) port=$(jq -r '.inbounds[0].port' /usr/local/etc/xray/config.json) uuid=$(jq --argjson index "$index" -r '.inbounds[0].settings.clients[$index].id' /usr/local/etc/xray/config.json) pbk=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/Password/ {print $2}') sid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}') username=$(jq --argjson index "$index" -r '.inbounds[0].settings.clients[$index].email' /usr/local/etc/xray/config.json) sni=$(jq -r '.inbounds[0].streamSettings.realitySettings.serverNames[0]' /usr/local/etc/xray/config.json) ip=$(curl -4 -s icanhazip.com) link="$protocol://$uuid@$ip:$port?security=reality&path=%2F&host=&mode=auto&sni=$sni&fp=firefox&pbk=$pbk&sid=$sid&spx=%2F&type=xhttp&encryption=none#$username" echo "" echo "Ссылка для подключения": echo "$link" echo "" echo "QR-код:" echo ${link} | qrencode -t ansiutf8 else echo "Пользователь с таким именем уже существует. Попробуйте снова." fi EOF chmod +x /usr/local/bin/newuser # Исполняемый файл для удаления клиентов touch /usr/local/bin/rmuser cat << 'EOF' > /usr/local/bin/rmuser #!/bin/bash emails=($(jq -r '.inbounds[0].settings.clients[].email' "/usr/local/etc/xray/config.json")) if [[ ${#emails[@]} -eq 0 ]]; then echo "Нет клиентов для удаления." exit 1 fi echo "Список клиентов:" for i in "${!emails[@]}"; do echo "$((i+1)). ${emails[$i]}" done read -p "Введите номер клиента для удаления: " choice if ! [[ "$choice" =~ ^[0-9]+$ ]] || (( choice < 1 || choice > ${#emails[@]} )); then echo "Ошибка: номер должен быть от 1 до ${#emails[@]}" exit 1 fi selected_email="${emails[$((choice - 1))]}" jq --arg email "$selected_email" \ '(.inbounds[0].settings.clients) |= map(select(.email != $email))' \ "/usr/local/etc/xray/config.json" > tmp && mv tmp "/usr/local/etc/xray/config.json" systemctl restart xray echo "Клиент $selected_email удалён." EOF chmod +x /usr/local/bin/rmuser # Исполняемый файл для вывода списка пользователей и создания ссылкок touch /usr/local/bin/sharelink cat << 'EOF' > /usr/local/bin/sharelink #!/bin/bash emails=($(jq -r '.inbounds[0].settings.clients[].email' /usr/local/etc/xray/config.json)) for i in "${!emails[@]}"; do echo "$((i + 1)). ${emails[$i]}" done read -p "Выберите клиента: " client if ! [[ "$client" =~ ^[0-9]+$ ]] || (( client < 1 || client > ${#emails[@]} )); then echo "Ошибка: номер должен быть от 1 до ${#emails[@]}" exit 1 fi selected_email="${emails[$((client - 1))]}" index=$(jq --arg email "$selected_email" '.inbounds[0].settings.clients | to_entries[] | select(.value.email == $email) | .key' /usr/local/etc/xray/config.json) protocol=$(jq -r '.inbounds[0].protocol' /usr/local/etc/xray/config.json) port=$(jq -r '.inbounds[0].port' /usr/local/etc/xray/config.json) uuid=$(jq --argjson index "$index" -r '.inbounds[0].settings.clients[$index].id' /usr/local/etc/xray/config.json) pbk=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/Password/ {print $2}') sid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}') username=$(jq --argjson index "$index" -r '.inbounds[0].settings.clients[$index].email' /usr/local/etc/xray/config.json) sni=$(jq -r '.inbounds[0].streamSettings.realitySettings.serverNames[0]' /usr/local/etc/xray/config.json) ip=$(curl -4 -s icanhazip.com) link="$protocol://$uuid@$ip:$port?security=reality&path=%2F&host=&mode=auto&sni=$sni&fp=firefox&pbk=$pbk&sid=$sid&spx=%2F&type=xhttp&encryption=none#$username" echo "" echo "Ссылка для подключения": echo "$link" echo "" echo "QR-код:" echo ${link} | qrencode -t ansiutf8 EOF chmod +x /usr/local/bin/sharelink systemctl restart xray echo "Xray-core успешно установлен" mainuser # Создаем файл с подсказками touch $HOME/help cat << 'EOF' > $HOME/help Команды для управления пользователями Xray: mainuser - выводит ссылку для подключения основного пользователя newuser - создает нового пользователя rmuser - удаление пользователей sharelink - выводит список пользователей и позволяет создать для них ссылки для подключения userlist - выводит список клиентов Файл конфигурации находится по адресу: /usr/local/etc/xray/config.json Команда для перезагрузки ядра Xray: systemctl restart xray EOF ================================================ FILE: xray-install ================================================ #!/bin/bash echo "Будет установлен Vless с транспортом TCP" sleep 3 apt update apt install qrencode curl jq -y # Включаем bbr bbr=$(sysctl -a | grep net.ipv4.tcp_congestion_control) if [ "$bbr" = "net.ipv4.tcp_congestion_control = bbr" ]; then echo "bbr уже включен" else echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf sysctl -p echo "bbr включен" fi # Устанавливаем ядро Xray bash -c "$(curl -4 -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install [ -f /usr/local/etc/xray/.keys ] && rm /usr/local/etc/xray/.keys touch /usr/local/etc/xray/.keys echo "shortsid: $(openssl rand -hex 8)" >> /usr/local/etc/xray/.keys echo "uuid: $(xray uuid)" >> /usr/local/etc/xray/.keys xray x25519 >> /usr/local/etc/xray/.keys export uuid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/uuid/ {print $2}') export privatkey=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/PrivateKey/ {print $2}') export shortsid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}') # Создаем файл конфигурации Xray touch /usr/local/etc/xray/config.json cat << EOF > /usr/local/etc/xray/config.json { "log": { "loglevel": "warning" }, "routing": { "domainStrategy": "IPIfNonMatch", "rules": [ { "type": "field", "domain": [ "geosite:category-ads-all" ], "outboundTag": "block" } ] }, "inbounds": [ { "listen": "0.0.0.0", "port": 443, "protocol": "vless", "settings": { "clients": [ { "email": "main", "id": "$uuid", "flow": "xtls-rprx-vision" } ], "decryption": "none" }, "streamSettings": { "network": "tcp", "security": "reality", "realitySettings": { "show": false, "dest": "github.com:443", "xver": 0, "serverNames": [ "github.com", "www.github.com" ], "privateKey": "$privatkey", "minClientVer": "", "maxClientVer": "", "maxTimeDiff": 0, "shortIds": [ "$shortsid" ] } }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls" ] } } ], "outbounds": [ { "protocol": "freedom", "tag": "direct" }, { "protocol": "blackhole", "tag": "block" } ], "policy": { "levels": { "0": { "handshake": 3, "connIdle": 180 } } } } EOF # Исполняемый файл для списка клиентов touch /usr/local/bin/userlist cat << 'EOF' > /usr/local/bin/userlist #!/bin/bash emails=($(jq -r '.inbounds[0].settings.clients[].email' "/usr/local/etc/xray/config.json")) if [[ ${#emails[@]} -eq 0 ]]; then echo "Список клиентов пуст" exit 1 fi echo "Список клиентов:" for i in "${!emails[@]}"; do echo "$((i+1)). ${emails[$i]}" done EOF chmod +x /usr/local/bin/userlist # исполняемый файл для ссылки основного пользователя touch /usr/local/bin/mainuser cat << 'EOF' > /usr/local/bin/mainuser #!/bin/bash protocol=$(jq -r '.inbounds[0].protocol' /usr/local/etc/xray/config.json) port=$(jq -r '.inbounds[0].port' /usr/local/etc/xray/config.json) uuid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/uuid/ {print $2}') pbk=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/Password/ {print $2}') sid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}') sni=$(jq -r '.inbounds[0].streamSettings.realitySettings.serverNames[0]' /usr/local/etc/xray/config.json) ip=$(timeout 3 curl -4 -s icanhazip.com) link="$protocol://$uuid@$ip:$port?security=reality&sni=$sni&fp=firefox&pbk=$pbk&sid=$sid&spx=/&type=tcp&flow=xtls-rprx-vision&encryption=none#vless-$ip" echo "" echo "Ссылка для подключения": echo "$link" echo "" echo "QR-код:" echo ${link} | qrencode -t ansiutf8 EOF chmod +x /usr/local/bin/mainuser # Исполняемый файл для создания новых клиентов touch /usr/local/bin/newuser cat << 'EOF' > /usr/local/bin/newuser #!/bin/bash read -p "Введите имя пользователя (email): " email if [[ -z "$email" || "$email" == *" "* ]]; then echo "Имя пользователя не может быть пустым или содержать пробелы. Попробуйте снова." exit 1 fi user_json=$(jq --arg email "$email" '.inbounds[0].settings.clients[] | select(.email == $email)' /usr/local/etc/xray/config.json) if [[ -z "$user_json" ]]; then uuid=$(xray uuid) jq --arg email "$email" --arg uuid "$uuid" '.inbounds[0].settings.clients += [{"email": $email, "id": $uuid, "flow": "xtls-rprx-vision"}]' /usr/local/etc/xray/config.json > tmp.json && mv tmp.json /usr/local/etc/xray/config.json systemctl restart xray index=$(jq --arg email "$email" '.inbounds[0].settings.clients | to_entries[] | select(.value.email == $email) | .key' /usr/local/etc/xray/config.json) protocol=$(jq -r '.inbounds[0].protocol' /usr/local/etc/xray/config.json) port=$(jq -r '.inbounds[0].port' /usr/local/etc/xray/config.json) uuid=$(jq --argjson index "$index" -r '.inbounds[0].settings.clients[$index].id' /usr/local/etc/xray/config.json) pbk=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/Password/ {print $2}') sid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}') username=$(jq --argjson index "$index" -r '.inbounds[0].settings.clients[$index].email' /usr/local/etc/xray/config.json) sni=$(jq -r '.inbounds[0].streamSettings.realitySettings.serverNames[0]' /usr/local/etc/xray/config.json) ip=$(curl -4 -s icanhazip.com) link="$protocol://$uuid@$ip:$port?security=reality&sni=$sni&fp=firefox&pbk=$pbk&sid=$sid&spx=/&type=tcp&flow=xtls-rprx-vision&encryption=none#$username" echo "" echo "Ссылка для подключения": echo "$link" echo "" echo "QR-код:" echo ${link} | qrencode -t ansiutf8 else echo "Пользователь с таким именем уже существует. Попробуйте снова." fi EOF chmod +x /usr/local/bin/newuser # Исполняемый файл для удаления клиентов touch /usr/local/bin/rmuser cat << 'EOF' > /usr/local/bin/rmuser #!/bin/bash emails=($(jq -r '.inbounds[0].settings.clients[].email' "/usr/local/etc/xray/config.json")) if [[ ${#emails[@]} -eq 0 ]]; then echo "Нет клиентов для удаления." exit 1 fi echo "Список клиентов:" for i in "${!emails[@]}"; do echo "$((i+1)). ${emails[$i]}" done read -p "Введите номер клиента для удаления: " choice if ! [[ "$choice" =~ ^[0-9]+$ ]] || (( choice < 1 || choice > ${#emails[@]} )); then echo "Ошибка: номер должен быть от 1 до ${#emails[@]}" exit 1 fi selected_email="${emails[$((choice - 1))]}" jq --arg email "$selected_email" \ '(.inbounds[0].settings.clients) |= map(select(.email != $email))' \ "/usr/local/etc/xray/config.json" > tmp && mv tmp "/usr/local/etc/xray/config.json" systemctl restart xray echo "Клиент $selected_email удалён." EOF chmod +x /usr/local/bin/rmuser # Исполняемый файл для вывода списка пользователей и создания ссылкок touch /usr/local/bin/sharelink cat << 'EOF' > /usr/local/bin/sharelink #!/bin/bash emails=($(jq -r '.inbounds[0].settings.clients[].email' /usr/local/etc/xray/config.json)) for i in "${!emails[@]}"; do echo "$((i + 1)). ${emails[$i]}" done read -p "Выберите клиента: " client if ! [[ "$client" =~ ^[0-9]+$ ]] || (( client < 1 || client > ${#emails[@]} )); then echo "Ошибка: номер должен быть от 1 до ${#emails[@]}" exit 1 fi selected_email="${emails[$((client - 1))]}" index=$(jq --arg email "$selected_email" '.inbounds[0].settings.clients | to_entries[] | select(.value.email == $email) | .key' /usr/local/etc/xray/config.json) protocol=$(jq -r '.inbounds[0].protocol' /usr/local/etc/xray/config.json) port=$(jq -r '.inbounds[0].port' /usr/local/etc/xray/config.json) uuid=$(jq --argjson index "$index" -r '.inbounds[0].settings.clients[$index].id' /usr/local/etc/xray/config.json) pbk=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/Password/ {print $2}') sid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}') username=$(jq --argjson index "$index" -r '.inbounds[0].settings.clients[$index].email' /usr/local/etc/xray/config.json) sni=$(jq -r '.inbounds[0].streamSettings.realitySettings.serverNames[0]' /usr/local/etc/xray/config.json) ip=$(curl -4 -s icanhazip.com) link="$protocol://$uuid@$ip:$port?security=reality&sni=$sni&fp=firefox&pbk=$pbk&sid=$sid&spx=/&type=tcp&flow=xtls-rprx-vision&encryption=none#$username" echo "" echo "Ссылка для подключения": echo "$link" echo "" echo "QR-код:" echo ${link} | qrencode -t ansiutf8 EOF chmod +x /usr/local/bin/sharelink systemctl restart xray echo "Xray-core успешно установлен" mainuser # Создаем файл с подсказками touch $HOME/help cat << 'EOF' > $HOME/help Команды для управления пользователями Xray: mainuser - выводит ссылку для подключения основного пользователя newuser - создает нового пользователя rmuser - удаление пользователей sharelink - выводит список пользователей и позволяет создать для них ссылки для подключения userlist - выводит список клиентов Файл конфигурации находится по адресу: /usr/local/etc/xray/config.json Команда для перезагрузки ядра Xray: systemctl restart xray EOF