bash: สคริปต์คัดลอกผู้ใช้
Submitted by wd on Thu, 2013-12-19 08:18
สคริปต์คัดลอกผู้ใช้จากระบบปัจจุบันไปยังไดเรคทอรี่ที่ติดตั้งลินุกซ์อีกตัวหนึ่ง
มีประโยชน์สำหรับติดตั้งลินุกซ์หลายตัว และต้องการให้ผู้ใช้เหมือนกับระบบปัจจุบัน ตัวอย่างการใช้งานเช่น
- ติดตั้งลินุกซ์ผ่าน debootstrap
- ติดตั้งลินุกซ์โดยการเมานต์ live cd แล้วคัดลอก squashfs มาติดตั้งโดยตรง
ข้อกำหนดคือ
- ต้องใช้สิทธิ์ root ในการรัน
- ต้องเป็นลินุกซ์ที่มีการเก็บไฟล์ผู้ใช้แบบมาตรฐาน คือเก็บที่ไฟล์
/etc/passwd,/etc/groupและ/etc/shadow
สคริปต์มีดังนี้
$ sudo vi /usr/local/sbin/transfer_users.sh
#!/bin/bash
function usage() {
cat <<EOF
Usage: $0 DESTINATION
Transfer users from current linux system to DESTINATION directory that have another linux system.
Run as root.
EOF
exit 1
}
DEST=$1
if [ ! "$UID" == "0" ]; then
echo "Please run as root."
usage
fi
if [ ! -d "$DEST" ]; then
echo "DESTINATION directory not found."
usage
fi
if [ ! -d "$DEST/etc" ]; then
echo "DESTINATION/etc directory not found."
usage
fi
US=`ls /home`
TMP=/tmp/${RANDOM}.txt
#SORT ON UID
for i in $US; do
UUID=`grep ":/home/${i}:" /etc/passwd | cut -d: -f3`
echo "${UUID}:${i}" >> $TMP
done
#PROCESS EACH USER
for i in `cat $TMP | sort`; do
UUID=`echo $i | cut -d: -f1`
U=`echo $i | cut -d: -f2`
PASSWDLINE=`grep ":/home/${U}:" /etc/passwd`
#/etc/group
GNUM=`echo $PASSWDLINE | cut -d: -f4`
GROUPLINE=`grep $GNUM /etc/group`
GNAME=`echo $GROUPLINE | cut -d: -f1`
OLDGROUP=`grep $GNAME $DEST/etc/group`
if [ "$OLDGROUP" == "" ]; then
echo $GROUPLINE >> $DEST/etc/group
elif [ "$OLDGROUP" != "$GROUPLINE" ]; then
sed -i "s/$OLDGROUP/$GROUPLINE/g" $DEST/etc/group
fi
#/etc/passwd
OLDPASS=`grep ":/home/${U}:" $DEST/etc/passwd`
if [ "$OLDPASS" == "" ]; then
echo $PASSWDLINE >> $DEST/etc/passwd
elif [ "$OLDPASS" != "$PASSWDLINE" ]; then
sed -i "s/$OLDPASS/$PASSWDLINE/g" $DEST/etc/passwd
fi
#/etc/shadow
SHADOWLINE=`grep "${U}:" /etc/shadow | grep -v '*'`
OLDSHADOW=`grep "${U}:" $DEST/etc/shadow | grep -v '*'`
if [ "$OLDSHADOW" == "" ]; then
echo $SHADOWLINE >> $DEST/etc/shadow
elif [ "$OLDSHADOW" != "$SHADOWLINE" ]; then
sed -i "s#$OLDSHADOW#$SHADOWLINE#g" $DEST/etc/shadow
fi
#GROUP MEMBERS
for j in `groups $U | cut -d: -f2`; do
for k in `echo $j`; do
if [ "$k" == "$GNAME" ]; then
continue
fi
OLDLINE=`grep "${k}:" $DEST/etc/group`
if ! echo $OLDLINE | grep $U ; then
if [ "${OLDLINE: -1}" == ":" ]; then
sed -i "s/$OLDLINE/${OLDLINE}${U}/g" $DEST/etc/group
else
sed -i "s/$OLDLINE/${OLDLINE},${U}/g" $DEST/etc/group
fi
fi
done
done
#/HOME
if [ ! -d "$DEST/home/$U" ]; then
mkdir -p "$DEST/home/$U"
fi
chown -R ${U}:${GNAME} $DEST/home/$U
done
#for i in passwd group shadow; do
# cp $DEST/etc/$i $DEST/etc/${i}-
#done
rm $TMP
ตัวอย่างเช่น เราติดตั้งลินุกซ์อีกอันไว้ที่ /dev/sdaXX
$ sudo mount /dev/sdaXX /mnt/tmp $ sudo /usr/local/sbin/transfer_users.sh /mnt/tmp
ผู้ใช้ทั้งหมดใน /home/* จะถูกคัดลอกไปยัง /mnt/tmp/home/ ตามต้องการ
- Printer-friendly version
- Log in or register to post comments
- 20223 reads







Recent comments