【決定版】Linuxでユーザーを作成・削除したりユーザー情報を変更したりする方法

本記事ではLinuxを使っているユーザー向けにユーザーを作成したり削除したり、既存ユーザーの情報を変更する方法を解説します。

Linuxには大きく分けてDebian系とRedHat系の2種類のディストリビューションが存在し、それぞれ管理方法が異なる箇所があります。

そのため両方のディストリビューションを考慮して分かりやすく解説していきます。

なお、Debian系とはDebian Linux、Ubuntu Linuxなどを指し、RedHat系とはRedHat Enterprise Linux、CentOS Stream、AlmaLinux、RockyLinux、Fedoraなどを指します。

ユーザーを作成する

adduerとuseraddの違い

Linuxにはユーザーを追加するコマンドとして「adduser」と「useradd」が用意されていますが、どちらを使っても問題ありません。

adduserはSystem Vで追加されたコマンドでuseraddはBSDで追加されたコマンドです。Linuxでは互換性のためどちらのコマンドも使えるようになっています。

注意点としてDebian系Linuxはuseraddadduserが別のプログラムとして用意されていますが、RedHat系Linuxのadduseruseraddにシンボリックリンクを張っています。そのためRedHat系Linuxではadduseruseraddと同じコマンドです。

古くからのUNIXユーザーの方は余計な表示が出力されずスクリプト内でも使いやすいuseraddの方が好みかも知れません。また、複数のディストリビューションを使う方は混乱を避けるためuseraddだけ使う方がトラブルを避けられるでしょう。

Debian系Linuxではadduserを推奨していますが、初心者の方は対話的なuseraddの方が間違いが少ないという配慮だと思います。

adduserでユーザーを追加する

RedHat系Linuxを利用している場合、adduserコマンドはuseraddと同じなので「useraddでユーザーを追加する」をご覧ください。

引数にユーザー名を指定するだけでユーザーを追加できます。対話的に進むのでパスワードを2回入力します。

