Linuxのuseraddとadduserの違いと使い分け

Linuxシステムを運用する上で、ユーザーの追加や削除といったアカウント管理は基本的な作業のひとつです。しかし、CLI環境でユーザーを作成しようとした際、useraddadduser という酷似した2つのコマンドが存在することに戸惑うケースは少なくありません。

これらのコマンドは、単なる表記揺れやエイリアスではなく、コマンドの設計思想や実行される処理のレイヤー(階層)が根本的に異なります。本記事では、両コマンドの内部構造と動作の違いを解明し、OSのディストリビューション差分や運用手順に応じた適切な使い分け基準を確立することを目的とします。

目次

ディストリビューション毎の挙動不一致と自動化エラーをゼロにする

本記事で目指す到達目標は以下の2点です。

  1. Ubuntu/Debian系とRHEL系(AlmaLinux、Rocky Linuxなど)におけるユーザー管理コマンドの動作仕様を正しく把握し、手動設定時の意図しないパラメータ不足や環境構築ミスを完全になくすこと。
  2. シェルスクリプトや構成管理ツールを用いた環境構築自動化において、エラーや対話プロンプトで停止しない堅牢なコマンド呼び出しを100%実現すること。

ホームディレクトリ未生成事故とディストリビューション別の罠

Linuxの初心者や異なるOS環境間を横断して作業するエンジニアが遭遇しやすい課題として、以下の2点が挙げられます。

第一に、Ubuntu環境において useradd コマンドでユーザーを作成した際、デフォルトではホームディレクトリが生成されず、適切なシェル(/bin/bash 等)も割り当てられない問題です。この状態で該当ユーザーに切り替えると、プロンプトの表示が崩れたりログイン初期化処理が正常に行われないトラブルが発生します。

第二に、使用するLinuxディストリビューションによって adduser コマンドの実体が異なる点です。Debian/Ubuntu系では独立した高水準のPerlスクリプトとして実装されていますが、RHEL系では useradd へのシンボリックリンク(単なる別名)となっています。このため、同じコマンドを実行してもOSによって挙動が変わってしまうという混乱が生じます。

低水準バイナリと高水準スクリプトの構造的違い

これらのトラブルを回避するためには、コマンドの分類と仕組みを理解する必要があります。

useradd(低水準コマンド)

  • 分類: ユーティリティバイナリ(Low-level command)
  • 特徴: 全てのLinuxディストリビューションに標準搭載されている組み込みバイナリです。単体で実行すると最低限のアカウント情報のみを /etc/passwd や /etc/shadow に書き込みます。
  • 動作: ホームディレクトリの作成やシェルの指定、パスワードの設定などは、コマンドラインオプションで明示的に指定する必要があります。設定ファイル /etc/default/useradd の定義に従って動作します。

adduser(高水準コマンド)

  • 分類: インタラクティブスクリプト(High-level command)
  • 特徴: DebianおよびUbuntuシステム向けに開発されたPerlスクリプトです(※RHEL系を除く)。
  • 動作: 内部で useradd や passwd などの低水準コマンドを順次呼び出します。実行すると対話形式(プロンプト)でパスワード入力やフルネーム等のGECOS情報を求められ、自動的にホームディレクトリの作成やスケルトンファイル(/etc/skel)のコピーを行います。設定は /etc/adduser.conf に依存します。

両コマンドの主な動作仕様の比較は以下の通りです。

比較項目 useradd(Debian/Ubuntu) adduser(Debian/Ubuntu) RHEL系でのadduser
コマンドの実体 C言語バイナリ Perlスクリプト useradd へのシンボリックリンク
処理方式 非対話(一括実行) 対話形式(プロンプト応答) 非対話(useradd と同一)
ホームディレクトリ自動作成 なし(-m が必要) あり(自動作成) あり(RHELのデフォルト設定による)
パスワード設定 別途 passwd が必要 実行中に自動で要求 別途 passwd が必要
適した用途 スクリプト・自動化処理 ターミナルでの手動作成 useradd と同様

削除コマンド(userdel と deluser)の動作比較

ユーザー作成コマンドと同様に、ユーザー削除コマンドにも userdel と deluser の2種類が存在します。

userdel は全ディストリビューション共通の低水準コマンドです。基本実行では /etc/passwd 等からのアカウント情報の削除のみを行い、ホームディレクトリやメールボックスはシステム上に残却されます。これらを同時に削除したい場合は、-r(–remove)オプションを明示的に付与する必要があります。

# ホームディレクトリも含めてユーザーを完全に削除する
userdel -r username

一方、Debian/Ubuntu系の deluser は高水準スクリプトであり、設定ファイル /etc/deluser.conf の内容に基づいて安全に処理を行います。削除前にホームディレクトリをアーカイブバックアップする機能(–backup)や、該当ユーザーが所有するシステム内の全ファイルを探索・削除する機能(–remove-all-files)など、事故を防止する柔軟な安全対策が組み込まれています。

# バックアップを取得しつつユーザーを安全に削除する(Debian/Ubuntu)
deluser --remove-home --backup username

なお、RHEL系ディストリビューションには deluser コマンドは同梱されていないため、常に userdel を使用します。

実務における適切な使い分けと実装コード例

現場での運用においては、以下の指針に基づいて使い分けることが最適です。

インタラクティブな手動管理(Ubuntu/Debianの場合)

ターミナル上で手動で新規ユーザーを1件ずつ作成する場合は、必要な設定を一括で対話処理できる adduser を使用します。

sudo adduser newuser

シェルスクリプトやAnsibleによる自動化処理

CI/CDパイプライン、初期化スクリプト、AnsibleやCloud-init等の自動化環境では、対話プロンプトによる処理停止を防ぎ、ディストリビューション間の互換性を担保するため、常にオプションを明示指定した useradd を採用します。

# ホームディレクトリ生成(-m)、デフォルトシェル指定(-s)、グループ指定(-g)を明示して作成
sudo useradd -m -s /bin/bash -g users -G sudo devuser

# 非対話環境での初期パスワード設定(必要に応じて設定)
echo "devuser:SecurePassword123!" | sudo chpasswd

また、デフォルト挙動を変更したい場合は、/etc/default/useradd を編集します。

# /etc/default/useradd の設定例
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

まとめ

Linuxのユーザー作成コマンドは、低水準バイナリの useradd と、Debian系で高水準スクリプトとして実装されている adduser に分かれます。Ubuntu等で useradd を使うとホームディレクトリが生成されない課題がありますが、これは低水準コマンドの仕様によるものです。

手動管理では対話式で安全に設定できる adduser が適しており、削除時も deluser を使うことでバックアップを伴う柔軟な処理が可能です。一方、シェルスクリプトや自動化ツールでは、ディストリビューション依存がなく非対話で確実に動作する useradd に各種オプションを明示付与して実行するのが標準的な設計となります。