You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中创建多用户账户及解决脚本整合运行报错问题

1. 如何在Bash中创建多个用户账户?

批量创建用户的话,有几种实用的方式,看你的具体需求来选:

  • 直接循环固定用户列表:如果要创建的用户是已知的,写个循环就能搞定,记得要加sudo(创建用户需要root权限):

    #!/bin/bash
    # 把要创建的用户都列在这里
    users=("alice" "bob" "charlie")
    for user in "${users[@]}"; do
        # -m参数会自动生成用户的家目录
        sudo useradd -m "$user"
        # 可选:给用户设置初始随机密码(这里会打印出来,方便记录)
        password=$(openssl rand -base64 8)
        echo "$user:$password" | sudo chpasswd
        echo "用户 $user 创建完成,初始密码:$password"
    done
    
  • 从文本文件读取用户列表:如果用户名单存在一个文本文件(比如users.txt,每行一个用户名),可以用循环读取文件内容来创建:

    #!/bin/bash
    while IFS= read -r user; do
        # 跳过空行,避免创建无效用户
        if [ -n "$user" ]; then
            sudo useradd -m -s /bin/bash "$user" # -s指定默认shell为bash
            echo "用户 $user 创建成功"
        fi
    done < users.txt
    

额外提醒:创建后可以根据需要调整用户的组权限,或者用passwd -l $user临时禁用账户,按需操作就行。

2. 整合两个脚本并解决nohup报错问题

先帮你拆解下当前代码里的几个明显问题,正是这些导致了“无此文件或目录”的错误:

  1. 脚本开头语法完全错误:#!/bin/sh ./a.sh ./b.sh 是不对的!#!后面只能写解释器的路径(比如#!/bin/bash),不能直接跟其他脚本,系统会误以为./a.sh是要用来执行脚本的解释器,自然找不到。

  2. 未知的UserU.sh:你提到原来的脚本是a.sh和b.sh,但循环里调用的是./UserU.sh——要么是你打错了文件名,要么这个文件根本不在当前工作目录,或者没有执行权限。

  3. 脚本调用逻辑混乱:既然a.sh本来就会调用b.sh,整合的话有两种思路:

思路一:把两个脚本合并成一个文件

最直接的方式就是把b.sh的代码嵌入到a.sh里,比如如果b.sh是一个用来查询用户信息的函数,就把函数定义放到a.sh开头:

#!/bin/bash

# 把原来b.sh的内容改成函数放在这里
get_user_details() {
    # 这里替换成原来b.sh的代码,比如查询指定用户的信息
    curl -s "https://目标网站/user/$1" | grep -o "用户信息:.*"
}

# 原来a.sh的逻辑:遍历网站用户列表,调用上面的函数
# 注意:如果输出有空格或特殊字符,用while read循环比for更安全
while IFS= read -r user_id; do
    # 如果需要断开连接后继续运行,用nohup;只是后台运行的话直接加&就行
    nohup get_user_details "$user_id" > "/tmp/user_${user_id}_log.txt" 2>&1 &
done < <(curl -s "https://目标网站/user-list" | awk '{print $2}')

这样就不需要两个单独的脚本了,所有逻辑都在一个文件里,彻底避免路径问题。

思路二:保留两个脚本,但解决路径和权限问题

如果不想合并,那要确保脚本路径正确,并且有执行权限:

  • 用绝对路径调用脚本:比如你的脚本放在/home/你的用户名/scripts/目录下,就写绝对路径,避免当前目录变化导致找不到文件:

    #!/bin/bash
    # 定义脚本的绝对路径
    A_SCRIPT="/home/你的用户名/scripts/a.sh"
    B_SCRIPT="/home/你的用户名/scripts/b.sh"
    
    # 先确保两个脚本都有执行权限
    chmod +x "$A_SCRIPT" "$B_SCRIPT"
    
    # 用更安全的while read循环遍历a.sh的输出
    while IFS= read -r user_item; do
        # 这里把UserU.sh改成你实际要调用的b.sh(或者确认文件名是否正确)
        nohup bash "$B_SCRIPT" "$user_item" > "/tmp/${user_item}_output.log" 2>&1 &
    done < <("$A_SCRIPT")
    
  • 解决工作目录问题:测试时可行但实际运行报错,大概率是因为运行脚本时的当前目录不是脚本所在目录,导致相对路径失效。可以在脚本开头先切换到脚本所在目录:

    #!/bin/bash
    # 切换到脚本所在的目录,如果切换失败就退出
    cd "$(dirname "$0")" || exit 1
    
    # 给脚本加执行权限
    chmod +x a.sh b.sh
    
    # 然后正常执行逻辑
    while IFS= read -r user_item; do
        nohup ./b.sh "$user_item" > output.log 2>&1 &
    done < <(./a.sh)
    

最后记得:如果还是报错,先把nohup的输出从/dev/null改成一个实际的日志文件,这样能看到具体的错误信息,方便排查问题。


内容的提问来源于stack exchange,提问作者cmannar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:18:10