Δημοσιεύτηκε: 15 Νοέμ 2008, 17:41
από alkisg
Το παρακάτω script μπορεί να χρησιμοποιηθεί για την εκτέλεση εντολών για όλους τους χρήστες (κάτι που χρειάζεται συχνά σε servers).

Για παράδειγμα, αν το καλέσουμε με
Κώδικας: Επιλογή όλων

forallusers chown -R USER_NAME:USER_GROUP USER_HOME


τότε θα παράγει ένα αρχείο /tmp/forallusers_generated_script με περιεχόμενα παρόμοια με τα παρακάτω:
Κώδικας: Επιλογή όλων

chown -R alkisg:alkisg /home/alkisg
chown -R user1:usersgroup /home/students/user1
chown -R user2:usersgroup /home/students/user2
chown -R user3:usersgroup /home/students/user3


Στη συνέχεια, αν δούμε ότι αυτό είναι που θέλουμε να εκτελέσουμε και δεν κάναμε κάποιο λάθος, τρέχουμε το αποτέλεσμα με
Κώδικας: Επιλογή όλων

/tmp/forallusers_generated_script

Φυσικά αν θέλουμε το κάνουμε και edit πριν το τρέξουμε.

Υποθέτω ότι είναι αρκετά ασφαλές αφού δεν εκτελεί τίποτα. Προτάσεις για βελτίωση καλοδεχούμενες!
Κώδικας: Επιλογή όλων

#!/bin/bash
# copyright 2008 Alkis Georgopoulos <http://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
echo "$SCRIPT_NAME generates scripts that execute a specified command for all users."
echo "It doesn't execute the resultant script, so it shouldn't cause any trouble."
echo "It's your responsibility to check and execute the generated script."
echo "Example usage:"
echo " $0 chown -R USER_NAME:USER_GROUP USER_HOME"
echo "Valid parameters:"
echo " USER_NAME, USER_ID, USER_GROUP, USER_GROUP_ID, USER_HOME"
exit
fi

echo "#!/bin/bash" > /tmp/forallusers_generated_script
echo "# Generated by the forallusers script - http://alkisg.mysch.gr" >> /tmp/forallusers_generated_script
echo >> /tmp/forallusers_generated_script

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_GROUP_ID=`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
COMMAND="$COMMAND_LINE"
COMMAND=`echo "$COMMAND" | sed "s/USER_NAME/$USER_NAME/g"`
COMMAND=`echo "$COMMAND" | sed "s/USER_ID/$USER_ID/g"`
COMMAND=`echo "$COMMAND" | sed "s/USER_GROUP/$USER_GROUP/g"`
COMMAND=`echo "$COMMAND" | sed "s/USER_GROUP_ID/$USER_GROUP_ID/g"`
COMMAND=`echo "$COMMAND" | sed "s#USER_HOME#$USER_HOME#g"`

echo "$COMMAND"
echo "$COMMAND" >> /tmp/forallusers_generated_script
fi
done

echo
chmod +x /tmp/forallusers_generated_script
echo "Script saved at /tmp/forallusers_generated_script, you may execute it if you like the result"