A growing hub of useful shell scripts for Proxmox VE.
Fast to run. Easy to reuse. Built for real-world homelab and admin workflows.
victor-root.github.io/Proxmox-Tools
Every script with what it does, what it writes on your machine, the line to run it
and a preview of its menu.
In English and French, light and dark. Same files as this repository, nothing else.
Proxmox-Tools is a central place for small, practical, focused scripts made to improve day-to-day life on Proxmox VE.
The goal is simple:
- π§° keep each tool independent
- β‘ make scripts runnable in one command
- π keep behavior clear and predictable
- πΎ always prefer safe changes with backup/restore when possible
- π¦ build a reusable toolbox / hub instead of one giant script
This repository is meant to grow over time with more Proxmox-oriented utilities.
Click a script to unfold what it does, what it supports and the line to run it.
π±οΈ Open Proxmox consoles in new tabs
Script: pve-console-newtab.sh
Adds a more convenient browser workflow for the Proxmox VE web interface:
- π±οΈ Middle click on the main Console button opens the default web console in a new tab
- π±οΈ Middle click on noVNC opens it in a new tab
- π±οΈ Middle click on xterm.js opens it in a new tab
- π±οΈ Middle click on SPICE behaves like a normal click, without opening a useless browser tab
- π³ separate option: middle click on a VM or container of the left tree opens its console in a new tab, where that click did nothing before
- πΎ automatic backup before patching
- β»οΈ built-in restore options
- π interactive menu
Checked against the official Proxmox VE sources:
| Proxmox VE | Status |
|---|---|
9.x (pve-manager 9.0.0 to 9.2.11) |
β supported |
8.4.2 and newer (with proxmox-widget-toolkit 4.3.12+) |
β supported |
| 8.4.1 and older (8.0, 8.1, 8.2, 8.3) | β not supported |
Proxmox re-formatted its JavaScript sources in June 2025, so the code blocks this patch targets only match releases published after that change.
On an unsupported release the script stops with a clear message, creates no backup and leaves both files untouched, so nothing can break.
Each of the two patched files is also checked and patched on its own: a Proxmox update that refreshes only one of the two packages can simply be re-patched.
Option 6 is a second, separate patch. It reuses the console Proxmox VE already opens when you double click a guest in the left tree, with the same viewer choice, and asks for it in a new tab instead of a window. The middle click has no function there in stock Proxmox VE, and the current selection is left untouched, so nothing that worked before changes.
It needs the main patch first, since that is what teaches the console how to open in a tab, and the script says so instead of touching a file for nothing. Templates, nodes and storages stay without effect, exactly like on a double click. The two code blocks it needs are identical in Proxmox VE 8 and 9.
bash <(curl -fsSL https://raw.githubusercontent.com/Victor-root/Proxmox-Tools/main/scripts/pve-console-newtab.sh)π Remove the subscription notice
Script: pve-remove-subscription-notice.sh
Removes the "No valid subscription" popup from the Proxmox VE web interface:
- π no more popup at every login
- π§© the buttons that depend on that check keep working (package versions, system report, APT refresh, add repository)
- π± separate option for the mobile interface of Proxmox VE 9, which is another application entirely and needs its own patch
- π optional automatic re-apply after a package update, through an APT hook
- πΎ automatic backup before patching
- β»οΈ built-in restore options
- π interactive menu
βΉοΈ Proxmox VE stays free software either way, but a subscription funds its development and gives access to the enterprise repository.
β³ The final
pveproxyrestart can take up to a minute, and the web interface stays unreachable meanwhile. See About the pveproxy restart.
Checked against the official Proxmox VE sources: the patch applies from proxmox-widget-toolkit 4.0.9 to 5.2.8, which covers Proxmox VE 8.0 through 9.2.
The widely shared one-liner for this comments out the popup itself, which also silently kills every button that waits for it. This script instead lets the requested action run straight away, so nothing else changes. On an unsupported release it stops with a clear message, creates no backup and leaves the file untouched.
Proxmox VE 9 only. The mobile interface of Proxmox VE 9 is a separate application compiled to WebAssembly, so the JavaScript patch above never reaches it and its popup keeps showing on a phone. Proxmox VE 8 ships a different, older mobile interface that this patch does not touch, so on 8 the script refuses the option instead of changing a file for nothing. It nags when the node list comes back without a support level, and that level is filled by one line of Perl in PVE/API2Tools.pm, which is what option 8 patches, with its own backup and its own way back.
That patch is offered separately because it is not the same kind of change: it modifies what the API answers about the support level of the nodes, so a monitoring tool reading that list will see community. The per node subscription endpoint is left alone, the Subscription panel keeps reporting that there is no subscription, and nothing is unlocked: the enterprise repository still needs a real key. The script spells all of this out and asks for confirmation before touching anything.
bash <(curl -fsSL https://raw.githubusercontent.com/Victor-root/Proxmox-Tools/main/scripts/pve-remove-subscription-notice.sh)π Proxmox VE default language manager
Script: pve-default-language-i18n
Changes the default Proxmox VE language for both the shell and the web interface:
- π set the default system locale
- π₯οΈ set the default Proxmox VE web UI language
- π± optional, Proxmox VE 9 only: apply that same default to its mobile interface, which otherwise always starts in English
- π§ auto-detect the server language for the script interface
- π¬π§ fallback to English if the detected language is unsupported
- π optionally configure timezone and NTP
- πΎ automatic backup before changes
- β»οΈ built-in restore options
- π interactive menu
β οΈ Keep an active root SSH session open while running this script, in case the Proxmox VE web interface does not restart correctly.
Checked against the official Proxmox VE sources: the system locale mechanism and the language key of /etc/pve/datacenter.cfg are identical from 8.x to 9.2, so this script behaves the same on both.
Proxmox VE only accepts a fixed list of languages for its web interface. For a language it does not offer (Galician, Hungarian), the system locale is still applied and datacenter.cfg is left untouched, with a clear warning, instead of writing a value Proxmox would silently drop.
Proxmox VE 9 only. The mobile interface of Proxmox VE 9 is a separate application, and it does not read the language of datacenter.cfg. Proxmox VE 8 ships a different, older mobile interface, so on 8 the option reports that this interface is not installed and changes nothing. It keeps its own language in the browser storage, so it starts in English on every new device and in every private window, until someone picks a language in its settings.
Option 7 adds a few lines to its page so a browser that never chose a language starts with the one from datacenter.cfg. A choice made in the mobile settings still wins, and option 8 removes those lines. The page belongs to Proxmox VE, so an update of the mobile interface package drops them and the option simply puts them back.
bash <(curl -fsSL https://raw.githubusercontent.com/Victor-root/Proxmox-Tools/main/scripts/pve-default-language-i18n)π WireGuard VPN server installer & client manager (LXC)
Script: lxc-wireguard-server-install.sh
Installs and manages a native WireGuard VPN server inside a Debian/Ubuntu LXC on Proxmox (no Docker), through an interactive menu:
- π§ guided install with 3 clear network modes: private network, LAN access, full Internet tunnel
- π€ full client lifecycle: add, list (with live connection state), show / re-scan (config + QR code), revoke
- π©Ί diagnostic that checks the service, UDP port, IPv4 routing, firewall rules and connected clients, in plain language
- π endpoint by public IP or domain, with a CGNAT warning and a check that the domain points to the server
- π§± automatic nftables rules and IPv4 forwarding for LAN / full-tunnel modes
- π§ per-client tunables: AllowedIPs, DNS, PersistentKeepalive, MTU (default 1420)
- π§ remembers your settings (endpoint, port, network) after the first run
- π interface in English or French, following the system locale, English by default
- πΎ built-in backup / restore of the whole configuration
- π§Ή clean uninstall
- π interactive menu
bash <(curl -fsSL https://raw.githubusercontent.com/Victor-root/Proxmox-Tools/main/scripts/lxc-wireguard-server-install.sh)
β οΈ Run it as root inside the target LXC (not on the Proxmox host). On an unprivileged container, WireGuard needs/dev/net/tunpassed through: the script detects this and shows the exactpct setcommands to run on the host if needed.
π₯οΈ Fastfetch summary on every root shell
Script: pve-fastfetch-motd.sh
Installs Fastfetch and turns it into a clean Proxmox summary displayed every time a root shell opens:
- π¦ installs the latest stable Fastfetch release from GitHub, with automatic architecture detection (amd64, arm64, armhf, ppc64el, riscv64, s390x)
- π¨ writes a ready-to-use Proxmox themed configuration, split in three blocks: hypervisor info, physical resources, network and access
- π live values: PVE version, CPU temperature and usage, RAM, swap, storage, ZFS pool health, bridge state, local and public IP, DNS, Fail2ban jails
- π optional HTTPS certificate check on a FQDN you provide, which reads only the public certificate presented by your reverse proxy, never a private key
- βοΈ or paste your own
config.jsoncstraight into the menu: Fastfetch checks it, and it replaces the generated one only if it is valid - π displayed only in interactive root shells, never during scripts, file transfers or automation
- π§Ή disables the old Debian MOTD, with the original state saved for a later restore
- β»οΈ two removal levels: stop the display at every shell session and keep Fastfetch, or remove everything and uninstall the package
- πΎ automatic backup of an existing Fastfetch configuration before writing
- π interface and generated labels in English or French, following the server locale
- π interactive menu
The script only relies on pveversion, apt and the official Fastfetch packages, so it behaves the same on Proxmox VE 8.x and 9.x.
It stops with a clear message when it is not run as root on a Proxmox VE host, and running it again is safe: an up-to-date Fastfetch is not downloaded twice, and the login hook and MOTD changes are simply re-applied.
The bridge shown in the network block is detected from the default route, with vmbr0 as fallback, and no domain, IP or hostname is ever hard coded in the script.
bash <(curl -fsSL https://raw.githubusercontent.com/Victor-root/Proxmox-Tools/main/scripts/pve-fastfetch-motd.sh)βΉοΈ Open a new root shell after the installation to see the result.
π³ Default panel layout (tree and Logs panel)
Script: pve-expand-node-tree.sh
Fixes two Proxmox VE panels that always start in the wrong state and need a manual click on their chevron after every login:
- π³ each PVE node in the left resource tree opens automatically on the default Server View, exactly like clicking its chevron by hand
- π― targeted: pools, storages, VMs and containers stay as they are, only the node groups themselves are affected
- π separate option: the bottom Logs panel (Tasks tab and cluster log) collapses by default instead of covering part of the screen at every login
- πΎ automatic backup before patching
- β»οΈ built-in restore options, plus a direct on/off toggle for the Logs panel
- π interactive menu
Checked against the official Proxmox VE sources: both patched lines are identical in Proxmox VE 8 and 9, so this script behaves the same on both.
On an unsupported release it stops with a clear message, creates no backup and leaves the file untouched.
bash <(curl -fsSL https://raw.githubusercontent.com/Victor-root/Proxmox-Tools/main/scripts/pve-expand-node-tree.sh)π₯οΈ Console scrollback (xterm.js history)
Script: pve-xtermjs-scrollback.sh
Raises the history of the Proxmox VE web consoles from the default 1000 lines to the size you choose:
- π’ pick one of five ready-made sizes (10000 to 250000 lines, 100000 recommended) or type your own number (1000 to 1000000), and change it again later from the same menu entry
- π₯οΈ applies to every xterm.js console: the host shell, containers and the serial console of VMs
- π set once on the server, so there is nothing to redo in each browser on each computer
- π― changes a single line of
/usr/share/pve-xtermjs/util.js: the default options handed to every console - π the expected code is matched exactly before any change: if the file looks different the script says so and touches nothing
- π safe to run twice: an already patched file is detected and left alone
- πΎ automatic backup before patching
- β»οΈ built-in restore options
- π§ͺ a test option prints 500 more numbered lines than the limit you chose, so you can scroll up and check it right away
- π interactive menu
- Memory: the history is stored by the browser. A full console takes about 1 MB per 1000 lines at 80 columns and 2.5 MB at 200 columns, per open tab: 100000 lines is about 100 MB and 240 MB. The script shows the figure for your choice before asking to confirm. Lines are only stored as text is displayed, an empty console stays light.
- A value saved in a browser wins. Recent versions of
pve-xtermjsread apve-xterm-scrollbackkey from the browser storage, there is no field for it in the Proxmox settings yet, and it takes priority over the default set by this script. - No restart needed:
pveproxyreads the file on every request. Open a new console. - The browser cache can hide the change. Proxmox sends no expiry for this file, so a browser may keep the old copy for days, and a plain or even hard refresh is not always enough. Check in a private window, then clear the site data in each browser you use.
- Updates of the
pve-xtermjspackage overwrite the file, run the script again afterwards.
Checked against the official Proxmox sources: the patched block is identical in every published version of util.js, from Proxmox VE 8 (pve-xtermjs 5.x) to 9.2 (6.0.0-2), so this script behaves the same on both.
On an unexpected file it stops with a clear message, creates no backup and leaves the file untouched.
bash <(curl -fsSL https://raw.githubusercontent.com/Victor-root/Proxmox-Tools/main/scripts/pve-xtermjs-scrollback.sh)Each script lives as its own file inside the scripts/ directory.
That means:
- you can call one specific script directly
- you do not need a global installer for everything
- each tool can evolve independently
- sharing a tool is easy with a targeted raw GitHub URL
Example layout:
scripts/
βββ pve-console-newtab.sh
βββ pve-default-language-i18n
βββ future-tool-1.sh
βββ future-tool-2.sh
βββ ...
Some tools in this repository may modify Proxmox files or behavior.
Before using any script:
- read what it does
- keep an active root SSH session open
- make sure you understand the rollback path
- prefer testing on a non-critical node first
When relevant, scripts in this repository should:
- create backups before changes
- fail safely if expected patterns are not found
- avoid destructive behavior by default
Every script that changes the web interface restarts pveproxy at the end. That restart can take up to a minute: on start Proxmox refreshes the cluster certificates (pvecm updatecerts), and on a first run it may also refresh the appliance template list.
The web interface stays unreachable during that time, and the script looks frozen while it waits. This is expected. Let it finish rather than interrupting it, and reload the page with Ctrl+Shift+R once it is done.
This repo is intended to become a practical Proxmox utility hub, for example:
- UI enhancements
- backup helpers
- audit / health-check scripts
- storage / ZFS helpers
- cluster helpers
- networking helpers
- quick-fix admin tools
The main idea is not to build a huge framework.
The idea is to keep things:
- simple
- useful
- modular
- easy to launch
Ideas, fixes, and improvements are welcome.
Good contributions are usually:
- focused on one real problem
- easy to understand
- safe to test
- easy to remove or rollback
This repository is published under the GNU Affero General Public License v3.0. The full text is in LICENSE.
You can use, study, change and share these scripts, as long as what you share stays under the same license and keeps the credit.
These scripts are provided as-is.
Use them carefully, review them before running them, and test them in your own environment.
Because Proxmox is great, but there are always a few small things that can be made faster, cleaner, or less annoying with the right script.
This repository exists to collect those improvements in one place.