首页 > 解决方案 > 为什么bash脚本中的函数以root身份(使用sudo)抛出语法错误,而作为标准用户它可以工作?

问题描述

我正在编写一个脚本,其中包含一个创建新用户的函数,该函数需要以 root 身份运行才能工作,但是当我将脚本运行为:

sudo ./sample.sh

它抛出以下错误:

./sample: 3: 语法错误:"(" 意外

但是当我在没有 sudo 的情况下运行它时,我得到了这个输出:

-
-
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.
chage: user 'yt' does not exist in /etc/passwd
chage: user 'yt' does not exist in /etc/passwd
-
-
sed: can't read /etc/sudoers: Permission denied
sed: can't read /etc/sudoers: Permission denied
-
-

因此,该脚本正在与我的标准用户一起使用(这只是一个权限问题)。我不明白为什么它不能与 sudo 一起使用。我在互联网上发现我需要导出函数但仍然存在同样的问题,这是脚本:

############create user Function#
#!/bin/bash
function user_create ()
{


        useradd -m -p '#SOME_PASSWD' -s /bin/bash $userName

        sudo chage  -m 5 -M 90 -I 30 -W 14  $userName
        sudo  chage --lastday 0  $userName
        echo ''
        echo '--------------------------------------------------------------------------------------------'
        echo -e '\e[32mPasswd set for \e[1m'$userName' for 90 days MAX | 5 days MIN\e[0m'
        echo -e '\e[32mPasswd is set to change the current passwd in next login for \e[1m' $userName
        echo -e '\e[0m--------------------------------------------------------------------------------------------'
        #User based policy#
        sed -i "#SOME_SED_COMMAND" /etc/sudoers
        sed -i "/#SOME_STRING/#NEW_STRING" /etc/sudoers

        echo -e '\e[33m'
        sudo cat /etc/sudoers | grep -i "$userName"
        echo -e '\e[0m'
        echo ''
        echo '------------------------------------------------------------------'
        echo -e '\e[1m\e[32mUser Privilege Set\e[0m'
        echo '------------------------------------------------------------------'

        return 0
}

export -f user_create

if [ -z $1 ]
then
        echo -e 'e\1[m e\[100m e\[33m Do you want to CREATE A NEW USER?e\[0m (y/n)'
        read createUser
        if [ $createUser = 'y' -o $createUser = 'Y' ]
        then
                echo 'Enter USER.NAME:::: First_Name.Last_Name'
                read userName
                user_create
        else
                echo ''
                echo '------------------------------------------------------------------'
                echo -e '\e[31mNO NEW USER added.\e[0m'
                echo '------------------------------------------------------------------'
        fi
else
        userName=$1
        User_Create

fi

标签: linuxbashshellubuntu-18.04

解决方案


为什么 bash 脚本中的函数会引发语法错误……?

线

#!/bin/bash

没有效果 - 它必须是第一行;因此脚本可能来自不同的环境,由不同的 shell 执行,其中一些具有不兼容的语法。


推荐阅读