<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://coolscript.net/index.php?action=history&amp;feed=atom&amp;title=Shell_installer_scripts</id>
	<title>Shell installer scripts - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://coolscript.net/index.php?action=history&amp;feed=atom&amp;title=Shell_installer_scripts"/>
	<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Shell_installer_scripts&amp;action=history"/>
	<updated>2026-08-31T23:12:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://coolscript.net/index.php?title=Shell_installer_scripts&amp;diff=1152&amp;oldid=prev</id>
		<title>Admin: Created page with &quot;= Shell Installer Scripts =  Self-contained Bash installers for VPS setup. All Telegram-aware scripts read credentials from &lt;code&gt;/etc/telegram.conf&lt;/code&gt; (owner &lt;code&gt;root:root&lt;/code&gt;, permissions &lt;code&gt;600&lt;/code&gt;). Scripts that require it interactively prompt for missing values during execution; &lt;code&gt;install-shutdown-notify.sh&lt;/code&gt; is the exception and performs a hard abort if the file is absent.  Remote execution pattern (all scripts): &lt;pre&gt; curl -s https://coolsc...&quot;</title>
		<link rel="alternate" type="text/html" href="https://coolscript.net/index.php?title=Shell_installer_scripts&amp;diff=1152&amp;oldid=prev"/>
		<updated>2026-07-28T17:07:10Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;= Shell Installer Scripts =  Self-contained Bash installers for VPS setup. All Telegram-aware scripts read credentials from &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; (owner &amp;lt;code&amp;gt;root:root&amp;lt;/code&amp;gt;, permissions &amp;lt;code&amp;gt;600&amp;lt;/code&amp;gt;). Scripts that require it interactively prompt for missing values during execution; &amp;lt;code&amp;gt;install-shutdown-notify.sh&amp;lt;/code&amp;gt; is the exception and performs a hard abort if the file is absent.  Remote execution pattern (all scripts): &amp;lt;pre&amp;gt; curl -s https://coolsc...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Shell Installer Scripts =&lt;br /&gt;
&lt;br /&gt;
Self-contained Bash installers for VPS setup. All Telegram-aware scripts read credentials from &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; (owner &amp;lt;code&amp;gt;root:root&amp;lt;/code&amp;gt;, permissions &amp;lt;code&amp;gt;600&amp;lt;/code&amp;gt;). Scripts that require it interactively prompt for missing values during execution; &amp;lt;code&amp;gt;install-shutdown-notify.sh&amp;lt;/code&amp;gt; is the exception and performs a hard abort if the file is absent.&lt;br /&gt;
&lt;br /&gt;
Remote execution pattern (all scripts):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -s https://coolscript.net/download/shell/&amp;lt;script-name&amp;gt;.sh | sudo bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Security:&amp;#039;&amp;#039;&amp;#039; piping curl to bash executes unreviewed remote code — only use against URLs you control.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-sudo.sh =&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;Run on VPS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;su -c &amp;#039;curl -s https://coolscript.net/download/shell/install-sudo.sh | bash&amp;#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; (if missing) and adds a target non-root user to the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; group. This is required first on Debian systems that start without &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; preinstalled. No Telegram dependency.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Root required.&amp;#039;&amp;#039;&amp;#039; Run as root (for example: &amp;lt;code&amp;gt;su -&amp;lt;/code&amp;gt;) before executing. You can pass a username as the first script argument; if omitted, the script uses &amp;lt;code&amp;gt;$SUDO_USER&amp;lt;/code&amp;gt; or prompts.&lt;br /&gt;
&lt;br /&gt;
== Installation Flow ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ run as root ] ──► detect target user (arg / $SUDO_USER / prompt)&lt;br /&gt;
                      │&lt;br /&gt;
                      ▼&lt;br /&gt;
             user exists?&lt;br /&gt;
             ├── NO  → abort&lt;br /&gt;
             └── YES → continue&lt;br /&gt;
                      │&lt;br /&gt;
                      ▼&lt;br /&gt;
             sudo installed?&lt;br /&gt;
             ├── YES → skip install&lt;br /&gt;
             └── NO  → apt update &amp;amp;&amp;amp; apt install sudo&lt;br /&gt;
                      │&lt;br /&gt;
                      ▼&lt;br /&gt;
             user in sudo group?&lt;br /&gt;
             ├── YES → skip&lt;br /&gt;
             └── NO  → usermod -aG sudo &amp;lt;user&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* Required first step for minimal Debian images that do not include &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;&lt;br /&gt;
