Initial commit

This commit is contained in:
Dom
2025-08-04 10:56:12 +02:00
commit 65ef7ad7f2
5 changed files with 907 additions and 0 deletions

23
.github/workflows/shellcheck.yml vendored Normal file
View File

@@ -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

21
LICENSE Normal file
View File

@@ -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.

140
README.md Normal file
View File

@@ -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 youre 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 youre 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 its 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.

335
uninstall.sh Normal file
View File

@@ -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 "$@"

388
x11vnc-setup.sh Normal file
View File

@@ -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..." </dev/tty
echo -e "${NC}"
install_x11vnc
setup_config_dir
get_vnc_user
configure_port
setup_password
create_systemd_service
create_autocutsel_helper_script
create_autocutsel_service
enable_service
check_service_status
show_firewall_info
show_connection_info
success "Installation completed successfully!"
}
main "$@"