How to Prevent Accidental Script Execution on Critical Servers

Listen to this Post

Featured Image
In a past experience, a shell script intended for client machines was accidentally executed on an LDAP server, causing authentication failures across the company. The script was designed to install and configure packages before rebooting the system, but running it on the server disrupted LDAP services.

To prevent such issues, a pre-check was added to the script to verify the system’s IP before execution:

BLOCKED_IP="xxx.xxx.xxx.xxx"
CURRENT_IP=$(ip addr show eth0 | grep "inet " | awk '{print $2}' | cut -d/ -f1)

if [[ "$CURRENT_IP" == "$BLOCKED_IP" ]]; then
echo "Do not run this script on $BLOCKED_IP (eth0). Exiting."
exit 1
fi

This ensures the script exits immediately if run on the restricted server.

You Should Know:

1. Advanced IP Validation in Scripts

Instead of hardcoding a single IP, use a list of blocked IPs:

BLOCKED_IPS=("192.168.1.1" "10.0.0.1" "172.16.0.1")
CURRENT_IP=$(hostname -I | awk '{print $1}')

for ip in "${BLOCKED_IPS[@]}"; do
if [[ "$CURRENT_IP" == "$ip" ]]; then
echo "This script cannot run on $ip. Aborting."
exit 1
fi
done

2. Checking Hostname Instead of IP

If server hostnames are consistent, verify them:

if [[ $(hostname) == "ldap-server" ]]; then
echo "This script is not allowed on the LDAP server."
exit 1
fi

3. Confirming User Input Before Execution

Add an interactive prompt for critical scripts:

read -p "Are you sure you want to run this script? (yes/no): " confirm
if [[ "$confirm" != "yes" ]]; then
echo "Script aborted by user."
exit 1
fi

4. Logging Script Execution

Track script runs to identify accidental executions:

LOG_FILE="/var/log/script_audit.log"
echo "[$(date)] Script executed by $(whoami) on $(hostname)" >> "$LOG_FILE"

5. Using `systemd` to Restrict Scripts

Create a service that only runs on specific machines:

 /etc/systemd/system/custom-script.service
[bash]
Description=Custom Script
ConditionHost=!ldap-server
ConditionHost=!db-server

[bash]
ExecStart=/path/to/script.sh

6. Network-Based Restrictions

Use firewall rules (iptables/nftables) to block script execution from certain subnets:

iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j DROP  Block SSH from a subnet

7. Using `chattr` to Make Scripts Immutable

Prevent accidental modifications:

sudo chattr +i /path/to/critical_script.sh  Makes file immutable

8. Automated Alerts for Unauthorized Runs

Send an email if a script runs on a restricted machine:

if [[ $(hostname) == "ldap-server" ]]; then
echo "ALERT: Script executed on LDAP server!" | mail -s "Security Alert" [email protected]
exit 1
fi

9. Using `sudo` Restrictions

Limit who can run the script via `sudoers`:

 /etc/sudoers
User_Alias SCRIPT_USERS = user1, user2
Cmnd_Alias CRITICAL_SCRIPTS = /path/to/script.sh
SCRIPT_USERS ALL=(ALL) NOPASSWD: CRITICAL_SCRIPTS

10. Dry Run Mode for Testing

Add a `–dry-run` flag to test scripts safely:

if [[ "$1" == "--dry-run" ]]; then
echo "Dry run: Script would execute commands..."
exit 0
fi

What Undercode Say:

Automation is powerful but risky if not properly guarded. Always implement:
– Pre-execution checks (IP, hostname, user confirmation).
– Logging and alerts for unauthorized runs.
– Immutable scripts (chattr +i) to prevent tampering.
– Network-level restrictions (firewalls, sudoers).
– Dry-run modes for testing.

A single mistake in a script can bring down critical infrastructure. Always predict consequences before execution.

Expected Output:

A secure script that only runs on intended machines, logs executions, and prevents accidental server disruptions.

Prediction:

As automation grows, more companies will enforce mandatory pre-checks in scripts to prevent outages. AI-based script analyzers may soon predict execution risks before deployment.

References:

Reported By: Nuwankaushalya %E0%B6%B8%E0%B6%9A%E0%B6%AD – Hackers Feeds
Extra Hub: Undercode MoN
Basic Verification: Pass ✅

Join Our Cyber World:

💬 Whatsapp | 💬 Telegram