* Group change applies on next login session&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-telegram-ssh-alert.sh =&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;Run on VPS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-telegram-ssh-alert.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hooks a Telegram alert into the PAM SSH stack so every successful SSH login sends a message. Uses &amp;lt;code&amp;gt;pam_exec&amp;lt;/code&amp;gt; with the &amp;lt;code&amp;gt;optional&amp;lt;/code&amp;gt; keyword — alert failure never blocks login. The installer is idempotent (checks for existing PAM line before appending).&lt;br /&gt;
&lt;br /&gt;
== /etc/telegram.conf ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Must exist and contain valid non-empty values.&amp;#039;&amp;#039;&amp;#039; If absent or incomplete the installer pauses and prompts interactively — credentials can be entered inline during &amp;lt;code&amp;gt;curl | bash&amp;lt;/code&amp;gt; execution.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Telegram Alert Configuration&lt;br /&gt;
TELEGRAM_CHAT_ID=&amp;quot;-1xxx&amp;quot;&lt;br /&gt;
TELEGRAM_BOT_TOKEN=&amp;quot;53xxxxx&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TELEGRAM_CHAT_ID&amp;lt;/code&amp;gt;: negative values are group/channel IDs. &amp;lt;code&amp;gt;TELEGRAM_BOT_TOKEN&amp;lt;/code&amp;gt;: issued by &amp;lt;code&amp;gt;@BotFather&amp;lt;/code&amp;gt;. Permissions applied automatically; to reapply manually:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chown root:root /etc/telegram.conf &amp;amp;&amp;amp; chmod 600 /etc/telegram.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alert Script ==&lt;br /&gt;
&lt;br /&gt;
Written to &amp;lt;code&amp;gt;/usr/local/bin/telegram-ssh-alert.sh&amp;lt;/code&amp;gt;. Fires only on &amp;lt;code&amp;gt;PAM_TYPE=open_session&amp;lt;/code&amp;gt;; ignores auth failures and session close. Sent asynchronously (&amp;lt;code&amp;gt;curl ... &amp;amp;&amp;lt;/code&amp;gt;) — zero login latency impact.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Variable !! Source !! Content&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PAM_USER&amp;lt;/code&amp;gt; || PAM || Logged-in username&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PAM_RHOST&amp;lt;/code&amp;gt; || PAM || Remote client IP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;hostname&amp;lt;/code&amp;gt; || syscall || VPS hostname&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; || syscall || Timestamp &amp;lt;code&amp;gt;YYYY-MM-DD HH:MM:SS&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Message format (HTML parse mode):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
🚨 SSH Access Alert&lt;br /&gt;
───────────────&lt;br /&gt;
👤 User:       testuser&lt;br /&gt;
🖥️ Host:       my-vps-hostname&lt;br /&gt;
🌐 IP Address: 203.0.113.42&lt;br /&gt;
⏰ Time:       2026-07-27 14:35:00&lt;br /&gt;
───────────────&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
API call:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -s -X POST &amp;quot;https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage&amp;quot; \&lt;br /&gt;
    -d &amp;quot;chat_id=${TELEGRAM_CHAT_ID}&amp;quot; \&lt;br /&gt;
    -d &amp;quot;parse_mode=HTML&amp;quot; \&lt;br /&gt;
    -d &amp;quot;text=${MESSAGE}&amp;quot; &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PAM Line ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session optional pam_exec.so /usr/local/bin/telegram-ssh-alert.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation Flow ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ curl | bash ] ──► root check&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              /etc/telegram.conf exists?&lt;br /&gt;
              ├── YES → variables non-empty? ──► YES → continue&lt;br /&gt;
              │                              └── NO  → prompt&lt;br /&gt;
              └── NO  → prompt&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              Write + chmod +x /usr/local/bin/telegram-ssh-alert.sh&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              PAM line in /etc/pam.d/sshd?&lt;br /&gt;
              ├── YES → skip&lt;br /&gt;
              └── NO  → append&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              Live test: PAM_TYPE=open_session PAM_USER=InstallerTest PAM_RHOST=127.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Perm !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; || 600 || Credentials — must be valid&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/usr/local/bin/telegram-ssh-alert.sh&amp;lt;/code&amp;gt; || +x || PAM-invoked alert script&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt; || — || PAM config (one line appended)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! Cause !! Fix&lt;br /&gt;
