299

I'd like to use the adduser command to add a user (with disabled password) via a shell script.

By default, adduser prompts you for various values (e.g., Full Name). Is there any way to submit these values via command line? Or will I need to useradd instead?

0

3 Answers 3

373

Use the --gecos option to skip the chfn interactive part.

adduser --disabled-password --gecos "" username

It's all in the man page. Not the most obvious formulation tho.

--gecos GECOS
          Set  the  gecos field for the new entry generated.  adduser will
          not ask for finger information if this option is given.

The GECOS field is a comma separated list as such: Full name,Room number,Work phone,Home phone, despite that man page mentions finger information Details - Wikipedia

Hope this helps you.

2
  • 1
    off-topic Geckos?
    – Alex2php
    May 12, 2020 at 10:57
  • 1
    Some early Unix systems at Bell Labs used GECOS machines for print spooling and various other services, so this field was added to carry information on a user's GECOS identity (source: en.wikipedia.org/wiki/Gecos_field)
    – Zoke
    May 12, 2020 at 21:44
63

useradd can also add users and does not appear to have any form of prompting built in.

useradd -m -p <encryptedPassword> -s /bin/bash <user>
  • -m, --create-home: Create user home directory
  • -p, --password: Specify user password; skip to have it disabled
  • -s, --shell: Default shell for logon user

    Blank will use default login shell specified by the SHELL variable in /etc/default/useradd

  • Substitute <user> with the login name
  • Substitute <encryptedPassword> with the encrypted password

Generating a hashed password:

There are a lot of crypt3 implementations that can generate a hashed password. The whole thing is your hashed password.

Sha-512 Based

The resulting output format: the hash mechanism ($6 for sha-512), the random salt (the eight bytes after the second dollar sign $ASDF1234), remainder is the payload.

  • mkpasswd mkpasswd -m sha-512

    (mkpasswd is provided by the whois package)

DES based:

The resulting output format: first 2 bytes is your salt, remainder is the payload. The whole thing is your hashed password.

  • mkpasswd: mkpasswd (provided by whois package)
  • openssl: openssl passwd -crypt
  • perl: perl -e "print crypt('password');"
  • python: python3 -c 'import crypt; print(crypt.crypt("password"))'
10
  • 1
    The options you mention don’t exist for adduser on my (recent) version of Ubuntu. Sep 22, 2015 at 20:30
  • 2
    @ᴠɪɴᴄᴇɴᴛ adduser is distinct from useradd, confusing I know. Sep 22, 2015 at 21:01
  • 1
    Oops, indeed missed that you use its almost namesake … isn’t there a BDFL protecting the command line namespace? ;p Sep 23, 2015 at 9:52
  • 1
    @mum007 This is only general advice, try adding -v or -vv or -vvv to your ssh commands to see whats wrong and search your error messages here on SO or Google. Dec 3, 2015 at 17:30
  • 1
    @KovacsAkos try this: sudo sed -i"" -e "s/PasswordAuthentication no/PasswordAuthentication yes/" /etc/ssh/sshd_config and sudo service ssh restart
    – JSBach
    Apr 5, 2017 at 9:01
10

You can combine what @ThorSummoner @Zoke are saying like so:

username=jovyan
password=jovyan

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

I'm doing this for my Jupyter docker-stack. It allows full headless setup in a Dockerfile.

2
  • 1
    +1 for chpasswd. Much easier than fiddling with mkpasswd to make the hashes manually, and way more script-friendly. Jul 5, 2021 at 23:37
  • 1
    This was very helpful. Thanks.
    – codegeek
    Nov 23, 2021 at 0:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.