Script για εκτέλεση εντολών για όλους τους χρήστες

Ξεκίνησε από alkisg, 15 Νοε 2008, 04:21:45 ΜΜ

« προηγούμενο - επόμενο »

alkisg

Το παρακάτω script μπορεί να χρησιμοποιηθεί για την εκτέλεση εντολών για όλους τους χρήστες.

Για παράδειγμα, αν το καλέσουμε με
Κώδικας: shell
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 με
Κώδικας: shell
/tmp/forallusers_generated_script

Φυσικά μπορούμε και να το επεξεργαστούμε πριν το τρέξουμε.

Υποθέτω ότι είναι αρκετά ασφαλές αφού δεν εκτελεί τίποτα. Προτάσεις για βελτίωση καλοδεχούμενες!
Κώδικας: shell
#!/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"