运行 adduser 命令以非交互方式。

我想使用adduser命令通过一个Shell脚本添加一个用户(禁用密码)。

默认情况下,adduser会提示你输入各种值(例如全名)。是否有办法通过命令行提交这些值?或者我需要使用useradd命令代替?

3个回答

使用--gecos选项跳过chfn的交互部分。
adduser --disabled-password --gecos "" username

这都写在man手册里了。虽然不是最明显的表达方式。
--gecos GECOS
          Set  the  gecos field for the new entry generated.  adduser will
          not ask for finger information if this option is given.

GECOS字段是一个逗号分隔的列表,格式如下:全名,房间号码,工作电话,家庭电话,尽管man页提到了指纹信息详情-维基百科
希望这对您有所帮助。
更新:对于更近期(或即将发布的)版本的adduser--gecos选项被--comment取代。
--comment comment
      Set the comment field for the new entry generated.  adduser will
      not ask for the information if this option is given.  This field
      is  also  known under the name GECOS field and contains informa‐
      tion that is used by the finger command.  This used  to  be  the
      --gecos  option,  which  is deprecated and will be removed after
      Debian bookworm.  Valid Modes: adduser, adduser --system.

1离题 壁虎? - Alex2php
2贝尔实验室早期的一些Unix系统使用GECOS机器进行打印排队和其他各种服务,因此添加了这个字段来携带用户的GECOS身份信息(来源:https://en.wikipedia.org/wiki/Gecos_field)。 - Zoke
离题:你能让adduser具有幂等性吗?(如果用户已经存在,保持静默而不是提示错误) - Ragtime
2@Ragtime,这只适用于系统账户。最好在调用adduser/useradd之前使用类似getent passwd <username>的方法来测试用户是否存在。 - Zoke

useradd也可以添加用户,而且似乎没有任何提示的形式。

useradd -m -p <encryptedPassword> -s /bin/bash <user>
  • -m--create-home:创建用户的主目录
  • -p--password:指定用户密码;跳过以禁用密码
  • -s--shell:用户登录时的默认Shell

    留空将使用/etc/default/useradd文件中SHELL变量指定的默认登录Shell

  • <user>替换为登录名
  • <encryptedPassword>替换为加密的密码

生成哈希密码:

有很多实现可以生成哈希密码。整个过程就是生成你的哈希密码。

基于Sha-512

输出格式:哈希机制($6代表sha-512),随机盐(第二个美元符号后的八个字节$ASDF1234),剩余部分是有效载荷。

  • mkpasswd mkpasswd -m sha-512

    (mkpasswdwhois软件包提供)

基于DES:

输出格式:前两个字节是盐,剩余部分是有效载荷。整个过程就是生成你的哈希密码。

  • mkpasswd: mkpasswd(由whois软件包提供)
  • openssl: openssl passwd -crypt
  • perl: perl -e "print crypt('password');"
  • python: python3 -c 'import crypt; print(crypt.crypt("password"))'

1你提到的选项在我使用的(最近的)Ubuntu版本中不存在。 - ᴠɪɴᴄᴇɴᴛ
3@ᴠɪɴᴄᴇɴᴛ adduseruseradd是不同的命令,这确实有些令人困惑。 - ThorSummoner
1哎呀,确实错过了你使用的几乎同名的...难道没有一个BDFL保护命令行名称空间吗?;p - ᴠɪɴᴄᴇɴᴛ
1@mum007 这只是一些建议,尝试在你的ssh命令中添加-v-vv-vvv来查看问题所在,并在Stack Overflow或Google上搜索你的错误信息。 - ThorSummoner
为什么要加密密码?我用普通密码试过了,也能正常工作。在我的情况下,这是一个临时密码,用户无论如何都需要更改。 - answerSeeker
我很好奇@luca-ricci是否对你的问题有答案,他们引用了这个文档https://www.cyberciti.biz/tips/howto-write-shell-script-to-add-user.html。我可以理解从不将明文密码发送到服务器的优点,但我也不认为预先加密密码是必需的。 - ThorSummoner
1@KovacsAkos 试试这个:sudo sed -i"" -e "s/PasswordAuthentication no/PasswordAuthentication yes/" /etc/ssh/sshd_configsudo service ssh restart - JSBach
我建议你在回答时先说你正在使用完全不同的命令。否则新手会感到困惑。 :) - user426293
要获取散列密码,你也可以通过交互方式创建用户(例如,在一个临时的ubuntu Docker容器中),然后从/etc/shadow中提取散列值。 - schnatterer
1在某些版本的Ubuntu上,useradd命令会忽略用户默认设置,比如默认的shell。 - Kenny Evitt

你可以像这样结合@ThorSummoner和@Zoke所说的内容:
username=jovyan
password=jovyan

adduser --gecos "" --disabled-password $username
chpasswd <<<"$username:$password"

我正在为我的Jupyter docker-stack做这个。它允许在Dockerfile中进行完全无头设置。

3+1 for chpasswd。比起手动使用mkpasswd生成哈希值来说,这种方法简单得多,而且更适合脚本操作。 - J.D. Mallen
1这非常有帮助。谢谢。 - codegeek
如果出现与“<<<”(例如Dockerfile)有关的问题,您可以通过echo "${username}:${password}" | chpasswd来替换chpassword行。 - boly38