2017-02-26 78 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 

我希望這個腳本會幫助別人。

乾杯。