Linux 从txt文件添加用户

Linux 从txt文件添加用户,linux,bash,scripting,Linux,Bash,Scripting,我有一个项目,包括向操作系统添加用户,这些用户位于文本文件中。 到目前为止,我已经写了这篇文章,但它不起作用。 你能告诉我怎么了吗 文件user.txt为: charbel:password:1001:1001:charbel Haddad:/home/charbel:/bin/bash:0:30:15:7:y 阿塞尔:p@ssw0rd:1002:1002:Assil:/home/assel:/bin/bash:0:30:10:5:n 马尔万:p@ssw0rd:1003:1003:Marwan

我有一个项目,包括向操作系统添加用户,这些用户位于文本文件中。 到目前为止,我已经写了这篇文章,但它不起作用。 你能告诉我怎么了吗

文件
user.txt
为:

charbel:password:1001:1001:charbel Haddad:/home/charbel:/bin/bash:0:30:15:7:y
阿塞尔:p@ssw0rd:1002:1002:Assil:/home/assel:/bin/bash:0:30:10:5:n
马尔万:p@ssw0rd:1003:1003:Marwan Ghantous:/home/Marwan:/bin/bash:0:50:30:7:n
米歇尔:密码:1004:1004:michel:/home/michel:/bin/bash:1:30:10:5:y
脚本:

FILE="user.txt"

USERNAME=$(cut -d " " -f 1 $FILE)
PASSWORD=$(cut -d " " -f 2 $FILE)
USER_ID=$(cut -d " " -f 3 $FILE)
GROUP_ID=$(cut -d " " -f 4 $FILE)
USER_INFO=$(cut -d " " -f 5 $FILE)
HOME_DIRECTORY=$(cut -d " " -f 6 $FILE)
SHELL=$(cut -d " " -f 7 $FILE)
MIN=$(cut -d " " -f 8 $FILE)
MAX=$(cut -d " " -f 9 $FILE)
INACTIVE=$(cut -d " " -f 10 $FILE)
WARNING=$(cut -d " " -f 11 $FILE)

useradd -m -c "${USERNAME}" "${PASSWORD}" "${USER_ID}" "${GROUP_ID}" "${USER_INFO}" "${HOME_DIRECTORY}" "${SHELL}" "${MIN}" "${MAX}" "${INACTIVE}" "${WARNING}"

与调用
useradd
相关的任何问题无关,从数据文件提取数据的方式存在多个问题:

  • 文件中的字段分隔符是冒号,但可以使用
    cut-d”“
    在空格上拆分
  • 处理4行文件时,
    $USERNAME
    中的值将包含4个名称,每行一个
  • 要读取数据,我建议设置
    IFS=:
    并在循环中使用
    read
    读取字段并处理结果。您可能会得到一个有点像这样的脚本:

    #!/bin/bash
    
    IFS=:
    while read -r usename password user_id group_id user_info home shell min max inactive warning
    do
        echo useradd -m -c "$usename" "$password" "$user_id" "$group_id" \
             "$user_info" "$home" "$shell" "$min" "$max" "$inactive" "$warning"
    done < data
    
    现在,这是否是对
    useradd
    的有效调用,这是另一个问题,但至少正确的数据正在被处理

    从RHEL7.4上的
    useradd
    手册页判断(这恰好是我可以访问的方便的Linux系统),调用的格式严重错误。这些值的前缀通常需要加上一个选项,例如上面指定的
    $user\u info
    变量中的“comment”字段的
    --comment
    -c
    。在AFAICS中,用户名应该排在最后,没有特定的选项前缀。但关键的部分是读取数据

    root
    的身份运行
    useradd--help

    用法:用户添加[选项]登录 用户添加-D useradd-D[选项] 选项: -b、 --base dir base\u dir base directory,用于 新帐户 -c、 --新帐户的注释GECOS字段 -d、 --home dir home\u dir新帐户的主目录 -D、 --默认打印或更改默认用户添加配置 -e、 --过期日期新帐户的过期日期 -f、 --新帐户的非活动密码非活动期 -g、 --新组的主组的gid组名称或ID 账户 -G、 ——新项目的补充组列表 账户 -h、 --帮助显示此帮助消息并退出 -k、 --skel skel_DIR使用此备用骨架目录 -K、 --key key=VALUE override/etc/login.defs默认值 -l、 --no log init不将用户添加到lastlog中,并且 故障日志数据库 -m、 --创建主目录创建用户的主目录 -M、 --不创建主目录不创建用户的主目录 -N、 --无用户组不创建与相同名称的组 用户 -o、 --非唯一允许创建重复用户 (非唯一)UID -p、 --密码新帐户的加密密码 -r、 --系统创建一个系统帐户 -R、 --根目录CHROOT\u DIR目录到CHROOT目录 -s、 --新帐户的shell登录shell -u、 --新帐户的用户ID -U、 --用户组创建与用户同名的组 -Z、 --selinux用户SEUSER为selinux用户映射使用特定的SEUSER
    您可以使用带有适当值的
    -K
    选项来指定密码更改之间的最短和最长天数。

    您进行过任何调试吗?例如,您是否打印了变量值以检查它们是否符合您的期望?请在问题中添加user.txt(无链接,无评论)。@Cyrus:no-这是关于shell编程的,主题是堆栈溢出。这是您的问题;文件中的字段是分隔的:,但您告诉
    cut
    使用空格作为分隔符。使用
    cut
    也会使每个变量成为一个值列表。您想使用
    read
    分别拆分每一行。
    $ bash script.sh
    useradd -m -c charbel password 1001 1001 Charbel Haddad /home/charbel /bin/bash 0 30 15 7:y
    useradd -m -c assil p@ssw0rd 1002 1002 Assil /home/assel /bin/bash 0 30 10 5:n
    useradd -m -c marwan p@ssw0rd 1003 1003 Marwan Ghantous /home/marwan /bin/bash 0 50 30 7:n
    useradd -m -c michel password 1004 1004 Michel /home/michel /bin/bash 1 30 10 5:y
    $