Το παρακάτω script μπορεί να χρησιμοποιηθεί για την εκτέλεση εντολών για όλους τους χρήστες.
Για παράδειγμα, αν το καλέσουμε με
forallusers 'chown -R $USER_NAME:$USER_GROUP $USER_HOME'
τότε θα παράγει ένα αρχείο /tmp/forallusers_generated_script με περιεχόμενα παρόμοια με τα παρακάτω:
chown -R alkisg:alkisg /home/alkisg
chown -R artemis:students /home/students/artemis
chown -R mirto:students /home/students/mirto
chown -R angelos:students /home/students/angelos
Στη συνέχεια, αν δούμε ότι το αποτέλεσμα μας ικανοποιεί, τρέχουμε το παραγόμενο script με
/tmp/forallusers_generated_script
Φυσικά μπορούμε και να το επεξεργαστούμε πριν το τρέξουμε.
Υποθέτω ότι είναι αρκετά ασφαλές αφού δεν εκτελεί τίποτα. Προτάσεις για βελτίωση καλοδεχούμενες!
#!/bin/bash
# copyright 2008 Alkis Georgopoulos <https://alkisg.mysch.gr/>
# distributed under the terms of the GNU General Public License version 3
# or any later version.
SCRIPT_NAME=`basename $0`
COMMAND_LINE=$@
if [ -z "$COMMAND_LINE" ]; then
cat<<-USAGE
$SCRIPT_NAME generates scripts that execute a specified command for all users.
It doesn't execute the resultant script, so it shouldn't cause any trouble.
It's your responsibility to check and execute the generated script.
Example usage:
$0 'chown -R \$USER_NAME:\$USER_GROUP \$USER_HOME'
Valid parameters:
USER_NAME, USER_ID, USER_GROUP, USER_GID, USER_HOME
USAGE
exit
fi
GENERATED_SCRIPT="/tmp/forallusers_generated_script"
cat > "$GENERATED_SCRIPT" <<-EOF
#!/bin/bash
# Generated by the forallusers script - https://alkisg.mysch.gr/
EOF
getent passwd | while read line
do
USER_NAME=`echo "$line"|awk -F ':' '{ print $1 }'`
USER_ID=`id -u "$USER_NAME"`
USER_GROUP=`id -gn "$USER_NAME"`
USER_GID=`id -g "$USER_NAME"`
USER_HOME=`echo "$line"|awk -F ':' '{ print $6 }'`
# TODO: don't hardcode minimum and maximum user IDs
if (( $USER_ID >= 1000 && $USER_ID <= 2000 )); then
cmd=`eval echo "$COMMAND_LINE"`
echo "$cmd"
echo "$cmd" >> "$GENERATED_SCRIPT"
fi
done
echo
chmod +x "$GENERATED_SCRIPT"
echo "Script saved at $GENERATED_SCRIPT, you may execute it if you like the result"