- 投稿日:2020-02-16T20:06:24+09:00
Linuxのmanコマンドで表示される()内の数字(セクション番号)について
環境
- OS:CentOS Linux release 7.7.1908
root@CENTOS7 ~]# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) [root@CENTOS7 ~]#manコマンドの(1)
Linuxの
man
コマンドでコマンドのマニュアルを参照できます。
cp
コマンドを参照する場合、以下のコマンドとなります。
man cp
コマンド[root@CENTOS7 ~]# man cpcp(1)CP(1) User Commands CP(1) NAME cp - copy files and directories SYNOPSIS cp [OPTION]... [-T] SOURCE DEST cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE... DESCRIPTION Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY. Mandatory arguments to long options are mandatory for short options too. -a, --archive same as -dR --preserve=all --attributes-only don't copy the file data, just the attributes --backup[=CONTROL] Manual page cp(1) line 1 (press h for help or q to quit)
ここでCP(1)と表示されていますが、()内の番号(セクション番号)の意味は以下の通りです。
セクション番号 内容 1 実行プログラムまたはシェルコマンド 2 システムコール (カーネルが提供する関数) 3 ライブラリー呼び出し(プログラムライブラリーに含まれる関数) 4 特殊ファイル(通常 /dev 配下に存在するファイル) 5 ファイルの書式と慣習(例: /etc/passwd) 6 ゲーム 7 その他いろいろなもの(マクロパッケージや慣習などを含む)。 8 システム管理コマンド(通常は root 用) 9 カーネルルーチン [非標準] なお、上記のセクション番号について、以下のコマンドで参照可能です。
man man
コマンド[root@CENTOS7 ~]# man manMAN(1)MAN(1) マニュアルページユーティリティー MAN(1) 名前 man - オンラインマニュアルのインターフェース 書式 man [-C file] [-d] [-D] [--warnings[=warnings]] [-R encoding] [-L locale] [-m system[,...]] [-M path] [-S list] [-e extension] [-i|-I] [--regex|--wildcard] [--names-only] [-a] [-u] [--no-subpages] [-P pager] [-r prompt] [-7] [-E encoding] [--no-hyphenation] [--no-justifi‐ cation] [-p string] [-t] [-T[device]] [-H[browser]] [-X[dpi]] [-Z] [[section] page ...] ... man -k [apropos options] regexp ... man -K [-w|-W] [-S list] [-i|-I] [--regex] [section] term ... man -f [whatis options] page ... man -l [-C file] [-d] [-D] [--warnings[=warnings]] [-R encoding] [-L locale] [-P pager] [-r prompt] [-7] [-E encoding] [-p string] [-t] [-T[device]] [-H[browser]] [-X[dpi]] [-Z] file ... man -w|-W [-C file] [-d] [-D] page ... man -c [-C file] [-d] [-D] page ... man [-?V] 説明 man はシステムのマニュアル参照ツール (ページャー) です。 man に与える引数 page は通常プログラム、ユーティリティー、または関数の名前です。これらの引数に 関連するマニュアルページを検索して表示します。 section が指定された場合、 man は直接マニュアルの section セクション内にあるページのみ検索します。デフォルトの動作は使用可能な sections すべてを、事前定義された順番に検索し、見つけた最初の page を表示します。 page が複数の sections に存在する場合でも表示されるのは最初のもののみです。 次の表はマニュアルの section 番号およびその section に含まれるページの種類を示します。 1 実行プログラムまたはシェルコマンド 2 システムコール (カーネルが提供する関数) 3 ライブラリー呼び出し (プログラムライブラリーに含まれる関数) 4 特殊ファイル (通常 /dev 配下に存在するファイル) 5 ファイルの書式と慣習 (例: /etc/passwd) 6 ゲーム 7 その他いろいろなもの (マクロパッケージや慣習などを含む)。 例えば man(7) や groff(7)。 8 システム管理コマンド (通常は root 用) 9 カーネルルーチン [非標準] ~~~~~~~~~~~ 省略 ~~~~~~~~~~~
以上
- 投稿日:2020-02-16T19:42:54+09:00
Kubernetes コントリビューションに役立ったカーネル技術 cgroupv2 解析編
はじめに
cgroupv2 のコンテナ基盤への適用を検証する中で kubeadm の preflight checks の修正が必要であることがわかったため、下記にて対応した。
https://github.com/kubernetes/system-validators/pull/12
具体的な修正内容は、 cgrpupv2 からサブシステム情報の取得先を変更する(/proc/cgroups は obsolete で、 /sys/fs/cgroup/cgroup.controllers から取得したい)ものである。幸い runC では同様の問題がすでに修正されており、下記のコードを流用する形で kubeadm に Pull Request した。
https://github.com/opencontainers/runc/commit/74a3fe5d1b894f01bcef94469f76ca62df80948a
この Pull Request に対して、本件に関してカーネル内部的には有効化されているが /sys/fs/cgroup/cgroup.controllers には表示されないサブシステムが存在する問題があり、それについては理由をソースコードコメント上に追加するようフィードバックを受けた。しかし、公式のドキュメント等からすぐに明確な仕様や情報を見つけることができなかったため、今回は cgroupv2 の挙動をカーネルコードを読み、 kprobe で机上調査から想定する動作を実際に確認した。
この記事では調査時のメモを元に、カーネル解析の手順を説明する。
ソースコード調査対象カーネルは5.3とする。/sys/fs/cgroup/cgroup.controllers を読み出した時のカーネル側の挙動
まず、 /sys/fs/cgroup/cgroup.controllers をユーザ空間から読み込んだ時に実行されるカーネル空間上のコードを調べた。
関連するインターフェースは、下記で実装されていた。https://github.com/torvalds/linux/blob/v5.3/kernel/cgroup/cgroup.c#L4864
そこで、 .seq_show に設定されている cgroup_controllers_show 関数 の周辺を少し読んでみると、 cgroup_control 関数 で表示するサブシステムを選別していることがわかった。また、表示するサブシステムの一部を cgrp_dfl_implicit_ss_mask と cgrp_dfl_inhibit_ss_mask を or して反転した値を使い選別していた。
https://github.com/torvalds/linux/blob/v5.3/kernel/cgroup/cgroup.c#L433-L434
そこで、下記の変数にどのような値がどのようにセットされるのかを調べることにした。
システムブート時の cgroupv2 初期設定
まず
のビットが実際に設定される場所を調べた。
すると、同じソースファイル内からカーネルのブート時にサブシステム単位でビットが設定されるコードを見つけた。
https://github.com/torvalds/linux/blob/v5.3/kernel/cgroup/cgroup.c#L5783-L5786for_each_subsys(ss, ssid) { (中略) if (ss->implicit_on_dfl) cgrp_dfl_implicit_ss_mask |= 1 << ss->id; else if (!ss->dfl_cftypes) cgrp_dfl_inhibit_ss_mask |= 1 << ss->id;詳細は割愛するが、 cgroup_subsys 構造体 が持つ implicit_on_dfl と dfl_cftypes の有無でビットを立てる仕組みになっている。まず、 implicit_on_dfl が存在すれば、そのサブシステムの ID 番目のビットを cgrp_dfl_implicit_ss_mask に立て、それがない場合は、 dfl_cftypes が存在しないサブシステムの ID 番目のビットを cgrp_dfl_inhibit_ss_mask に立てる。
kprobes で実際にビットマスクを確認
カーネルのコードを読んだことで /sys/fs/cgroup/cgroup.controllers をユーザ空間から読み込んだ時の挙動を理解できた。そこで、実際に稼働中のカーネルから想定通りビットがセットされているか確認してみる。
検証環境
- Ubuntu 18.04(x86_64, kernel : 5.0.0-32-generic)
- cgroupv2
- Kubernetes : v1.15.2
本検証では ftrace を tracefs から直接使ってトレースする。そのため、 tracefs をマウント出来ていれば、その他に必要なツールはない。なお tracefs は、 /sys/kernel/debug/tracing にマウントされているものとする。
cgroupv2 サブシステム設定に関する注意
現状 cgroupv1 に各サブシステムがマウントされていることで、 cgroupv2 にサブシステムがマウントできない環境も多いと思う。
筆者の環境では検証のために cgroup_no_v1=all をカーネルのコマンドラインパラメータに追加したが、本番環境での利用を推奨するものではない。https://www.kernel.org/doc/html/v5.3/admin-guide/kernel-parameters.html
cgroup_control 関数のプローブ
それでは、 cgroup_control 関数にフックしてみる。
今回は戻り値のビットマスクを確認したいので、 kretprobe を設定する。# echo 'r:retcgcontrol cgroup_control ret=$retval:u16' > /sys/kernel/debug/tracing/kprobe_events # echo 1 > /sys/kernel/debug/tracing/events/kprobes/retcgcontrol/enable # cat /sys/fs/cgroup/cgroup.controllers cpuset cpu io memory pids rdma # cat /sys/kernel/debug/tracing/trace | grep cat cat-xxxx [xxx] d... xxx.xxxxxx: retcgcontrol: (cgroup_controllers_show+0x44/0x60 <- cgroup_control) ret=6171サブシステム「cpuset cpu io memory pids rdma」が表示された時に、 cgroup_control 関数の戻り値は 6171(1100000011011) であることがわかった。そこで、この6つのビットが「cpuset cpu io memory pids rdma」を指しているか確認する。
cgroup のサブシステムIDは、cgroup_subsys.h での登場順に振られていく。詳しい実装については下記サイトが参考になる。6つのビットに相当するサブシステムを確認すると、「cpuset, cpu, io, memory, pids, rdma」であることがわかった。
cgrp_dfl_implicit_ss_mask と cgrp_dfl_inhibit_ss_mask の値を表示
表示されるサブシステムはわかったが、cgrp_dfl_implicit_ss_mask と cgrp_dfl_inhibit_ss_mask のどちらにどのサブシステムのビットが立っているのかも気になった。
そこで、これらの値も動的にダンプしてみる。
まずは、 cgrp_dfl_implicit_ss_mask と cgrp_dfl_inhibit_ss_mask のアドレスを取得する。(2020/02/17 追記) ftrace は直接シンボルからアドレスを取得できたので下記は不要。むしろ KASLR が面倒なので、シンボルをそのまま記載した方が良さそう。# cat /proc/kallsyms | grep grp_dfl_implicit_ss_mask ffffffffa3fdd8a6 b cgrp_dfl_implicit_ss_mask # cat /proc/kallsyms | grep cgrp_dfl_inhibit_ss_mask ffffffffa3fdd8a8 b cgrp_dfl_inhibit_ss_mask次に、 cgroup_control 関数プローブの手順にアドレスのダンプを組み込んで実行する。
# echo 'r:retcgcontrol cgroup_control cgrp_dfl_implicit_ss_mask=@0xffffffffa3fdd8a6:u16 cgrp_dfl_inhibit_ss_mask=@0xffffffffa3fdd8a8:u16 ret=$retval:u16' > /sys/kernel/debug/tracing/kprobe_events # echo 1 > /sys/kernel/debug/tracing/events/kprobes/retcgcontrol/enable # cat /sys/fs/cgroup/cgroup.controllers cpuset cpu io memory pids rdma # cat /sys/kernel/debug/tracing/trace | grep cat cat-xxxx [000] d... xxxx.xxxxxx: retcgcontrol: (cgroup_controllers_show+0x44/0x60 <- cgroup_control) cgrp_dfl_implicit_ss_mask=256 cgrp_dfl_inhibit_ss_mask=1764 ret=6171(2020/02/17 追記) ftrace で直接シンボルからアドレスを取得
# echo 'r:retcgcontrol cgroup_control cgrp_dfl_implicit_ss_mask=@cgrp_dfl_implicit_ss_mask:u16 cgrp_dfl_inhibit_ss_mask=@cgrp_dfl_inhibit_ss_mask:u16 ret=$retval:u16' > /sys/kernel/debug/tracing/kprobe_events # echo 1 > /sys/kernel/debug/tracing/events/kprobes/retcgcontrol/enable # cat /sys/fs/cgroup/cgroup.controllers cpuset cpu io memory pids rdma # cat /sys/kernel/debug/tracing/trace | grep cat cat-xxxx [000] d... xxxx.xxxxxx: retcgcontrol: (cgroup_controllers_show+0x44/0x60 <- cgroup_control) cgrp_dfl_implicit_ss_mask=256 cgrp_dfl_inhibit_ss_mask=1764 ret=6171cgrp_dfl_implicit_ss_mask=256(100000000) と cgrp_dfl_inhibit_ss_mask=1764(11011100100)が表示された。cgroup_subsys.h から、 cgrp_dfl_implicit_ss_mask は「perf_event」、 cgrp_dfl_inhibit_ss_mask は「cpuacct, devices, freezer, net_cls, net_prio, hugetlb」をマスクしていることがわかった。
(おまけ)perf_event の implicit_on_dfl
現状、 perf_event のみが暗黙的に有効化されるフラグが立っていることがわかったが、その設定場所は https://github.com/torvalds/linux/blob/v5.3/kernel/events/core.c#L12216 に存在した。
/* * Implicitly enable on dfl hierarchy so that perf events can * always be filtered by cgroup2 path as long as perf_event * controller is not mounted on a legacy hierarchy. */ .implicit_on_dfl = true,まとめ
/sys/fs/cgroup/cgroup.controllers の表示に関わる変数についてまとめると下記のようになる。
cpuset cpu cpuacct io memory devices freezer net_cls perf_event net_prio hugetlb pids rdma cgrp_dfl_implicit_ss_mask 0 0 0 0 0 0 0 0 1 0 0 0 0 cgrp_dfl_inhibit_ss_mask 0 0 1 0 0 1 1 1 0 1 1 0 0 この2つの変数のどちらにもマスクされていないサブシステムだけが、 /sys/fs/cgroup/cgroup.controllers で表示されることになる。
おわりに
筆者も cgroupv2 に詳しいわけではないが、カーネルの知見やデバッグ技術を生かして、 Kubernetes コントリビューションに必要な情報をカーネル無改造で迅速に調べることができた。
本件に限らず、ユーザ空間とは異なる視点から情報を取得することで思いもしなかった問題を発見したり解決できたりすることが多々ある。需要があれば本件の詳細に加えてどこかで紹介したい。
- 投稿日:2020-02-16T16:57:06+09:00
Finder上に絶対パスを表示させる
Finerでファイル操作をするとき、表示している階層がわからないのが非常に不便だと感じたので、以下のような感じでFinderのメニューの欄に常に絶対パスを表示させる設定をした。
1.ターミナルを開く
2.ターミナル上で以下のコマンドを叩く
$ defaults write com.apple.finder _FXShowPosixPathInTitle -boolean true3.Finder再起動
$ killall Finderこれデフォルトではディレクトリ名のみが表示されていたのが、フルパス表示されるようになりました。
元の状態に戻したい時(おまけ)
やっぱり元の状態に戻したい!ってなったときも以下の手順で簡単に元の状態に戻せます。
以下のコマンド叩く。
$ defaults write com.apple.finder _FXShowPosixPathInTitle -boolean false同じようにFinder再起動
$ killall Finder参考
- 投稿日:2020-02-16T13:22:07+09:00
Windowsからショートカットのクリックだけで対象サーバにSSHログイン
Puttyで公開鍵証明書を使ったログインを設定した後、ユーザー名の入力を求められることなくログインする方法です。
手順
- Putty最新版のダウンロード
- Puttyのインストール
- Putty設定画面から、公開鍵ログインする設定を保存
- Puttyに「公開鍵ログインする設定」と「ユーザー」を指定して実行するバッチファイルを作成
公開鍵ログインする設定
以下画面の通りPuttyの設定を作成して保存。
Puttyに「公開鍵ログインする設定」と「ユーザー」を指定して実行するバッチファイルを作成
以下ファイルを「fileserver.bat」等のファイル名で保存。
※usernameは、適宜変更してください。例えば「test」ユーザーなどです。cd "C:\Program Files\PuTTY\" start /B putty.exe -load fileserver -l username上記batファイルのポイントは、start /Bでputtyを呼び出すことで、
putty起動後にdos窓が残らないようにしている点です。おまけ(Linuxサーバでの公開鍵ログイン設定方法)
Linux側で公開鍵ログインする為の設定方法です。
自動ログインさせたいユーザーで実施してください。
※ rootユーザー以外の一般ユーザーで実施してください。ここでは、サンプルとして、testユーザーで実施しています。
# .sshディレクトリに移動(なければ作成) cd ~/.ssh # 公開鍵、秘密鍵のペアを作成 ssh-keygen -t rsa -b 2048 -f `hostname` # 作成されたファイルを確認 ls -la `hostname`* # -rw------- 1 test test 1823 Feb 16 13:11 fileserver # -rw-r--r-- 1 test test 397 Feb 16 13:11 fileserver.pub # .pubをsuthorized_keysに追記 cat `hostname`.pub >> authorized_keys chmod 0600 authorized_keys # 秘密鍵を表示>Puttyインストールフォルダにあるputtygen.exeで読み込ませ、ppkファイルで保存 cat `hostname` # 秘密鍵と、authorized_keysに転記済み公開鍵を削除 rm `hostname` rm `hostname`.pub # ファイルの削除確認 ls -la `hostname`* ls: cannot access 'fileserver*': No such file or directory test@fileserver:~/.ssh$最後に
以前はPuttyを起動後に、保存しておいた設定をダブルクリックしてログイン時にユーザー名を入力してログインしていました。しかし、上記のバッチファイルを作成し、タスクバーにピン止めしておくことで、よく使うサーバにはすぐにログイン出来るようになりました。
- 投稿日:2020-02-16T04:25:14+09:00
viの移動系コマンド
- 投稿日:2020-02-16T00:54:25+09:00
Linuxのユーザー追加、useraddコマンドの使い方(パスワード指定)
Linux(ここではCenOS7)で
useradd
コマンドを使用してユーザーを追加する方法を紹介します。
Linuxコマンドでユーザーを追加する方法として、useradd
コマンドとadduser
コマンドがありますが、CentOS7ではadduser
はuseradd
のシンボリックリンクとなっているため同じコマンドとなります。コマンド参照結果[root@CENTOS7 ~]# ls -l /usr/sbin/useradd -rwxr-xr-x. 1 root root 137616 8月 9 2019 /usr/sbin/useradd [root@CENTOS7 ~]# ls -l /usr/sbin/adduser lrwxrwxrwx. 1 root root 7 10月 12 17:04 /usr/sbin/adduser -> useradd [root@CENTOS7 ~]#環境
- OS:CentOS Linux release 7.7.1908 (Core)
CenOS7バージョン確認結果[root@CENTOS7 ~]# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) [root@CENTOS7 ~]#1. useraddコマンドでユーザーを追加(オプション無し)
ユーザーを追加するには以下のコマンドを実行します。
useradd [ユーザー名]
実行結果[root@CENTOS7 ~]# useradd yasushi [root@CENTOS7 ~]#以下のコマンドでパスワードを設定します。
passwd [ユーザー名]
実行結果[[root@CENTOS7 ~]# passwd yasushi ユーザー yasushi のパスワードを変更。 新しいパスワード: 新しいパスワードを再入力してください: passwd: すべての認証トークンが正しく更新できました。 [root@CENTOS7 ~]#オプション無しの場合、デフォルトでユーザーが追加されます。
デフォルトの値は以下のコマンドで確認できます。
useradd -D
実行結果[root@CENTOS7 ~]# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes [root@CENTOS7 ~]#各項目の意味は以下の通りです。
項目 内容 GROUP 指定されていない場合の所属グループ HOME ホームディレクトリの作成場所 INACTIVE パスワードの期限が切れてから、アカウントが無効になるまでの期間
※(-1)は期限無しEXPIRE パスワードの有効期限 SHELL ログインシェル SKEL skeletonファイルのある場所 CREATE_MAIL_SPOOL メールスプールを作成するかの設定 2. ユーザー情報の確認
2.1. ユーザー一覧の確認
ユーザー一覧を確認するには以下のコマンドで
/etc/passwd
ファイルを参照します。
cat /etc/passwd
実行結果[root@CENTOS7 ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash ~~~~~ (省略) ~~~~~ yasushi:x:1002:1002::/home/yasushi:/bin/bash [root@CENTOS7 ~]#
/etc/passwd
は:
区切りで以下の情報を保持しています。
項目 作成された情報 1 ユーザー名 yasushi 2 ダミーパスワード x 3 ユーザーID 1002 4 グループID 1002 5 コメント (空) 6 ホームディレクトリ /home/yasushi 7 ログインシェル /bin/bash 2.2. パスワード一覧の確認
/etc/shadow
ファイルに暗号化されたパスワードの一覧が格納されています。このファイルrootのみ参照可能です。
cat /etc/shadow
実行結果[root@CENTOS7 ~]# cat /etc/shadow root:$6$n.LBF.Pi$pGDNeMrJNjOgXlcjQdguA/tZTryDlrDR2LCYgCrlT3KDpAu55nGmoh.4.OHlVL0zDw/YQlpV4HM6zzKCd2hQH.:18307:0:99999:7::: ~~~~~ (省略) ~~~~~ yasushi:$6$rwTX74Ir$YhhyryrTsbKdlAIWMKJqRQoQsK1TgelnQmHSpGmCDoXiGWQeQLTDtD73FEGur6tw5wZ50SbBo2QNVKEQUDcpV0:18307:0:99999:7::: [root@CENTOS7 ~]#
/etc/shadow
は:
区切りで以下の情報を保持しています。
項目 内容 作成された情報 1 ユーザー名 ユーザ名 yasushi 2 パスワード 暗号化されたパスワード (省略) 3 最終パスワード変更日 最後にパスワードが変更された年月日(1970年1月1日からの経過日数で表示) 18307 4 パスワード変更可能日数 パスワードが再度変更可能になるまでの日数 0 5 パスワード有効期限 パスワードの変更が必要になるまでの日数 99999 6 パスワード変更期間警告通知日 パスワード有効期限切の警告を何日前から通知するかの日数 7 7 アカウント無効日数 有効期限経過後にパスワードを変更しなかった場合にアカウントが使用不可になるまでの日数 (空) 8 アカウント有効期限 アカウントが使用不可になるまでの日数(1970年1月1日からの経過日数で表示) (空) 9 予約フィールド 未使用 (空) 2.3. グループ一覧の確認
グループ一覧を確認するには以下のコマンドで
/etc/group
ファイルを参照します。
cat /etc/group
実行結果[root@CENTOS7 ~]# cat /etc/group root:x:0: ~~~~~ (省略) ~~~~~ yasushi:x:1002: [root@CENTOS7 ~]#
/etc/group
は:
区切りで以下の情報を保持しています。
項目 作成された情報 1 グループ名 yasushi 2 ダミーパスワード x 3 グループID 1002 4 サブグループとして所属しているユーザー
(複数の場合はカンマ区切り)(空白) 3. useraddコマンドでユーザーを追加(オプション有り)
オプション有りでユーザーを追加するには以下のコマンドを実行します。
useradd [オプション] [ユーザー名]
主要なオプションは以下となります。
オプション 内容 -c comment コメントを設定 -d home_dir ホームディレクトリを指定 -e expire_date ユーザアカウントが使用不能になる日付を[YYYY-MM-DD]の書式で指定 -f inactive_days パスワードの使用期限が切れてからアカウントが永久に使用不能になるまでの日数を指定
0:パスワードの期限が切れると同時にこのアカウントは使用不能となる
-1:この機能が無効となる-g initial_group ユーザの属する主グループのグループ名またはグループIDを指定 -G group,[...] ユーザの属する補助グループのリストをカンマ区切りで指定 -m [-k skeleton_dir] ホームディレクトリが存在しない場合にはホームディレクトリを作成
-k オプションを同時に指定すると skeleton_dir 以下のファイルが、指定しないと /etc/skel 以下のファイルがホームディレクトリにコピーされる-o 重複した UID でユーザを作成できるようにする -p passwd cryptでハッシュ化されたパスワードを指定 -s shell ユーザのログインシェルを指定 -u uid UID を指定 以下のコマンドで、ホームディレクトリを「/data/test」、ログインシェルを「/bin/sh」で
yasushi02
ユーザーを作成する。
useradd -d /data/test -s /bin/sh yasushi02
実行結果[root@CENTOS7 ~]# useradd -d /data/test -s /bin/sh yasushi02 [root@CENTOS7 ~]#以下のコマンドでパスワードを設定します。
passwd [ユーザー名]
実行結果[root@CENTOS7 ~]# passwd yasushi02 ユーザー yasushi02 のパスワードを変更。 新しいパスワード: 新しいパスワードを再入力してください: passwd: すべての認証トークンが正しく更新できました。 [root@CENTOS7 ~]#ユーザー一覧(
/etc/passwd
)を確認/etc/passwdroot:x:0:0:root:/root:/bin/bash ~~~~~ (省略) ~~~~~ yasushi:x:1002:1002::/home/yasushi:/bin/bash yasushi02:x:1003:1003::/data/test:/bin/shパスワード一覧(
/etc/shadow
)を確認/etc/shadowroot:$6$n.LBF.Pi$pGDNeMrJNjOgXlcjQdguA/tZTryDlrDR2LCYgCrlT3KDpAu55nGmoh.4.OHlVL0zDw/YQlpV4HM6zzKCd2hQH.:18307:0:99999:7::: ~~~~~ (省略) ~~~~~ yasushi:$6$pJe9DpYg$6i9N217uNBwwIAGjuzfavGWffUyZVWMh0PpgaUEm5Ti3PN8T/KdUvEG4fibaBClUq7AzDphHfAqGuVgnEHfWf.:18307:0:99999:7::: yasushi02:$6$lXu7BN1C$OcFWVxt/weU4Sh2EUNC4YO5s/e5kqeNQ5EEX0PtwLOf1t/Cm86AGmLdbbJr51Qz0xFWWKwZYmHl0.WPJcyqLU1:18307:0:99999:7:::グループ一覧(``/etc/group')を確認
/etc/grouproot:x:0: ~~~~~ (省略) ~~~~~ yasushi:x:1002: yasushi02:x:1003:ホームディレクトリを確認
[root@CENTOS7 ~]# cd /data [root@CENTOS7 data]# ls test [root@CENTOS7 data]# cd test [root@CENTOS7 test]# ls -a . .. .bash_history .bash_logout .bash_profile .bashrc [root@CENTOS7 test]#4. パスワードを指定してユーザーを追加
パスワードを指定する場合、cryptでハッシュ化されたパスワードを指定する必要があります。
ユーザー「yasushi03」、パスワード「password03」でユーザーを追加する場合のコマンドは以下となります。
ここではsalt(パスワードを暗号化する際に追加する文字列のこと)に「salt03」を設定しています。saltは任意の文字列を使用可能です。
useradd -p $(perl -e 'print crypt("password03", "\$6\$salt03")') yasushi03
実行結果[root@CENTOS7 ~]# useradd -p $(perl -e 'print crypt("password03", "\$6\$salt03")') yasushi03 [root@CENTOS7 ~]#上記コマンドでは、cryptでハッシュ化されたパスワードとして
perl
を使用しています。
perl -e 'print crypt("[パスワード]", "[ハッシュ化方式記号][salt]");'
ハッシュ化方式の一覧は以下となります。
ハッシュ化方式記号 ハッシュ化方式 \$1\$ MD5 \$2\$ Blowfish \$5\$ SHA-256 \$6\$ SHA-512
perl -e 'print crypt("password03", "\$6\$salt03")'
実行結果[root@CENTOS7 ~]# perl -e 'print crypt("password03", "\$6\$salt03")' $6$salt03$/DhkQIuDsIIuvys.ISNOUB.OlWKxzgovMIBdCX2vlwCzEdNuIxMakytppnAGsKwT0hn12BW9XbCBd3KKXBh0/0[root@CENTOS7 ~]#
以上
- 投稿日:2020-02-16T00:51:40+09:00
Linuxのユーザー追加、useraddコマンドの使い方
Linux(ここではCenOS7)で
useradd
コマンドを使用してユーザーを追加する方法を紹介します。
Linuxコマンドでユーザーを追加する方法として、useradd
コマンドとadduser
コマンドがありますが、CentOS7ではadduser
はuseradd
のシンボリックリンクとなっているため同じコマンドとなります。コマンド参照結果[root@CENTOS7 ~]# ls -l /usr/sbin/useradd -rwxr-xr-x. 1 root root 137616 8月 9 2019 /usr/sbin/useradd [root@CENTOS7 ~]# ls -l /usr/sbin/adduser lrwxrwxrwx. 1 root root 7 10月 12 17:04 /usr/sbin/adduser -> useradd [root@CENTOS7 ~]#環境
- OS:CentOS Linux release 7.7.1908 (Core)
CenOS7バージョン確認結果[root@CENTOS7 ~]# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) [root@CENTOS7 ~]#1. useraddコマンドでユーザーを追加(オプション無し)
ユーザーを追加するには以下のコマンドを実行します。
useradd [ユーザー名]
実行結果[root@CENTOS7 ~]# useradd yasushi [root@CENTOS7 ~]#以下のコマンドでパスワードを設定します。
passwd [ユーザー名]
実行結果[[root@CENTOS7 ~]# passwd yasushi ユーザー yasushi のパスワードを変更。 新しいパスワード: 新しいパスワードを再入力してください: passwd: すべての認証トークンが正しく更新できました。 [root@CENTOS7 ~]#オプション無しの場合、デフォルトでユーザーが追加されます。
デフォルトの値は以下のコマンドで確認できます。
useradd -D
実行結果[root@CENTOS7 ~]# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes [root@CENTOS7 ~]#各項目の意味は以下の通りです。
項目 内容 GROUP 指定されていない場合の所属グループ HOME ホームディレクトリの作成場所 INACTIVE パスワードの期限が切れてから、アカウントが無効になるまでの期間
※(-1)は期限無しEXPIRE パスワードの有効期限 SHELL ログインシェル SKEL skeletonファイルのある場所 CREATE_MAIL_SPOOL メールスプールを作成するかの設定 2. ユーザー情報の確認
2.1. ユーザー一覧の確認
ユーザー一覧を確認するには以下のコマンドで
/etc/passwd
ファイルを参照します。
cat /etc/passwd
実行結果[root@CENTOS7 ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash ~~~~~ (省略) ~~~~~ yasushi:x:1002:1002::/home/yasushi:/bin/bash [root@CENTOS7 ~]#
/etc/passwd
は:
区切りで以下の情報を保持しています。
項目 作成された情報 1 ユーザー名 yasushi 2 ダミーパスワード x 3 ユーザーID 1002 4 グループID 1002 5 コメント (空) 6 ホームディレクトリ /home/yasushi 7 ログインシェル /bin/bash 2.2. パスワード一覧の確認
/etc/shadow
ファイルに暗号化されたパスワードの一覧が格納されています。このファイルrootのみ参照可能です。
cat /etc/shadow
実行結果[root@CENTOS7 ~]# cat /etc/shadow root:$6$n.LBF.Pi$pGDNeMrJNjOgXlcjQdguA/tZTryDlrDR2LCYgCrlT3KDpAu55nGmoh.4.OHlVL0zDw/YQlpV4HM6zzKCd2hQH.:18307:0:99999:7::: ~~~~~ (省略) ~~~~~ yasushi:$6$rwTX74Ir$YhhyryrTsbKdlAIWMKJqRQoQsK1TgelnQmHSpGmCDoXiGWQeQLTDtD73FEGur6tw5wZ50SbBo2QNVKEQUDcpV0:18307:0:99999:7::: [root@CENTOS7 ~]#
/etc/shadow
は:
区切りで以下の情報を保持しています。
項目 内容 作成された情報 1 ユーザー名 ユーザ名 yasushi 2 パスワード 暗号化されたパスワード (省略) 3 最終パスワード変更日 最後にパスワードが変更された年月日(1970年1月1日からの経過日数で表示) 18307 4 パスワード変更可能日数 パスワードが再度変更可能になるまでの日数 0 5 パスワード有効期限 パスワードの変更が必要になるまでの日数 99999 6 パスワード変更期間警告通知日 パスワード有効期限切の警告を何日前から通知するかの日数 7 7 アカウント無効日数 有効期限経過後にパスワードを変更しなかった場合にアカウントが使用不可になるまでの日数 (空) 8 アカウント有効期限 アカウントが使用不可になるまでの日数(1970年1月1日からの経過日数で表示) (空) 9 予約フィールド 未使用 (空) 2.3. グループ一覧の確認
グループ一覧を確認するには以下のコマンドで
/etc/group
ファイルを参照します。
cat /etc/group
実行結果[root@CENTOS7 ~]# cat /etc/group root:x:0: ~~~~~ (省略) ~~~~~ yasushi:x:1002: [root@CENTOS7 ~]#
/etc/group
は:
区切りで以下の情報を保持しています。
項目 作成された情報 1 グループ名 yasushi 2 ダミーパスワード x 3 グループID 1002 4 サブグループとして所属しているユーザー
(複数の場合はカンマ区切り)(空白) 3. useraddコマンドでユーザーを追加(オプション有り)
オプション有りでユーザーを追加するには以下のコマンドを実行します。
useradd [オプション] [ユーザー名]
主要なオプションは以下となります。
オプション 内容 -c comment コメントを設定 -d home_dir ホームディレクトリを指定 -e expire_date ユーザアカウントが使用不能になる日付を[YYYY-MM-DD]の書式で指定 -f inactive_days パスワードの使用期限が切れてからアカウントが永久に使用不能になるまでの日数を指定
0:パスワードの期限が切れると同時にこのアカウントは使用不能となる
-1:この機能が無効となる-g initial_group ユーザの属する主グループのグループ名またはグループIDを指定 -G group,[...] ユーザの属する補助グループのリストをカンマ区切りで指定 -m [-k skeleton_dir] ホームディレクトリが存在しない場合にはホームディレクトリを作成
-k オプションを同時に指定すると skeleton_dir 以下のファイルが、指定しないと /etc/skel 以下のファイルがホームディレクトリにコピーされる-o 重複した UID でユーザを作成できるようにする -p passwd cryptでハッシュ化されたパスワードを指定 -s shell ユーザのログインシェルを指定 -u uid UID を指定 以下のコマンドで、ホームディレクトリを「/data/test」、ログインシェルを「/bin/sh」で
yasushi02
ユーザーを作成する。
useradd -d /data/test -s /bin/sh yasushi02
実行結果[root@CENTOS7 ~]# useradd -d /data/test -s /bin/sh yasushi02 [root@CENTOS7 ~]#以下のコマンドでパスワードを設定します。
passwd [ユーザー名]
実行結果[root@CENTOS7 ~]# passwd yasushi02 ユーザー yasushi02 のパスワードを変更。 新しいパスワード: 新しいパスワードを再入力してください: passwd: すべての認証トークンが正しく更新できました。 [root@CENTOS7 ~]#ユーザー一覧(
/etc/passwd
)を確認/etc/passwdroot:x:0:0:root:/root:/bin/bash ~~~~~ (省略) ~~~~~ yasushi:x:1002:1002::/home/yasushi:/bin/bash yasushi02:x:1003:1003::/data/test:/bin/shパスワード一覧(
/etc/shadow
)を確認/etc/shadowroot:$6$n.LBF.Pi$pGDNeMrJNjOgXlcjQdguA/tZTryDlrDR2LCYgCrlT3KDpAu55nGmoh.4.OHlVL0zDw/YQlpV4HM6zzKCd2hQH.:18307:0:99999:7::: ~~~~~ (省略) ~~~~~ yasushi:$6$pJe9DpYg$6i9N217uNBwwIAGjuzfavGWffUyZVWMh0PpgaUEm5Ti3PN8T/KdUvEG4fibaBClUq7AzDphHfAqGuVgnEHfWf.:18307:0:99999:7::: yasushi02:$6$lXu7BN1C$OcFWVxt/weU4Sh2EUNC4YO5s/e5kqeNQ5EEX0PtwLOf1t/Cm86AGmLdbbJr51Qz0xFWWKwZYmHl0.WPJcyqLU1:18307:0:99999:7:::グループ一覧(``/etc/group')を確認
/etc/grouproot:x:0: ~~~~~ (省略) ~~~~~ yasushi:x:1002: yasushi02:x:1003:4. パスワードを指定してユーザーを追加
パスワードを指定する場合、cryptでハッシュ化されたパスワードを指定する必要があります。
ユーザー「yasushi03」、パスワード「password03」でユーザーを追加する場合のコマンドは以下となります。
ここではsalt(パスワードを暗号化する際に追加する文字列のこと)に「salt03」を設定しています。saltは任意の文字列を使用可能です。
useradd -p $(perl -e 'print crypt("password03", "\$6\$salt03")') yasushi03
実行結果[root@CENTOS7 ~]# useradd -p $(perl -e 'print crypt("password03", "\$6\$salt03")') yasushi03 [root@CENTOS7 ~]#上記コマンドでは、cryptでハッシュ化されたパスワードとして
perl
を使用しています。
perl -e 'print crypt("[パスワード]", "[ハッシュ化方式記号][salt]");'
ハッシュ化方式の一覧は以下となります。
ハッシュ化方式記号 ハッシュ化方式 \$1\$ MD5 \$2\$ Blowfish \$5\$ SHA-256 \$6\$ SHA-512
perl -e 'print crypt("password03", "\$6\$salt03")'
実行結果[root@CENTOS7 ~]# perl -e 'print crypt("password03", "\$6\$salt03")' $6$salt03$/DhkQIuDsIIuvys.ISNOUB.OlWKxzgovMIBdCX2vlwCzEdNuIxMakytppnAGsKwT0hn12BW9XbCBd3KKXBh0/0[root@CENTOS7 ~]#
以上