[bash] Copy user from one htpasswd file to another

Let's imagine: we have two sites on one host, access to both is restricted, used basic HTTP authentication where passwords are stored in htpasswd file. One user already registered on one site and we want to add him to another one and leave the same username and password.

#! /bin/sh

USAGE_ERROR="Usage: $SCRIPTNAME {copyuser username}"

SOURCE_HTPASSWD=/folder/site1/.htpasswd
TARGET_HTPASSWD=/folder/site2/.htpasswd

USER=user
HOST=host

copy_user() {
    command="test -f $TARGET_HTPASSWD || exit 1"
    command="test -f $SOURCE_HTPASSWD || exit 1"
    command="${command} ; cp $TARGET_HTPASSWD \"$TARGET_HTPASSWD.bak\""
    command="${command} ; grep -qw $1 $TARGET_HTPASSWD && exit 0"
    command="${command} ; grep -qw $1 $SOURCE_HTPASSWD || exit 1"
    command="${command} ; cat $SOURCE_HTPASSWD | grep ^$1: | awk \"NR == 1\" >> $TARGET_HTPASSWD"
    echo -e $command | ssh $USER@$HOST 2>/dev/null
}

case "$1" in
    copyuser)
        if [ $2 ]; then
            copy_user $2
        else
            echo $USAGE_ERROR
            exit 1
        fi
    ;;
    *)
        echo $USAGE_ERROR
        exit 1
    ;;
esac
exit $?

Usage example

Create two htpasswd files and add few users:

nanvel$ /usr/sbin/htpasswd -b -c .htpasswd1 izumi izumipass
Adding password for user izumi
nanvel$ /usr/sbin/htpasswd -b .htpasswd1 yui yuipass
Adding password for user yui
nanvel$ /usr/sbin/htpasswd -b -c .htpasswd2 misaka misakapass
Adding password for user misaka
nanvel$ /usr/sbin/htpasswd -b .htpasswd2 adzusa adzusapass
Adding password for user adzusa

As a result, I have two files:

nanvel$ cat .htpasswd1
izumi:$apr1$IFUc4Sgr$EWXwKc5MpairBuuoyWaTj0
yui:$apr1$FeI4sM9r$qOHL9H6njqZ0Qe5QAUG6N0

cat .htpasswd2
misaka:$apr1$Zg/Wq3Tl$uOPB4IaQmklCGqcEqEJFP.
adzusa:$apr1$fwUSR8yI$LJlsvnFAmTAIvPbOVeqXS/

Let's try to copy izumi to .htpasswd2:

nanvel$ bash copyuser.sh copyuser izumi
nanvel$ echo $?
0

nanvel$ cat .htpasswd1
izumi:$apr1$IFUc4Sgr$EWXwKc5MpairBuuoyWaTj0
yui:$apr1$FeI4sM9r$qOHL9H6njqZ0Qe5QAUG6N0

nanvel$ cat .htpasswd2
misaka:$apr1$Zg/Wq3Tl$uOPB4IaQmklCGqcEqEJFP.
adzusa:$apr1$fwUSR8yI$LJlsvnFAmTAIvPbOVeqXS/
izumi:$apr1$IFUc4Sgr$EWXwKc5MpairBuuoyWaTj0

nanvel$ cat .htpasswd2.bak
misaka:$apr1$Zg/Wq3Tl$uOPB4IaQmklCGqcEqEJFP.
adzusa:$apr1$fwUSR8yI$LJlsvnFAmTAIvPbOVeqXS/

Run script from python code

import subprocess


proc = subprocess.Popen(
    ['bash', PATH_TO_SCRIPT, username],
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = proc.communicate()[0]
code = proc.poll()
Licensed under CC BY-SA 3.0