|-&lt;br /&gt;
| No notification on login || &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; missing or placeholder values || Recreate from template; rerun installer&lt;br /&gt;
|-&lt;br /&gt;
| Login blocked || PAM line uses &amp;lt;code&amp;gt;required&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;optional&amp;lt;/code&amp;gt; || Edit &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt; to use &amp;lt;code&amp;gt;optional&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Test works, live SSH does not || PAM cannot read config (wrong permissions) || &amp;lt;code&amp;gt;chmod 600 /etc/telegram.conf&amp;lt;/code&amp;gt;, owner must be &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curl: command not found&amp;lt;/code&amp;gt; || curl absent || &amp;lt;code&amp;gt;apt install curl&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;yum install curl&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate PAM entries || Installer run multiple times || Remove duplicate lines from &amp;lt;code&amp;gt;/etc/pam.d/sshd&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-boot-notify.sh =&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;Run on VPS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-boot-notify.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs a systemd one-shot service (&amp;lt;code&amp;gt;After=network-online.target&amp;lt;/code&amp;gt;) that sends hostname, local IP, public IP (&amp;lt;code&amp;gt;ifconfig.me&amp;lt;/code&amp;gt;), and timestamp to Telegram on every boot.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Root required.&amp;#039;&amp;#039;&amp;#039; Interactive — prompts for credentials if &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; is absent or incomplete (same flow as SSH alert installer). Config file created with &amp;lt;code&amp;gt;chmod 600&amp;lt;/code&amp;gt; automatically.&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Perm !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/usr/local/bin/telegram-boot-notify.sh&amp;lt;/code&amp;gt; || 700 || Notification script&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/systemd/system/telegram-boot-notify.service&amp;lt;/code&amp;gt; || — || Systemd unit (enabled automatically)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; || 600 || Credentials — created if absent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Systemd Unit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Send Telegram notification with IP address on startup&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/local/bin/telegram-boot-notify.sh&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;RemainAfterExit=yes&amp;lt;/code&amp;gt; keeps the unit active after script exit so &amp;lt;code&amp;gt;systemctl status&amp;lt;/code&amp;gt; shows the last run result.&lt;br /&gt;
&lt;br /&gt;
== Notification ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
🚀 Server Boot Notification&lt;br /&gt;
&lt;br /&gt;
🖥 Host:       my-vps-hostname&lt;br /&gt;
📅 Date &amp;amp; Time: 2026-07-27 09:00:00 UTC&lt;br /&gt;
&lt;br /&gt;
📡 IP Addresses:&lt;br /&gt;
• Local IP:  10.0.0.5&lt;br /&gt;
• Public IP: 203.0.113.42&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uses Markdown parse mode. Local IP via &amp;lt;code&amp;gt;ip route get 1.1.1.1&amp;lt;/code&amp;gt;; public IP via &amp;lt;code&amp;gt;curl ifconfig.me&amp;lt;/code&amp;gt; (10 s timeout, falls back to &amp;quot;Unavailable&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-shutdown-notify.sh =&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;Run on VPS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-shutdown-notify.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs a systemd service that fires a Telegram notification on shutdown or reboot. Detects event type by inspecting active systemd jobs at stop time.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Root required.&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; must already exist with valid values — this script performs a hard abort if missing or empty. It does not prompt interactively.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Validate before running:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source /etc/telegram.conf &amp;amp;&amp;amp; echo &amp;quot;$TELEGRAM_BOT_TOKEN&amp;quot; &amp;amp;&amp;amp; echo &amp;quot;$TELEGRAM_CHAT_ID&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Perm !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/usr/local/bin/telegram-shutdown-notify.sh&amp;lt;/code&amp;gt; || 700 || Notification script&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/systemd/system/telegram-shutdown-notify.service&amp;lt;/code&amp;gt; || — || Systemd unit (enabled automatically)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Systemd Unit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Send Telegram notification on system shutdown or reboot&lt;br /&gt;
DefaultDependencies=no&lt;br /&gt;
After=network-online.target time-sync.target&lt;br /&gt;
Requires=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/bin/true&lt;br /&gt;
ExecStop=/usr/local/bin/telegram-shutdown-notify.sh&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The notification runs from &amp;lt;code&amp;gt;ExecStop&amp;lt;/code&amp;gt; — triggered when systemd stops the unit during shutdown, while the network is still up. &amp;lt;code&amp;gt;DefaultDependencies=no&amp;lt;/code&amp;gt; prevents default shutdown ordering from running the unit too late.&lt;br /&gt;
&lt;br /&gt;
== Event Detection ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Detected job !! Message label&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reboot.target&amp;lt;/code&amp;gt; starting || Rebooting 🔄&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;poweroff.target&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;halt.target&amp;lt;/code&amp;gt; starting || Shutting Down 🛑&lt;br /&gt;
|-&lt;br /&gt;
| None matched || Stopping / Shutting Down 🛑&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notification ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
🛑 Server Event: Shutting Down 🛑&lt;br /&gt;
&lt;br /&gt;
🖥 Host:    my-vps-hostname&lt;br /&gt;
📅 Date &amp;amp; Time: 2026-07-27 23:59:00 UTC&lt;br /&gt;
⏱ Uptime before event: up 3 days, 4 hours, 12 minutes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-clean-shutdown.sh =&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;Run on VPS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-clean-shutdown.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs a udev rule that triggers &amp;lt;code&amp;gt;shutdown -h now&amp;lt;/code&amp;gt; when a USB stick with the filesystem label &amp;lt;code&amp;gt;RASPI-CLEAN-SHUTDOWN&amp;lt;/code&amp;gt; is inserted. Designed for Raspberry Pi but works on any udev-based Linux system. No Telegram dependency.&lt;br /&gt;
&lt;br /&gt;
Primarily used on Raspberry Pi hosts for clean power-off without keyboard/network access.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Root required.&amp;#039;&amp;#039;&amp;#039; If the script or rule already exists the installer asks before overwriting; declining skips that component without aborting.&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/usr/local/bin/usb-clean-shutdown.sh&amp;lt;/code&amp;gt; || Logs via &amp;lt;code&amp;gt;logger -t raspi-shutdown&amp;lt;/code&amp;gt; then calls &amp;lt;code&amp;gt;shutdown -h now&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/udev/rules.d/90-raspi-shutdown.rules&amp;lt;/code&amp;gt; || udev rule — watches block devices for the label&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== udev Rule ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;block&amp;quot;, ENV{ID_FS_LABEL}==&amp;quot;RASPI-CLEAN-SHUTDOWN&amp;quot;, RUN+=&amp;quot;/usr/local/bin/usb-clean-shutdown.sh&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fires on &amp;lt;code&amp;gt;ACTION==add&amp;lt;/code&amp;gt; (insert), &amp;lt;code&amp;gt;SUBSYSTEM==block&amp;lt;/code&amp;gt;, label match is case-sensitive.&lt;br /&gt;
&lt;br /&gt;
== Prepare the USB Stick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FAT32&lt;br /&gt;
mkfs.vfat -n RASPI-CLEAN-SHUTDOWN /dev/sdX&lt;br /&gt;
&lt;br /&gt;
# ext4&lt;br /&gt;
mkfs.ext4 -L RASPI-CLEAN-SHUTDOWN /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verify the label before use: &amp;lt;code&amp;gt;lsblk -o NAME,LABEL&amp;lt;/code&amp;gt;. Confirm syslog entry after trigger: &amp;lt;code&amp;gt;journalctl -t raspi-shutdown&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-fzf.sh =&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;Run on VPS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-fzf.sh | bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs &amp;lt;code&amp;gt;fzf&amp;lt;/code&amp;gt; via &amp;lt;code&amp;gt;apt-get&amp;lt;/code&amp;gt; and appends the keybinding source line to &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt;. Idempotent — skips append if the line is already present. No root required (uses &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; internally for apt). No Telegram dependency.&lt;br /&gt;
&lt;br /&gt;
Apply after install: &amp;lt;code&amp;gt;source ~/.bashrc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Keybindings ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Key !! Action&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl+R || Fuzzy search shell history&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl+T || Fuzzy-find file, paste path to prompt&lt;br /&gt;
|-&lt;br /&gt;
| Alt+C || Fuzzy-find directory and &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into it&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The installer auto-detects the keybindings file from three standard paths (&amp;lt;code&amp;gt;/usr/share/doc/fzf/examples/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/usr/share/fzf/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/usr/share/doc/fzf/&amp;lt;/code&amp;gt;). Exits with an error if none exist — this can occur on non-Debian distributions.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-prompt.sh =&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;Run on VPS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-prompt.sh | bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets a colourful &amp;lt;code&amp;gt;PS1&amp;lt;/code&amp;gt; prompt in &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt;. No root required. No Telegram dependency. Idempotent — checks for ANSI codes &amp;lt;code&amp;gt;01;31m&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;01;35m&amp;lt;/code&amp;gt; before appending.&lt;br /&gt;
&lt;br /&gt;
Apply after install: &amp;lt;code&amp;gt;source ~/.bashrc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prompt ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user@hostname /current/directory $&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Element !! Colour&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\u&amp;lt;/code&amp;gt; (user) || Bold red &amp;lt;code&amp;gt;01;31m&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\h&amp;lt;/code&amp;gt; (host) || Bold cyan &amp;lt;code&amp;gt;01;36m&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\w&amp;lt;/code&amp;gt; (path) || Bold yellow &amp;lt;code&amp;gt;01;33m&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Bold magenta &amp;lt;code&amp;gt;01;35m&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-neofetch.sh =&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;Run on VPS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-neofetch.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs &amp;lt;code&amp;gt;neowofetch&amp;lt;/code&amp;gt; via &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt; and creates a global profile trigger at &amp;lt;code&amp;gt;/etc/profile.d/neowofetch-ssh.sh&amp;lt;/code&amp;gt; that automatically runs &amp;lt;code&amp;gt;neowofetch&amp;lt;/code&amp;gt; for any user logging in via SSH. No Telegram dependency.&lt;br /&gt;
&lt;br /&gt;
Apply immediately without rebooting: open a new SSH session.&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Perm !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/profile.d/neowofetch-ssh.sh&amp;lt;/code&amp;gt; || 644 || Global profile trigger — runs &amp;lt;code&amp;gt;neowofetch&amp;lt;/code&amp;gt; on SSH login&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Profile Trigger ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Auto-run neowofetch on SSH login for all users&lt;br /&gt;
if [ -n &amp;quot;$SSH_CLIENT&amp;quot; ] || [ -n &amp;quot;$SSH_TTY&amp;quot; ]; then&lt;br /&gt;
    # Run only if standard output is a TTY and NOT running under sudo/sudo -i&lt;br /&gt;
    if [ -t 1 ] &amp;amp;&amp;amp; [ -z &amp;quot;$SUDO_USER&amp;quot; ]; then&lt;br /&gt;
        neowofetch&lt;br /&gt;
    fi&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conditions for execution:&lt;br /&gt;
* &amp;lt;code&amp;gt;SSH_CLIENT&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SSH_TTY&amp;lt;/code&amp;gt; is set — real SSH session&lt;br /&gt;
* stdout is a TTY (&amp;lt;code&amp;gt;-t 1&amp;lt;/code&amp;gt;) — suppresses output in non-interactive contexts (e.g., &amp;lt;code&amp;gt;scp&amp;lt;/code&amp;gt;, automated scripts)&lt;br /&gt;
* &amp;lt;code&amp;gt;SUDO_USER&amp;lt;/code&amp;gt; is unset — does not fire again for &amp;lt;code&amp;gt;sudo -i&amp;lt;/code&amp;gt; shells inside an existing session&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-core-tools.sh =&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;Run on VPS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-core-tools.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs a comprehensive set of development, networking, and shell utility packages via &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt; in a single pass. No Telegram dependency.&lt;br /&gt;
&lt;br /&gt;
== Packages ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Group !! Packages&lt;br /&gt;
|-&lt;br /&gt;
| Build tools || &amp;lt;code&amp;gt;build-essential&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gdb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;valgrind&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cmake&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ninja-build&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pkg-config&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Version control || &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;git-lfs&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Python || &amp;lt;code&amp;gt;python3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;python3-pip&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;python3-venv&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Dev libraries || &amp;lt;code&amp;gt;libssl-dev&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;libffi-dev&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;zlib1g-dev&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Network (config) || &amp;lt;code&amp;gt;iproute2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;net-tools&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;iputils-ping&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;traceroute&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mtr-tiny&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dnsutils&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Network (probe) || &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nmap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tcpdump&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;socat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;netcat-openbsd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Network (monitor) || &amp;lt;code&amp;gt;iftop&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nload&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Shell utilities || &amp;lt;code&amp;gt;htop&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jq&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tree&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tmux&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= install-docker.sh =&lt;br /&gt;
&lt;br /&gt;
; &amp;#039;&amp;#039;&amp;#039;Run on VPS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
: &amp;lt;pre&amp;gt;curl -s https://coolscript.net/download/shell/install-docker.sh | sudo bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installs Docker CE from the official Docker apt repository using the distro&amp;#039;s GPG key. Adds the invoking user to the &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; group. No Telegram dependency.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Root required.&amp;#039;&amp;#039;&amp;#039; Group membership takes effect after logout/login or &amp;lt;code&amp;gt;newgrp docker&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Installation Flow ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ curl | bash ] ──► Install prerequisites (ca-certificates, curl)&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              Add Docker GPG key → /etc/apt/keyrings/docker.asc&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              Add apt source → /etc/apt/sources.list.d/docker.list&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              apt update &amp;amp;&amp;amp; install docker-ce, docker-ce-cli, containerd.io,&lt;br /&gt;
                                    docker-buildx-plugin, docker-compose-plugin&lt;br /&gt;
                       │&lt;br /&gt;
                       ▼&lt;br /&gt;
              usermod -aG docker $USER&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/apt/keyrings/docker.asc&amp;lt;/code&amp;gt; || Docker signing key (&amp;lt;code&amp;gt;chmod a+r&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/apt/sources.list.d/docker.list&amp;lt;/code&amp;gt; || Docker apt repository entry&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Packages Installed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Package !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;docker-ce&amp;lt;/code&amp;gt; || Docker daemon&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;docker-ce-cli&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; CLI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;containerd.io&amp;lt;/code&amp;gt; || Container runtime&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;docker-buildx-plugin&amp;lt;/code&amp;gt; || Multi-platform image builds&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;docker-compose-plugin&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;docker compose&amp;lt;/code&amp;gt; subcommand&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Summary =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Script !! Root !! /etc/telegram.conf !! Mechanism !! Interactive !! curl install&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-sudo.sh&amp;lt;/code&amp;gt; || Yes (must run as root) || Not used || apt sudo install + &amp;lt;code&amp;gt;usermod -aG sudo&amp;lt;/code&amp;gt; || Yes — may prompt for username || &amp;lt;code&amp;gt;su -c &amp;#039;curl -s https://coolscript.net/download/shell/install-sudo.sh &amp;amp;#124; bash -s username&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-prompt.sh&amp;lt;/code&amp;gt; || No || Not used || &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; PS1 || No || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-prompt.sh &amp;amp;#124; bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-fzf.sh&amp;lt;/code&amp;gt; || No (sudo inside) || Not used || apt + &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; || No || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-fzf.sh &amp;amp;#124; bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-core-tools.sh&amp;lt;/code&amp;gt; || Yes (sudo inside) || Not used || apt bulk install || No || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-core-tools.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-docker.sh&amp;lt;/code&amp;gt; || Yes || Not used || Official Docker apt repo + GPG key || No || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-docker.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-telegram-ssh-alert.sh&amp;lt;/code&amp;gt; || Yes || Creates if missing || PAM &amp;lt;code&amp;gt;pam_exec optional&amp;lt;/code&amp;gt; || Yes — credential prompt || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-telegram-ssh-alert.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-boot-notify.sh&amp;lt;/code&amp;gt; || Yes || Creates if missing || systemd one-shot || Yes — credential prompt || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-boot-notify.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-shutdown-notify.sh&amp;lt;/code&amp;gt; || Yes || &amp;#039;&amp;#039;&amp;#039;Must exist&amp;#039;&amp;#039;&amp;#039; (hard abort) || systemd &amp;lt;code&amp;gt;ExecStop&amp;lt;/code&amp;gt; || No || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-shutdown-notify.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-clean-shutdown.sh&amp;lt;/code&amp;gt; || Yes || Not used || udev block rule for Raspberry || Yes — overwrite prompt || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-clean-shutdown.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;install-neofetch.sh&amp;lt;/code&amp;gt; || Yes (sudo inside) || Not used || &amp;lt;code&amp;gt;/etc/profile.d&amp;lt;/code&amp;gt; global trigger || No || &amp;lt;code&amp;gt;curl -s https://coolscript.net/download/shell/install-neofetch.sh &amp;amp;#124; sudo bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Recommended Installation Order ==&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;install-sudo.sh&amp;lt;/code&amp;gt; — required first on Debian images where &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; is not installed&lt;br /&gt;
# &amp;lt;code&amp;gt;install-prompt.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;install-fzf.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;install-core-tools.sh&amp;lt;/code&amp;gt; — standalone, no ordering constraint&lt;br /&gt;
# &amp;lt;code&amp;gt;install-docker.sh&amp;lt;/code&amp;gt; — standalone, no ordering constraint&lt;br /&gt;
# &amp;lt;code&amp;gt;create /etc/telegram.conf&amp;lt;/code&amp;gt; — add TELEGRAM_CHAT_ID and TELEGRAM_BOT_TOKEN&lt;br /&gt;
# &amp;lt;code&amp;gt;install-telegram-ssh-alert.sh&amp;lt;/code&amp;gt; — creates &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; interactively&lt;br /&gt;
# &amp;lt;code&amp;gt;install-boot-notify.sh&amp;lt;/code&amp;gt; — reuses or creates &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;install-shutdown-notify.sh&amp;lt;/code&amp;gt; — requires &amp;lt;code&amp;gt;/etc/telegram.conf&amp;lt;/code&amp;gt; to already exist&lt;br /&gt;
# &amp;lt;code&amp;gt;install-clean-shutdown.sh&amp;lt;/code&amp;gt; — standalone, no ordering constraint&lt;br /&gt;
# &amp;lt;code&amp;gt;install-neofetch.sh&amp;lt;/code&amp;gt; — standalone, no ordering constraint&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>