bash: สคริปต์คัดลอกผู้ใช้

สคริปต์คัดลอกผู้ใช้จากระบบปัจจุบันไปยังไดเรคทอรี่ที่ติดตั้งลินุกซ์อีกตัวหนึ่ง
มีประโยชน์สำหรับติดตั้งลินุกซ์หลายตัว และต้องการให้ผู้ใช้เหมือนกับระบบปัจจุบัน ตัวอย่างการใช้งานเช่น

  • ติดตั้งลินุกซ์ผ่าน 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/ ตามต้องการ

Topic: