2017-02-26 92 views
0

我写了一个脚本,在Debian上创建一个系统用户帐户,一个smb帐户和一个afp帐户(Netatalk)服务器。除了-c参数的useradd命令之外,大部分工作都很好。它被引用。我认为这是主要问题。我做了一些研究,发现如何在引号中保留引号,但是我所有的尝试都是由错误代码2产生的,并以useradd命令的使用提示结束。带引号参数的system-user,smb-user和netatalk-user的Bash脚本

我设法调用外壳上

useradd -m -d /home/username -p abcDEFghiJKLm -c "Full Name" -g users username 

和我所得到的是错误代码2和useradd的命令的用法消息这条线。

Usage: useradd [options] LOGIN 
     useradd -D 
     <...> 

这是我创建系统用户的函数。

AddSystemUser() { 
    echo "Adding system user" 
    myArgs="-p $cryptPass" 
    if [ "$fullName" != "" ] 
    then 
    myArgs="$myArgs -c \"$fullName\"" 
    fi 
    if [ "$userGroup" != "" ] 
    then 
    myArgs="$myArgs -g $userGroup" 
    fi 
    if [ "$userGroups" != "" ] 
    then 
    myArgs="$myArgs -G $userGroups" 
    fi 

    doUserAdd="useradd -m -d /home/$userName $myArgs $userName" 
    #echo $doUserAdd 
    $doUserAdd 
    myResultCode=$? 
    if [ $myResultCode -ne 0 ] 
    then 
    echo "Adding system user failed with error code $myResultCode" 
    exit $(($myResultCode + 100)) 
    fi 
} 

正如你看到的,我在这个地方加上双引号,所以我可以在外壳上使用语法-c完全\名称

我也尝试了方法,无需添加引号的脚本,但外壳上类似-c““全名”'具有相同的结果输入其中:中用法消息useradd的

有人可以帮我吗?我不知道我做错了什么。

回答

0

我觉得eval将您的情况很好地工作:

: other code 
eval useradd -m -d "/home/$userName" "$myArgs" "$userName" 
myResultCode=$? 
: the rest of your code 
1

行情并不嵌套您放在myArgs中的转义引号被视为文字字符,而不是防止分词的语法引号。这是阵列的介绍。

AddSystemUser() { 
    echo "Adding system user" 
    myArgs=(-p "$cryptPass") 
    if [ "$fullName" != "" ]; then 
    myArgs+=(-c "$fullName") 
    fi 
    if [ "$userGroup" != "" ]; then 
    myArgs+=(-g "$userGroup") 
    fi 
    if [ "$userGroups" != "" ]; then 
    myArgs+=(-G "$userGroups") 
    fi 

    useradd -m -d "/home/$userName" "${myArgs[@]}" "$userName" 
    myResultCode=$? 
    if [ $myResultCode -ne 0 ] 
    then 
    echo "Adding system user failed with error code $myResultCode" 
    exit $(($myResultCode + 100)) 
    fi 
} 
0

美好的一天。

这两个答案都很好。非常感谢你。由于它现在工作的很好,我现在将发布我的整个脚本与在此线程中提供的错误修正。

通过这个脚本,你可以在linux上添加一个系统用户,一个samba用户和一个afp用户。这是Debian的8

测试只是有一个缺陷:随着AFPNetatalk)是不可能的,无需重新键入密码创建通过shell的用户。所以在这个脚本中你必须输入四次密码。

这里的脚本:

#!/bin/bash 

# With this script one can create, change and delete a user for linux-system, Samba and Netatalk in one step. 

fullName="" 
userName="" 
userGroup="" 
userGroups="" 
newPass1="X" 
newPass2="Y" 
cryptPass="" 
addnewMode=false 
changeMode=false 
deleteMode=false 

while getopts ':u:n:g:G:acd' OPTION 
do 
    case "$OPTION" in 
    u) userName=$OPTARG;; 
    n) fullName=$OPTARG;; 
    g) userGroup=$OPTARG;; 
    G) userGroups=$OPTARG;; 
    a) addnewMode=true;; 
    c) changeMode=true;; 
    d) deleteMode=true;; 
    *) echo "Unknown parameter" 
    esac 
done 

ShowUsage() { 
    echo "Usage: $0 -a|c|d -u username [-n full-user-name] [-g main-group] [-G group1,group2,..]" 
} 

AddNetatalkUser() { 
    echo "Adding Netatalk user" 
    (echo $newPass1; echo $newPass1) | afppasswd -f -a $userName 
} 

AddSambaUser() { 
    echo "Adding Samba user" 
    (echo $newPass1; echo $newPass1) | smbpasswd -s -a $userName 
} 

AddSystemUser() { 
    echo "Adding system user" 

    myArgs=(-p "$cryptPass") 
    if [ "$fullName" != "" ] 
    then 
    myArgs+=(-c "$fullName") 
    fi 
    if [ "$userGroup" != "" ] 
    then 
    myArgs+=(-g "$userGroup") 
    fi 
    if [ "$userGroups" != "" ] 
    then 
    myArgs+=(-G "$userGroups") 
    fi 

    useradd -m -d "/home/$userName" "${myArgs[@]}" "$userName" 
    myResultCode=$? 
    if [ $myResultCode -ne 0 ] 
    then 
    echo "Adding system user failed with error code $myResultCode" 
    exit $(($myResultCode + 100)) 
    fi 
} 

AddUsers() { 
    AddSystemUser 
    AddSambaUser 
    AddNetatalkUser 
} 

ChangeNetatalkUserPassword() { 
    echo "Updating Netatalk user" 
    (echo $newPass1; echo $newPass1) | afppasswd -n -a $userName 
} 

ChangeSambaUserPassword() { 
    echo "Updating Samba user" 
    (echo $newPass1; echo $newPass1) | smbpasswd -s -a $userName 
} 

ChangeSystemUserPassword() { 
    echo "Updating system user" 
    doChangePass="chpasswd $userName:$newPass1" 
    #echo $doChangePass 
    $doChangePass 
    myResultCode=$? 
    if [ $myResultCode -ne 0 ] 
    then 
    echo "Changing password failed with error code $myResultCode" 
    exit $(($myResultCode + 100)) 
    fi 
} 

ChangePasswords() { 
    ChangeSystemUserPassword 
    ChangeSambaUserPassword 
    ChangeNetatalkUserPassword 
} 

CheckForRootPrivileges() { 
    if [ $(id -u) -ne 0 ] 
    then 
    echo "You must have root privileges" 
    exit 5 
    fi 
} 

CheckIfNewUserDoesExist() { 
    egrep "^$userName" /etc/passwd > /dev/null 
    if [ $? -ne 0 ] 
    then 
    echo "User does not exist" 
    exit 4 
    fi 
} 

CheckIfNewUserDoesNotExist() { 
    egrep "^$userName" /etc/passwd > /dev/null 
    if [ $? -eq 0 ] 
    then 
    echo "User already exists" 
    exit 6 
    fi 
} 

CheckForUserExistance() { 
    if [ $addnewMode == true ] 
    then 
    CheckIfNewUserDoesNotExist 
    else 
    CheckIfNewUserDoesExist 
    fi 
} 

CheckParams() { 
    paramCount=0 
    if [ $addnewMode == true ] 
    then 
    ((paramCount++)) 
    fi 
    if [ $changeMode == true ] 
    then 
    ((paramCount++)) 
    fi 
    if [ $deleteMode == true ] 
    then 
    ((paramCount++)) 
    fi 

    if [ "$userName" == "" ] 
    then 
    ShowUsage 
    exit 1 
    elif [ $paramCount -eq 0 ] 
    then 
    ShowUsage 
    exit 2 
    elif [ $paramCount -gt 1 ] 
    then 
    ShowUsage 
    exit 3 
    fi 
} 

DeleteNetatalkUser() { 
    echo "Deleting Netatalk user" 
    afppasswd -x $userName 
} 

DeleteSambaUser() { 
    echo "Deleting Samba user" 
    smbpasswd -x $userName 
} 

DeleteSystemUser() { 
    echo "Deleting system user" 
    doDeleteUser="userdel -r $userName" 
    #echo $doDeleteUser 
    $doDeleteUser 
    myResultCode=$? 
    if [ $myResultCode -ne 0 ] 
    then 
    echo "Deleting user failed with error code $myResultCode" 
    exit $(($myResultCode + 100)) 
    fi 
} 

DeleteUsers() { 
    DeleteNetatalkUser 
    DeleteSambaUser 
    DeleteSystemUser 
} 

CheckPassword() { 
    if [ $newPass1 != $newPass2 ] 
    then 
    echo "Password mismatch" 
    exit 7 
    fi 
} 

EncryptPassword() { 
    cryptPass=$(perl -e 'print crypt($ARGV[0], "password")' $newPass1) 
} 

GetPassword() { 
    read -r -s -p "Password:" newPass1 
    echo 
    read -r -s -p "Retype password:" newPass2 
    echo 
} 

ProcessPasswordIfNeccessary() { 
    if [ $deleteMode == false ] 
    then 
    GetPassword 
    CheckPassword 
    EncryptPassword 
    fi 
} 

SyncUsers() { 
    if [ $addnewMode == true ] 
    then 
    AddUsers 
    elif [ $changeMode == true ] 
    then 
    ChangePasswords 
    elif [ $deleteMode == true ] 
    then 
    DeleteUsers 
    fi 
} 

CheckParams 
CheckForRootPrivileges 
CheckForUserExistance 
ProcessPasswordIfNeccessary 
SyncUsers 

exit 0 

我希望这个脚本会帮助别人。

干杯。