root@ubuntu:~# adduser foo
Adding user `foo' ...
Adding new group `foo' (1001) ...
Adding new user `foo' (1001) with group `foo' ...
Creating home directory `/home/foo' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for foo
Enter the new value, or press ENTER for the default
        Full Name []: 
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] y
root@ubuntu:~#

ユーザーIDを指定してユーザーを作成する

ユーザーIDを指定したい場合はuidオプションを使います。

root@ubuntu:~# adduser --uid 1234 foo
Adding user `foo' ...
Adding new group `foo' (1234) ...
Adding new user `foo' (1234) with group `foo' ...
Creating home directory `/home/foo' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for foo
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] y
root@ubuntu:~#

ユーザーIDが1234となっている事を確認します。

root@ubuntu:~# id foo
uid=1234(foo) gid=1234(foo) groups=1234(foo)
root@ubuntu:~#

useraddでユーザーを追加する

Debian系Linuxのuseraddは自動的にホームディレクトリを作成しないので、ディレクトリを作成する「-m」オプションを付けています。RedHat系Linuxは自動的にホームディレクトリが作成されます。

引数にユーザー名を指定するだけでユーザーを追加できます。パスワードは設定されません

[root@rocky9 ~]# useradd -m foo
[root@rocky9 ~]#

ユーザー追加時にパスワードを設定する

パスワードを指定してユーザーを追加するには-pオプションを使います。

[root@rocky9 ~]# useradd -m -p MyPassword foo
[root@rocky9 ~]#

ユーザーIDを指定してユーザーを作成する

ユーザーIDを指定したい場合は-uオプションを使います。

[root@rocky9 ~]# useradd -m -u 1234 foo
[root@rocky9 ~]#

パスワードも同時に設定できます。

[root@rocky9 ~]# useradd -m -u 1234 -p MyPassword foo
[root@rocky9 ~]#

ユーザーを削除する

deluserとuserdelの違い

deluserはSystem Vで追加されたコマンドでuserdelはBSDで追加されたコマンドです。

Debian系Linuxではdeluseruserdelの両方を使えますが、RedHat系Linuxはuserdelのみ使えます。

deluserでユーザーを削除する

引数にユーザー名を指定すればユーザーを削除できます。

root@ubuntu22:~# deluser foo
Removing user `foo' ...
Warning: group `foo' has no more members.
Done.
root@ubuntu22:~#

しかしホームディレクトリは残ったままになります。

root@ubuntu22:~# ls /home/
foo
root@ubuntu22:~#

ユーザー削除時にホームディレクトリを削除する

ユーザー削除時にホームディレクトリを削除するには--remove-homeオプションを使います。

root@ubuntu22:~# deluser --remove-home foo
Looking for files to backup/remove ...
Removing files ...
Removing user `foo' ...
Warning: group `foo' has no more members.
Done.
root@ubuntu22:~#

これでホームディレクトリを削除できます。

関連するすべてのファイルを削除する

削除したいユーザーが作成したファイルや関連するファイルをすべて削除したい場合は--remove-homeオプションを使います。

root@ubuntu22:~# deluser --remove-all-files foo
Looking for files to backup/remove ...
/usr/sbin/deluser: Cannot handle special file /proc/1/task/1/fd/0
/usr/sbin/deluser: Cannot handle special file /proc/1/task/1/fd/1
/usr/sbin/deluser: Cannot handle special file /proc/1/task/1/fd/2
…
root@ubuntu22:~#

userdelでユーザーを削除する

引数にユーザー名を指定すればユーザーを削除できます。

[root@rocky9 ~]# userdel foo
[root@rocky9 ~]#

しかしホームディレクトリは残ったままになります。

ホームディレクトリとメールスプールを削除する

ユーザー削除時にホームディレクトリとメールスプールを削除するには-rオプションを使います。

[root@rocky9 ~]# userdel -r foo
[root@rocky9 ~]#

UIDを指定してファイル・ディレクトリを探したり削除したりする方法

ユーザー削除時にディレクトリやファイルを削除し忘れることがあるでしょう。また、削除漏れがあるかも知れません。

そのような場合、findコマンドを使うとUIDを指定してファイルやディレクトリを探すことができます。

[root@rocky9 ~]# find / -uid 1001 2>/dev/null
/tmp/foo
/var/spool/mail/foo
/home/foo
/home/foo/.bash_logout
/home/foo/.bash_profile
/home/foo/.bashrc
/home/foo/.bash_history
[root@rocky9 ~]#

ファイルやディレクトリが存在していて、すべて削除したい場合は-exec rm -rf "{}"を付ける事によって削除できます。

[root@rocky9 ~]# find / -uid 1001 -exec rm -rf "{}" \; 2>/dev/null
[root@rocky9 ~]#

削除したファイルが分かるように出力したい場合はrmコマンドに-vオプションを付けます。

[root@rocky9 ~]# find / -uid 1001 -exec rm -rfv "{}" \; 2>/dev/null
'/var/spool/mail/foo' を削除しました
'/home/foo/.bash_logout' を削除しました
'/home/foo/.bash_profile' を削除しました
'/home/foo/.bashrc' を削除しました
removed directory '/home/foo'
[root@rocky9 ~]#

ユーザー情報を変更する

ユーザー情報を変更するにはusermodコマンドを使います。

ホームディレクトリを変更する

ホームディレクトリを変更するには-dオプションを使います。

[root@rocky9 ~]# usermod -d /home/foo2 foo
[root@rocky9 ~]#

ただし、この方法は/etc/passwdを更新しますがホームディレクトリは元のままです。

[root@rocky9 ~]# grep foo /etc/passwd
foo:x:1001:1001::/home/foo2:/bin/bash
[root@rocky9 ~]#
[root@rocky9 ~]# ls /home/
foo
[root@rocky9 ~]#

ホームディレクトリを移動する

ホームディレクトリを新ディレクトリに移動するには-dオプション使用時に-mオプションを追加します。

[root@rocky9 ~]# usermod -m -d /home/foo2 foo
[root@rocky9 ~]#
[root@rocky9 ~]# ls /home/
foo2
[root@rocky9 ~]#

ユーザーIDを変更する

ユーザーIDを変更するには-uオプションを使います。

[root@rocky9 ~]# usermod -u 1234 foo
[root@rocky9 ~]#

別のユーザーと同じIDに変更する

基本的に既存のUIDと重複することはできません。

[root@rocky9 ~]# usermod -u 1000 foo
usermod: UID '1000' は既に存在します
[root@rocky9 ~]#

意図的に別のユーザーIDと重複させたい場合は-oオプションを追加します。

同じUIDにする影響が分からない場合は実施しないでください

[root@rocky9 ~]# usermod -o -u 1000 foo
[root@rocky9 ~]#

グループIDを変更する

グループIDを変更するには-gオプションを使います。グループは既に存在している必要があります。

[root@rocky9 ~]# usermod -g 1000 foo
[root@rocky9 ~]#

別のグループに追加する

主グループはそのままにしておき、サブグループとして別のグループに追加したい場合は-Gオプションを使います。

[root@rocky9 ~]# usermod -G 1000 foo
[root@rocky9 ~]#

これで別のグループに追加されます。

[root@rocky9 ~]# id foo
uid=1001(foo) gid=1001(foo) groups=1001(foo),1000(bar)
[root@rocky9 ~]#

ただし、この状態で再度別のグループに追加しようとすると元のグループから削除されます。

[root@rocky9 ~]# usermod -G 0 foo
[root@rocky9 ~]# id foo
uid=1001(foo) gid=1001(foo) groups=1001(foo),0(root)
[root@rocky9 ~]#

このようにGID 1000から抜けてしまいました。GID 0と1000の両方に所属させたい場合は-Gオプションに-aオプションを追加します。

[root@rocky9 ~]# usermod -a -G 1000 foo
[root@rocky9 ~]#

GID 0に所属している状態で上記のコマンドを実行すると、次のようにGID 01000の両方に所属します。

[root@rocky9 ~]# id foo
uid=1001(foo) gid=1001(foo) groups=1001(foo),0(root),1000(bar)
[root@rocky9 ~]#

サブグループから削除する

サブグループから削除したい場合は-Gオプションで主グループを指定します。

[root@rocky9 ~]# id foo
uid=1001(foo) gid=1001(foo) groups=1001(foo),0(root),1000(bar)
[root@rocky9 ~]#

以下のコマンドでサブグループ(GID 0と1000)から抜けます。

[root@rocky9 ~]# usermod -G 1001 foo
[root@rocky9 ~]#

所属グループを確認すると、GID 0 と1000から抜けている事が分かります。

[root@rocky9 ~]# id foo
uid=1001(foo) gid=1001(foo) groups=1001(foo)
[root@rocky9 ~]#

パスワードを変更する

カレントユーザーでパスワードを変更する場合は単にpasswdコマンドを実行します。

[root@rocky9 ~]# passwd
ユーザー root のパスワードを変更。
新しい パスワード:
新しい パスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
[root@rocky9 ~]#

別のユーザーのパスワードを変更したい場合はユーザー名を引数に付けます。これはrootユーザーのみ実行可能です。

[root@rocky9 ~]# passwd foo
ユーザー foo のパスワードを変更。
新しい パスワード:
新しい パスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
[root@rocky9 ~]#

usermodでも-pオプションを使うとパスワードを変更できます。引数にパスワードを指定できるのでバッチ処理ではusermodが便利です。

[root@rocky9 ~]# usermod -p MyPassword foo
[root@rocky9 ~]#

ログインシェルを変更する

カレントユーザーでログインシェルを変更する場合は単にchshコマンドを実行します。

[root@rocky9 ~]# chsh
root のシェルを変更します。
新しいシェル [/bin/bash]: /bin/sh
シェルを変更しました。
[root@rocky9 ~]#

別のユーザーのパスワードを変更したい場合はユーザー名を引数に付けます。これはrootユーザーのみ実行可能です。

[root@rocky9 ~]# chsh foo
foo のシェルを変更します。
新しいシェル [/bin/bash]: /bin/sh
シェルを変更しました。
[root@rocky9 ~]#

usermodでも-sオプションを使うとログインシェルを変更できます。バッチ処理でログインシェルを変更する場合はusermodが便利です。

[root@rocky9 ~]# usermod -s /bin/sh foo
[root@rocky9 ~]#

ログインユーザー名を変更する

ログインユーザー名は-lオプションで変更できます。

[root@rocky9 ~]# usermod -l foo2 foo
[root@rocky9 ~]# id foo2
uid=1001(foo2) gid=1001(foo) groups=1001(foo)
[root@rocky9 ~]#

ホームディレクトリなどに変更はないので、必要であれば適宜変更してください。

ユーザーをロックする

ユーザーをロックするには-Lオプションを使います。

[root@rocky9 ~]# usermod -L foo

ユーザーをロックするとリモートログインできなくなります。

$ ssh 192.168.0.3 -l foo
foo@192.168.0.3's password:
Permission denied, please try again.

/etc/shadowファイルでもロックされていることが分かります。以下のように、ロックされたユーザーのパスワードの先頭に「!」が追加されます。

[root@rocky9 ~]# grep foo /etc/shadow
foo:!asojfo0i2wjrfoiewjfiw0hjefri02ojfaiosewdfjios:19638:0:99999:7:::
[root@rocky9 ~]#

ユーザーのロックを解除するには-Uオプションを使います。

[root@rocky9 ~]# usermod -U foo
[root@rocky9 ~]#

まとめ

ユーザー管理はここで解説したコマンド・オプションで十分対応できるはずです。

Linuxには複数のディストリビューションがあり、Debian系とRedHat系では一部コマンドが異なる場合があるので、そこだけ注意してください。