#!/usr/bin/env bash bold='\033[0;1m' underl='\033[0;4m' red='\033[0;31m' green='\033[0;32m' yellow='\033[0;33m' normal='\033[0m' xray_version="None" if command -v xray > /dev/null then xray_version=$(xray --version | head -n 1 | cut -c 6-10) echo -e "${yellow}xray ${xray_version} detected${normal}" fi jq_installed=1 if command -v jq > /dev/null then jq_installed=0 echo -e "${green}jq found${normal}" else echo -e "${red}Warning: jq not installed but needed for operations with configs${normal}" fi is_root=1 if [ $(id -u) -eq 0 ] then is_root=0 echo -e "${green}running as root${normal}" else echo -e "${red}Warning: you should be root to install xray${normal}" fi command="help" if [ ! -v $1 ] then command=$1 fi if [ $command = "install" ] then echo -e "${bold}Download and install xray?${normal} (Y/n)" read answer if [ -v $answer ] || [ $(echo $answer | cut -c 1) != "n" ] then if [ xray_version != "None" ] then echo -e "xray ${version} detected, install anyway? (y/N)" read answer if [ ! -v $answer ] && ([ $(echo $answer | cut -c 1) = "y" ] || [ $(echo $answer | cut -c 1) = "Y" ]) then if [ $is_root -ne 0 ] then echo -e "${red}You should be root, or run this script with sudo to install xray${normal}" exit 1 else if bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install then echo -e "${green}xray installed${normal}" else echo -e "${red}xray not installed, something goes wrong${normal}" fi fi fi fi fi echo -e "${bold}Generate configs?${normal} (Y/n)" read answer if [ -v $answer ] || [ $(echo $answer | cut -c 1) != "n" ] then if command -v xray > /dev/null then xray_version=$(xray --version | head -n 1 | cut -c 6-10) fi if [ $xray_version = "None" ] then echo -e "${red}xray not installed, can't generate configs" exit 1 elif [ ! $jq_installed ] then echo -e "${red}jq not installed, can't generate configs" exit 1 else echo -e "${bold}Enter IPv4 or IPv6 address of your xray server, or its domain name:${normal}" read address id=$(xray uuid) keys=$(xray x25519) private_key=$(echo $keys | cut -d " " -f 3) public_key=$(echo $keys | cut -d " " -f 6) if command -v openssl > /dev/null then short_id=$(openssl rand -hex 8) else echo -e "Enter a random (up to) 16-digit hex number, containing only digits 0-9 and letters a-f, for instance 1234567890abcdef" read short_id if [ -v $short_id ] then echo -e "${red}short id not set${normal}" exit 1 fi fi echo -e "${bold}Choose a fake site to mimic.${normal} It is better if it is hosted by your VPS provider or is in the same country. Better if it is popular. (1) www.yahoo.com (default) (2) www.microsoft.com (3) www.google.com (4) www.nvidia.com (5) www.amd.com (6) www.samsung.com (7) your variant" read number if [ ! -v $number ] then if [ $number -eq 2 ] then fake_site="www.microsoft.com" elif [ $number -eq 3 ] then fake_site="www.google.com" elif [ $number -eq 4 ] then fake_site="www.nvidia.com" elif [ $number -eq 5 ] then fake_site="www.amd.com" elif [ $number -eq 6 ] then fake_site="www.samsung.com" elif [ $number -eq 7 ] then echo -e "type your variant:" read fake_site if [ -v $fake_site ] then fake_site="www.yahoo.com" fi else fake_site="www.yahoo.com" fi else fake_site="www.yahoo.com" fi echo -e "${green}mimic ${fake_site}${normal}" port=80 email="love@xray.com" clients=" [ { \"id\": \"${id}\", \"email\": \"${email}\", \"flow\": \"\" } ]" serverRealitySettings=" { \"show\": false, \"dest\": \"${fake_site}:443\", \"xver\": 0, \"serverNames\": [ \"${fake_site}\" ], \"privateKey\": \"${private_key}\", \"shortIds\": [ \"${short_id}\" ] }" # make server config cat template_config_server.json | jq ".inbounds[].settings.clients=${clients} | .inbounds[].streamSettings.realitySettings=${serverRealitySettings}" > config_server.json vnext=" [ { \"address\": \"${address}\", \"port\": ${port}, \"users\": [ { \"id\": \"${id}\", \"alterId\": 0, \"email\": \"${email}\", \"security\": \"auto\", \"encryption\": \"none\", \"flow\": \"\" } ] } ]" clientRealitySettings=" { \"serverName\": \"${fake_site}\", \"fingerprint\": \"chrome\", \"show\": false, \"publicKey\": \"${public_key}\", \"shortId\": \"${short_id}\", \"spiderX\": \"\" }" # make main client config cat template_config_client.json | jq ".outbounds |= map(if .settings.vnext then .settings.vnext=${vnext} else . end) | .outbounds |= map(if .streamSettings.realitySettings then .streamSettings.realitySettings=${clientRealitySettings} else . end)" > config_client.json fi fi elif [ $command = "add" ] then echo -e "TODO" elif [ $command = "del" ] then echo -e "TODO" elif [ $command = "mimic" ] then echo -e "TODO" elif [ $command = "upgrade" ] then echo -e "TODO" elif [ $command = "remove" ] then echo -e "Remove xray? (y/N)" read answer if [ ! -v $answer ] && ([ $(echo $answer | cut -c 1) = "y" ] || [ $(echo $answer | cut -c 1) = "Y" ]) then echo -e "${red}Please type YES to remove${normal}" read answer if [ ! -v $answer ] && ([ $answer = "YES" ] || [ $answer = "yes" ]) then if [ $is_root -ne 0 ] then echo -e "${red}You should be root, or run this script with sudo to remove xray${normal}" exit 1 else if bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ remove --purge then echo -e " ${green}xray removed${normal}" else echo -e " ${red}xray not removed${normal}" fi fi fi fi else # "help", default echo -e " ${green}**** Hi, there! How to use: ****${normal} ${bold}./ex.sh ${underl}command${normal} Here is the list of all available commands: ${bold}help${normal} show this message (default) ${bold}install${normal} run interactive prompt, which asks to download and install XRay and generate configs for server and client; ${bold}add ${underl}username${normal} add user with (any, fake) username to configs ${bold}del ${underl}username${normal} delete user with given username from configs ${bold}mimic ${underl}site${normal} change site xray server imitates ${bold}upgrade${normal} upgrade xray and configs ${bold}remove${normal} remove xray" fi echo -e " Command is done. ${red}Important:${normal} It is assumed that configs are stored and updated locally as config_server.json and config_client_username.json files. You should manually start XRay with one of configs, depending which role - server or client - XRay should play: sudo cp config_(role).json /usr/local/etc/xray/config.json sudo systemctl start xray or sudo xray run -c config_(role).json"