From 65ef7ad7f2695a7190281bf68452f0dbd37cac7a Mon Sep 17 00:00:00 2001 From: Dom Date: Mon, 4 Aug 2025 10:56:12 +0200 Subject: [PATCH] Initial commit --- .github/workflows/shellcheck.yml | 23 ++ LICENSE | 21 ++ README.md | 140 +++++++++++ uninstall.sh | 335 ++++++++++++++++++++++++++ x11vnc-setup.sh | 388 +++++++++++++++++++++++++++++++ 5 files changed, 907 insertions(+) create mode 100644 .github/workflows/shellcheck.yml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 uninstall.sh create mode 100644 x11vnc-setup.sh diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml new file mode 100644 index 0000000..4bdcfec --- /dev/null +++ b/.github/workflows/shellcheck.yml @@ -0,0 +1,23 @@ +name: ShellCheck Lint + +on: + push: + paths: + - 'x11vnc-setup.sh' + pull_request: + paths: + - 'x11vnc-setup.sh' + workflow_dispatch: + +jobs: + shellcheck: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install ShellCheck + run: sudo apt-get update && sudo apt-get install -y shellcheck + + - name: Run ShellCheck (strict) + run: shellcheck -x -e SC1090,SC1091 -f gcc ./x11vnc-setup.sh diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..dd42010 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Dom + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..606b934 --- /dev/null +++ b/README.md @@ -0,0 +1,140 @@ +[![ShellCheck Strict Lint x11vnc-setup.sh](https://github.com/domomg/x11vnc-setup/actions/workflows/shellcheck.yml/badge.svg)](https://github.com/domomg/x11vnc-setup/actions/workflows/shellcheck.yml) + +# x11vnc-setup +A cross-distro Bash script to install and configure x11vnc as a systemd service that attaches to an existing X11 session, just like Windows Remote Desktop or macOS Screen Sharing do. + +Unlike most VNC setups that spin up a separate virtual desktop, this script gives you **real-time access to your actual desktop session**, making it perfect for remote administration of your workstation. + +--- + +## Key Features + +- Works across multiple distros: + Ubuntu, Debian, Linux Mint, CentOS/RHEL/Rocky, Fedora, Arch Linux, Manjaro, openSUSE +- Secure password authentication (stored properly, never echoed) +- Systemd integration: Runs in the background and survives reboots +- Interactive setup: Guides you through user, port, and password configuration +- Hardened service: Systemd protections (`ProtectSystem`, `ProtectHome`, etc.) +- Clean and validated: Handles dependencies, checks for common pitfalls + +--- + +## Supported Platforms + +Tested and working on: +- Debian-based: Ubuntu, Debian, Linux Mint +- RHEL-based: CentOS, RHEL, Rocky, AlmaLinux +- Fedora +- Arch Linux/Manjaro +- openSUSE/SLES + +If you’re running something else obscure, install `x11vnc` manually first, then re-run the script. + +--- + +## Quick Start + +1. Clone the repository and run the script as root: + + ```bash + chmod +x x11vnc-setup.sh + sudo ./x11vnc-setup.sh + ``` +2. Follow the prompts to: + +- Set a VNC password + +- Choose which user to run the service as + +- (Optionally) configure a custom port + +3. The script will: + +- Install `x11vnc` if missing + +- Install `autocutsel` to enable copy-paste support between the remote viewer and the host + +- Configure the systemd service (auto-starts on boot) + +- Show you how to connect, open the firewall, and check logs + +--- + +## Notes + +- The VNC password is stored securely and never echoed. + +- The systemd service runs under the chosen user and uses `ProtectSystem`, `ProtectHome`, and other security settings. + +- You can further restrict access with firewall rules or SSH tunnels. + +--- + +## Known Limitations + + +### 1. Wayland is not supported +`x11vnc` **only works with X11** (XFCE, Mate, Cinnamon, etc). + +If you’re on Wayland, you probably **don't need this script at all.** + +**GNOME Desktop (either Wayland or X11)**: +- Comes with built-in remote desktop support via `gnome-remote-desktop` +- Go to `Settings -> Sharing -> Screen Sharing` and enable it +- `gnome-remote-desktop` supports both VNC and RDP protocols + +**KDE Plasma (either Wayland or X11)**: +- Built-in RDP server support +- Go to **System Settings -> Workspace -> Remote Desktop** +- Enable RDP server for remote access + +**Other Wayland environments (like Sway)** +- This script won't work at all on them +- Use Wayland native solutions, such as `wayvnc` + +### 2. The script assumes display `:0` +Fine for single-user desktops, but could be wrong for headless or multi-session machines. + +**Solution**: Edit the `DISPLAY` in the systemd service if needed. + +### 3. Logging to `/var/log/x11vnc.log` might fail for non-root users +The script directs logs to /var/log/x11vnc.log, but permissions might block non-root users. + +**Solution**: Remove the `-o` flag and rely on `journalctl` logs. + +### 4. Double forking via `-bg` and systemd `Type=forking` +The script uses both `-bg` and `Type=forking`. It works, but it’s not elegant. + +**Solution**: Remove `-bg` and rely on systemd's forking behavior, or change `Type=simple`. + +--- + +## Uninstallation + +To remove x11vnc completely, use the provided uninstall script: + +1. Clone the repository and run the script as root: + + ```bash + chmod +x uninstall.sh + sudo ./uninstall.sh + ``` +2. The script will: + +- Stop and remove the `x11vnc` systemd service + +- Remove all config files and directories + +- Uninstall `x11vnc` and `autocutsel` + +- Provide optional instructions to cleanup the firewall rules (if any) + +--- + +License: MIT. Use freely, I'm not responsible if things break or catch fire. + +Author: Dom + +GitHub: @domomg + +Contributions welcome. If you find a bug or need support for another distribution, feel free to open an issue or PR. diff --git a/uninstall.sh b/uninstall.sh new file mode 100644 index 0000000..65d25c9 --- /dev/null +++ b/uninstall.sh @@ -0,0 +1,335 @@ +#!/bin/bash + +# Enhanced x11vnc VNC Server Uninstall Script +# Author: Dom (@domomg) +# Supports: Ubuntu, Debian, Linux Mint, CentOS/RHEL/Rocky, Fedora, Arch Linux, openSUSE + +set -euo pipefail # Exit on error, undefined vars, pipe failures +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' +VNC_CONFIG_DIR="/etc/x11vnc" +X11VNC_SERVICE="/etc/systemd/system/x11vnc.service" +AUTOCUTSEL_SERVICE="/etc/systemd/system/autocutsel.service" +LOG_FILE="/var/log/x11vnc.log" + +log() { + echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" +} +error() { + echo -e "${RED}[ERROR] ✗${NC} $1" >&2 +} +warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} +info() { + echo -e "${BLUE}[INFO]${NC} $1" +} +success() { + echo -e "${GREEN}[SUCCESS] ✓${NC} $1" +} +check_root() { + if [[ $EUID -ne 0 ]]; then + error "This script must be run as root (use sudo)" + exit 1 + fi +} + +detect_distro() { + if [[ -f /etc/os-release ]]; then + source /etc/os-release + DISTRO=$ID + else + error "Cannot detect Linux distribution" + exit 1 + fi + info "Detected distribution: $PRETTY_NAME" +} + +stop_and_disable_service() { + log "Stopping and disabling x11vnc service..." + if systemctl is-active --quiet x11vnc.service 2>/dev/null; then + if systemctl stop x11vnc.service; then + success "x11vnc service stopped" + else + warning "Failed to stop x11vnc service" + fi + else + info "x11vnc service is not running" + fi + if systemctl is-enabled --quiet x11vnc.service 2>/dev/null; then + if systemctl disable x11vnc.service; then + success "x11vnc service disabled" + else + warning "Failed to disable x11vnc service" + fi + else + info "x11vnc service is not enabled" + fi +} + +stop_and_disable_autocutsel() { + log "Stopping and disabling autocutsel service..." + if systemctl is-active --quiet autocutsel.service 2>/dev/null; then + if systemctl stop autocutsel.service; then + success "autocutsel service stopped" + else + warning "Failed to stop autocutsel service" + fi + else + info "autocutsel service is not running" + fi + + if systemctl is-enabled --quiet autocutsel.service 2>/dev/null; then + if systemctl disable autocutsel.service; then + success "autocutsel service disabled" + else + warning "Failed to disable autocutsel service" + fi + else + info "autocutsel service is not enabled" + fi +} + +remove_service_files() { + log "Removing systemd service files..." + for svc in "$X11VNC_SERVICE" "$AUTOCUTSEL_SERVICE"; do + if [[ -f "$svc" ]]; then + rm -f "$svc" + success "Removed: $svc" + else + info "Service file not found: $svc" + fi + done + systemctl daemon-reload +} + + +kill_running_processes() { + log "Terminating any running x11vnc and autocutsel processes..." + if pgrep -x x11vnc >/dev/null; then + pkill -x x11vnc + success "x11vnc processes terminated" + else + info "No running x11vnc processes found" + fi + if pgrep -x autocutsel >/dev/null; then + pkill -x autocutsel + success "autocutsel processes terminated" + else + info "No running autocutsel processes found" + fi +} + +remove_config_files() { + log "Removing configuration files and directories..." + if [[ -d "$VNC_CONFIG_DIR" ]]; then + rm -rf "$VNC_CONFIG_DIR" + success "Configuration directory removed: $VNC_CONFIG_DIR" + else + info "Configuration directory not found: $VNC_CONFIG_DIR" + fi + if [[ -f "$LOG_FILE" ]]; then + rm -f "$LOG_FILE" + success "Log file removed: $LOG_FILE" + else + info "Log file not found: $LOG_FILE" + fi +} + +remove_autocutsel_helper_script() { + local helper_script="/usr/local/bin/start-autocutsel.sh" + log "Removing autocutsel helper script..." + if [[ -f "$helper_script" ]]; then + rm -f "$helper_script" + success "Removed autocutsel helper script: $helper_script" + else + info "Autocutsel helper script not found: $helper_script" + fi +} + +uninstall_packages() { + log "Uninstalling x11vnc and autocutsel packages..." + case $DISTRO in + ubuntu|debian|linuxmint) + if dpkg -l | grep -q "^ii.*x11vnc"; then + apt remove -y x11vnc + success "x11vnc package removed" + else + info "x11vnc package not installed" + fi + if dpkg -l | grep -q "^ii.*autocutsel"; then + apt remove -y autocutsel + success "autocutsel package removed" + else + info "autocutsel package not installed" + fi + apt autoremove -y + ;; + centos|rhel|rocky|almalinux) + if command -v dnf &> /dev/null; then + if rpm -q x11vnc &>/dev/null; then + dnf remove -y x11vnc + success "x11vnc package removed" + else + info "x11vnc package not installed" + fi + if rpm -q autocutsel &>/dev/null; then + dnf remove -y autocutsel + success "autocutsel package removed" + else + info "autocutsel package not installed" + fi + dnf autoremove -y + else + if rpm -q x11vnc &>/dev/null; then + yum remove -y x11vnc + success "x11vnc package removed" + else + info "x11vnc package not installed" + fi + if rpm -q autocutsel &>/dev/null; then + yum remove -y autocutsel + success "autocutsel package removed" + else + info "autocutsel package not installed" + fi + fi + ;; + fedora) + if rpm -q x11vnc &>/dev/null; then + dnf remove -y x11vnc + success "x11vnc package removed" + else + info "x11vnc package not installed" + fi + if rpm -q autocutsel &>/dev/null; then + dnf remove -y autocutsel + success "autocutsel package removed" + else + info "autocutsel package not installed" + fi + dnf autoremove -y + ;; + arch|manjaro) + if pacman -Qi x11vnc &>/dev/null; then + pacman -Rs --noconfirm x11vnc + success "x11vnc package removed" + else + info "x11vnc package not installed" + fi + if pacman -Qi autocutsel &>/dev/null; then + pacman -Rs --noconfirm autocutsel + success "autocutsel package removed" + else + info "autocutsel package not installed" + fi + ;; + opensuse*|sles) + if rpm -q x11vnc &>/dev/null; then + zypper remove -y x11vnc + success "x11vnc package removed" + else + info "x11vnc package not installed" + fi + if rpm -q autocutsel &>/dev/null; then + zypper remove -y autocutsel + success "autocutsel package removed" + else + info "autocutsel package not installed" + fi + ;; + *) + warning "Unsupported distribution: $DISTRO" + info "Please manually remove x11vnc and autocutsel packages" + ;; + esac +} + +show_firewall_info() { + echo -e "${YELLOW}" + echo "FIREWALL CLEANUP:" + echo "If you (optionally) opened VNC ports in your firewall, you may want to close them:" + echo "" + echo "For UFW (Ubuntu/Debian):" + echo " sudo ufw delete allow 5900/tcp" + echo " (Replace 5900 with your custom port if different)" + echo "" + echo "For firewalld (CentOS/RHEL/Fedora):" + echo " sudo firewall-cmd --permanent --remove-port=5900/tcp" + echo " sudo firewall-cmd --reload" + echo "" + echo "For iptables:" + echo " sudo iptables -D INPUT -p tcp --dport 5900 -j ACCEPT" + echo -e "${NC}" +} + +confirm_uninstall() { + echo -e "${YELLOW}" + echo "WARNING: This will completely remove x11vnc VNC server and all its configuration!" + echo "The following actions will be performed:" + echo " - Stop and disable x11vnc systemd service" + echo " - Remove systemd service file" + echo " - Kill any running x11vnc and autocutsel processes" + echo " - Remove configuration directory: $VNC_CONFIG_DIR" + echo " - Remove log file: $LOG_FILE" + echo " - Uninstall x11vnc and autocutsel packages" + echo -e "${NC}" + while true; do + read -r -p "Are you sure you want to proceed? (yes/no): " confirm + echo -e "${NC}" + case "$confirm" in + yes) + break + ;; + no) + info "Uninstall cancelled by user" + exit 0 + ;; + *) + warning "Please type the full word 'yes' or 'no'" + echo -e "${RED}" + ;; + esac + done +} + +main() { + echo -e "${YELLOW}" + echo "==============================================" + echo " Enhanced x11vnc VNC Server Uninstall Script" + echo " Multi-distribution support" + echo " Author: Dom (@domomg on GitHub)" + echo "==============================================" + echo -e "${NC}" + info "Starting x11vnc uninstallation..." + check_root + detect_distro + confirm_uninstall + stop_and_disable_service + stop_and_disable_autocutsel + remove_service_files + remove_autocutsel_helper_script + kill_running_processes + remove_config_files + uninstall_packages + show_firewall_info + echo -e "${GREEN}" + echo "===============================================" + echo "x11vnc VNC Server Uninstall Complete!" + echo "===============================================" + echo "" + echo "All x11vnc components have been removed:" + echo " -> Systemd service stopped and disabled" + echo " -> Service file removed" + echo " -> Running processes terminated" + echo " -> Configuration files removed" + echo " -> Packages uninstalled" + echo "" + echo "The system has been cleaned up successfully." + echo -e "${NC}" + success "Uninstallation completed successfully!" +} +main "$@" diff --git a/x11vnc-setup.sh b/x11vnc-setup.sh new file mode 100644 index 0000000..31d4f93 --- /dev/null +++ b/x11vnc-setup.sh @@ -0,0 +1,388 @@ +#!/bin/bash + +# Enhanced x11vnc VNC Server Setup Script +# Author: Dom (@domomg on Github) +# Supports: Ubuntu, Debian, Linux Mint, CentOS/RHEL/Rocky, Fedora, Arch Linux, openSUSE + +set -euo pipefail # Exit on error, undefined vars, pipe failures +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color +VNC_CONFIG_DIR="/etc/x11vnc" +VNC_PASSWORD_FILE="$VNC_CONFIG_DIR/vncpwd" +SERVICE_FILE="/etc/systemd/system/x11vnc.service" +VNC_PORT=5900 +VNC_USER="" + +log() { + echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" +} +error() { + echo -e "${RED}[ERROR] ✗${NC} $1" >&2 +} +warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} +info() { + echo -e "${BLUE}[INFO]${NC} $1" +} +success() { + echo -e "${GREEN}[SUCCESS] ✓${NC} $1" +} + +check_root() { + if [[ $EUID -ne 0 ]]; then + error "This script must be run as root (use sudo)" + exit 1 + fi +} + +detect_distro() { + if [[ -f /etc/os-release ]]; then + source /etc/os-release + DISTRO=$ID + else + error "Cannot detect Linux distribution" + exit 1 + fi + info "Detected distribution: $PRETTY_NAME" +} + +install_x11vnc() { + log "Installing x11vnc and autocutsel..." + case $DISTRO in + ubuntu|debian|linuxmint) + apt update + apt install -y x11vnc autocutsel + ;; + centos|rhel|rocky|almalinux) + # Enable EPEL for CentOS/RHEL + if command -v dnf &> /dev/null; then + dnf install -y epel-release + dnf install -y x11vnc autocutsel + else + yum install -y epel-release + yum install -y x11vnc autocutsel + fi + ;; + fedora) + dnf install -y x11vnc autocutsel + ;; + arch|manjaro) + pacman -Sy --noconfirm x11vnc autocutsel + ;; + opensuse*|sles) + zypper install -y x11vnc autocutsel + ;; + *) + error "Unsupported distribution: $DISTRO" + info "Please install x11vnc manually and re-run this script" + exit 1 + ;; + esac + if ! command -v x11vnc &> /dev/null; then + error "x11vnc installation failed" + exit 1 + fi + success "x11vnc installed successfully" +} + +setup_config_dir() { + log "Setting up configuration directory..." + if [[ ! -d "$VNC_CONFIG_DIR" ]]; then + mkdir -p "$VNC_CONFIG_DIR" + chmod 755 "$VNC_CONFIG_DIR" + fi +} + +setup_password() { + log "Setting up VNC password..." + echo -e "${YELLOW}" + echo "VNC Password Setup:" + echo "- Password must be 8 characters or less (VNC limitation)" + echo "- Choose a strong password for security" + echo "- You'll be prompted to confirm the password" + echo -e "${NC}" + [[ -f "$VNC_PASSWORD_FILE" ]] && rm -f "$VNC_PASSWORD_FILE" + if ! x11vnc -storepasswd "$VNC_PASSWORD_FILE"; then + error "Failed to set VNC password" + exit 1 + fi + chmod 600 "$VNC_PASSWORD_FILE" + success "VNC password configured successfully" +} + +get_vnc_user() { + echo -e "${BLUE}" + read -r -p "Enter username to run VNC as (leave empty and press Enter for root): " VNC_USER + echo -e "${NC}" + if [[ -n "$VNC_USER" ]]; then + if ! id "$VNC_USER" &>/dev/null; then + error "User '$VNC_USER' does not exist" + exit 1 + fi + chown -R "$VNC_USER:$VNC_USER" "$VNC_CONFIG_DIR" + info "VNC will run as user: $VNC_USER" + else + VNC_USER="root" + warning "VNC will run as root (not recommended for security)" + fi +} + +configure_port() { + echo -e "${BLUE}" + read -r -p "Enter VNC port (leave empty and press Enter for default 5900): " custom_port + echo -e "${NC}" + if [[ -n "$custom_port" ]]; then + if [[ "$custom_port" =~ ^[0-9]+$ ]] && [[ "$custom_port" -ge 1024 ]] && [[ "$custom_port" -le 65535 ]]; then + VNC_PORT="$custom_port" + info "VNC port set to: $VNC_PORT" + else + warning "Invalid port. Using default 5900" + VNC_PORT=5900 + fi + else + info "Using default VNC port: 5900" + fi +} + +create_systemd_service() { + log "Creating systemd service..." + local after_target="graphical.target" + local wanted_by="graphical.target" + local exec_start="/usr/bin/x11vnc" + exec_start+=" -auth guess" + exec_start+=" -forever" + exec_start+=" -noxdamage" + exec_start+=" -repeat" + exec_start+=" -rfbauth $VNC_PASSWORD_FILE" + exec_start+=" -rfbport $VNC_PORT" + exec_start+=" -shared" + exec_start+=" -display :0" + exec_start+=" -bg" + exec_start+=" -o /var/log/x11vnc.log" + exec_start+=" -noprimary" + exec_start+=" -alwaysshared" + cat > "$SERVICE_FILE" << EOL +[Unit] +Description=x11vnc VNC Server +Documentation=man:x11vnc(1) +After=$after_target +Wants=$after_target + +[Service] +Type=forking +User=$VNC_USER +Group=$VNC_USER +ExecStart=$exec_start +ExecStop=/usr/bin/pkill -f x11vnc +Restart=on-failure +RestartSec=5 +StandardOutput=journal +StandardError=journal +NoNewPrivileges=true +PrivateTmp=true +ProtectHome=read-only +ProtectSystem=strict +ReadWritePaths=/var/log + +[Install] +WantedBy=$wanted_by +EOL + chmod 644 "$SERVICE_FILE" + success "Systemd service created" +} + +create_autocutsel_helper_script() { + log "Creating autocutsel helper script to run as active user..." +cat > /usr/local/bin/start-autocutsel.sh << 'EOF' +#!/bin/bash +# Find the active graphical user session +user=$(loginctl list-sessions --no-legend | awk '{print $1}' | while read session; do +state=$(loginctl show-session "$session" -p Active --value) +if [[ "$state" == "yes" ]]; then + loginctl show-session "$session" -p Name --value + break +fi +done) +if [[ -z "$user" ]]; then + echo "No active graphical user found" >&2 + exit 1 +fi +# Set DISPLAY and XAUTHORITY for the user +display=:0 +xauth="/home/$user/.Xauthority" +if [[ ! -f "$xauth" ]]; then + echo "Xauthority file not found at $xauth" >&2 + exit 1 +fi +exec sudo -u "$user" DISPLAY=$display XAUTHORITY=$xauth /usr/bin/autocutsel +EOF + chmod +x /usr/local/bin/start-autocutsel.sh + success "Autocutsel helper script created at /usr/local/bin/start-autocutsel.sh" + } + +create_autocutsel_service() { + log "Creating autocutsel systemd service..." + local service_path="/etc/systemd/system/autocutsel.service" + cat > "$service_path" << EOL +[Unit] +Description=autocutsel clipboard sync +After=graphical.target +Wants=graphical.target + +[Service] +Type=simple +ExecStart=/usr/local/bin/start-autocutsel.sh +Restart=always +RestartSec=3 + +[Install] +WantedBy=graphical.target +EOL + chmod 644 "$service_path" + success "autocutsel systemd service created" +} + +enable_service() { + log "Enabling and starting x11vnc service..." + systemctl daemon-reload + if systemctl enable x11vnc.service; then + success "Service enabled successfully" + else + error "Failed to enable service" + exit 1 + fi + if systemctl start x11vnc.service; then + success "Service started successfully" + else + error "Failed to start service" + info "Check service status with: systemctl status x11vnc.service" + info "Check logs with: journalctl -u x11vnc.service -f" + exit 1 + fi + + log "Enabling and starting autocutsel service..." + systemctl daemon-reload + if systemctl enable autocutsel.service; then + success "Service enabled successfully" + else + error "Failed to enable service" + exit 1 + fi + if systemctl start autocutsel.service; then + success "Service started successfully" + else + error "Failed to start service" + info "Check service status with: systemctl status autocutsel.service" + info "Check logs with: journalctl -u autocutsel.service -f" + exit 1 + fi + +} + +check_service_status() { + log "Checking service status..." + if systemctl is-active --quiet x11vnc.service; then + success "x11vnc service is running" + if ss -tlnp | grep -q ":$VNC_PORT "; then + success "VNC server is listening on port $VNC_PORT" + else + warning "VNC server may not be listening on port $VNC_PORT" + fi + else + error "x11vnc service is not running" + info "Check status with: systemctl status x11vnc.service" + fi +} + +show_firewall_info() { + echo -e "${YELLOW}" + echo "FIREWALL CONFIGURATION:" + echo "You may need to open port $VNC_PORT in your firewall:" + echo "" + echo "For UFW (Ubuntu/Debian):" + echo " sudo ufw allow $VNC_PORT/tcp" + echo "" + echo "For firewalld (CentOS/RHEL/Fedora):" + echo " sudo firewall-cmd --permanent --add-port=$VNC_PORT/tcp" + echo " sudo firewall-cmd --reload" + echo "" + echo "For iptables:" + echo " sudo iptables -A INPUT -p tcp --dport $VNC_PORT -j ACCEPT" + echo -e "${NC}" +} + +show_connection_info() { + local ip_address + ip_address=$(hostname -I | awk '{print $1}') + echo -e "${GREEN}" + echo "===============================================" + echo "x11vnc VNC Server Setup Complete!" + echo "===============================================" + echo "" + echo "Connection Information:" + echo " Server IP: $ip_address" + echo " VNC Port: $VNC_PORT" + echo " Running as: $VNC_USER" + echo "" + echo "Connect using a VNC client:" + echo " Address: $ip_address:$VNC_PORT" + echo " Or: $ip_address::$VNC_PORT" + echo "" + echo "Service Management:" + echo " Status: systemctl status x11vnc.service" + echo " Stop: systemctl stop x11vnc.service" + echo " Start: systemctl start x11vnc.service" + echo " Logs: journalctl -u x11vnc.service -f" + echo "" + echo "Configuration files:" + echo " Service: $SERVICE_FILE" + echo " Password: $VNC_PASSWORD_FILE" + echo " Log: /var/log/x11vnc.log" + echo -e "${NC}" +} + +cleanup() { + if [[ -f "$SERVICE_FILE" ]]; then + systemctl stop x11vnc.service 2>/dev/null || true + systemctl disable x11vnc.service 2>/dev/null || true + rm -f "$SERVICE_FILE" + fi + [[ -d "$VNC_CONFIG_DIR" ]] && rm -rf "$VNC_CONFIG_DIR" + error "Installation interrupted and cleaned up" + exit 1 +} + +main() { + trap cleanup INT TERM + echo -e "${YELLOW}" + echo "==============================================" + echo " Enhanced x11vnc VNC Server Setup Script" + echo " Multi-distribution support with security" + echo " Author: Dom (@domomg on GitHub)" + echo "==============================================" + echo -e "${NC}" + info "Starting x11vnc installation and configuration..." + check_root + detect_distro + echo -e "${BLUE}" + read -r -p "Press Enter to continue with installation..."