You can safely shut down multiple Raspberry Pi devices on a local network by using an SSH-based automation script that leverages passwordless authentication. This method eliminates the need for physical access or complex network management tools, allowing you to send a single command from a central machine to gracefully halt all connected Linux systems via the secure shell protocol.
Prerequisites and Network Configuration
Before automating shutdowns, ensure that your Raspberry Pi devices are properly configured for remote access. The most critical step is establishing reliable network connectivity between your control machine and the target Pis. You must know the IP addresses or hostnames of each device. If your network uses DHCP, consider assigning static IPs or setting up a DHCP reservation to prevent address changes that could break your automation scripts.
Additionally, verify that the
ssh service is enabled on every Raspberry Pi. On the Pi itself, this is typically done through the
raspi-config utility under Interface Options. Once enabled, ensure that the firewall settings (if any) allow inbound connections on port 22. Without these foundational steps, any attempt to connect remotely will fail immediately. For more details on resolving basic connectivity errors, see
Troubleshooting SSH Connection Issues on Linux.
Setting Up Passwordless Authentication
To automate the process without prompting for passwords, you must configure SSH key-based authentication. This involves generating a public-private key pair on the control machine and distributing the public key to all Raspberry Pi targets. First, generate a new key pair if you do not have one already by running
ssh-keygen -t ed25519 in your terminal. It is advisable to leave the passphrase empty if this script runs unattended, though adding a passphrase adds security at the cost of manual intervention.
Next, copy the public key to each Raspberry Pi. You can use the
ssh-copy-id command for simplicity:
ssh-copy-id pi@. Replace
pi with your actual username if it differs. This command appends your public key to the
~/.ssh/authorized_keys file on the remote device. After this setup, you should be able to log into any Pi without entering a password. If you encounter permission issues during this phase, review guides on
How to Access IP/Hostname on Windows using SSH Server for cross-platform nuances.
Creating the Shutdown Script
With authentication established, you can write a bash script to handle the shutdown sequence. Create a file named
shutdown_pis.sh and make it executable. Inside the script, define an array containing the IP addresses or hostnames of all your Raspberry Pi devices. This structure allows you to easily add or remove devices by simply editing the list.
The core logic iterates through this array. For each IP, the script executes the
ssh command followed by the
sudo poweroff command. Using
sudo ensures the system shuts down completely rather than just logging out the user. To ensure the command runs smoothly, append
-T to set a timeout, preventing the script from hanging indefinitely if a device is unreachable. Here is a basic example of the loop structure:
#!/bin/bash
# List of Raspberry Pi IPs
PIS=("192.168.1.10" "192.168.1.11" "192.168.1.12")
for IP in "${PIS[@]}"; do
echo "Shutting down $IP..."
ssh -o ConnectTimeout=5 -o BatchMode=yes pi@$IP "sudo poweroff"
if [ $? -eq 0 ]; then
echo "Command sent successfully to $IP."
else
echo "Failed to reach $IP."
fi
done
Executing and Verifying the Shutdown
Run the script from your terminal. You will see output indicating which devices were reached and which failed. Because
poweroff initiates a graceful shutdown, the operating system will flush disk caches and stop services before cutting power. This prevents data corruption that might occur from hard resets.
After executing the script, wait a few minutes for the devices to power down completely. You can verify the status by pinging the IP addresses; they should no longer respond. If some devices remain online, check your network logs or try connecting manually to diagnose why the SSH command failed. Common issues include stale DNS entries or temporary network congestion. For deeper insights into connection drops, refer to
Closing SSH Connection with Keygen.
Frequently Asked Questions
What happens if one Raspberry Pi is offline?
The script will report a failure for that specific IP but continue processing the remaining devices. By using timeouts and error checking, you prevent the entire batch operation from halting due to a single unreachable node.
Can I use this method to restart the devices instead?
Yes, simply replace the
sudo poweroff command with
sudo reboot in your script. This sends a graceful restart signal to all specified devices simultaneously.
Is it safe to run this script over Wi-Fi?
It is generally safe, but wired Ethernet connections are recommended for reliability. Wi-Fi interference can cause SSH timeouts, leading to incomplete shutdown sequences or data loss if the connection drops mid-command.
How do I handle different usernames across my Raspberry Pi devices?
Modify the script to specify the username explicitly in the SSH command, such as
ssh user@$IP "sudo poweroff". Ensure that each user has the necessary sudo privileges to execute the poweroff command.
Why does my script hang when shutting down a device?
This usually occurs if the SSH session waits for a password prompt despite key authentication being set up. Verify that
BatchMode=yes is used and that the private key permissions are correct (typically 600). Check
Permission denied when trying to SSH into CISCO virtual router for general permission troubleshooting patterns.