20200216のLinuxに関する記事は7件です。

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)

Linuxmanコマンドでコマンドのマニュアルを参照できます。
cpコマンドを参照する場合、以下のコマンドとなります。

man cp

コマンド
[root@CENTOS7 ~]# man cp
cp(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 man
MAN(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   カーネルルーチン [非標準]
~~~~~~~~~~~
省略
~~~~~~~~~~~

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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-L5786

    for_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 での登場順に振られていく。詳しい実装については下記サイトが参考になる。

cgroup の SUBSYS マクロ

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=6171

cgrp_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 コントリビューションに必要な情報をカーネル無改造で迅速に調べることができた。
本件に限らず、ユーザ空間とは異なる視点から情報を取得することで思いもしなかった問題を発見したり解決できたりすることが多々ある。需要があれば本件の詳細に加えてどこかで紹介したい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Finder上に絶対パスを表示させる

Finerでファイル操作をするとき、表示している階層がわからないのが非常に不便だと感じたので、以下のような感じでFinderのメニューの欄に常に絶対パスを表示させる設定をした。

スクリーンショット 2020-02-16 16.24.14.png

1.ターミナルを開く
2.ターミナル上で以下のコマンドを叩く
$ defaults write com.apple.finder _FXShowPosixPathInTitle -boolean true
3.Finder再起動
$ killall Finder

これデフォルトではディレクトリ名のみが表示されていたのが、フルパス表示されるようになりました。

元の状態に戻したい時(おまけ)

やっぱり元の状態に戻したい!ってなったときも以下の手順で簡単に元の状態に戻せます。

以下のコマンド叩く。

$ defaults write com.apple.finder _FXShowPosixPathInTitle -boolean false

同じようにFinder再起動

$ killall Finder

参考

https://pc-karuma.net/mac-finder-fullpath/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windowsからショートカットのクリックだけで対象サーバにSSHログイン

Puttyで公開鍵証明書を使ったログインを設定した後、ユーザー名の入力を求められることなくログインする方法です。

手順

  • Putty最新版のダウンロード
  • Puttyのインストール
  • Putty設定画面から、公開鍵ログインする設定を保存
  • Puttyに「公開鍵ログインする設定」と「ユーザー」を指定して実行するバッチファイルを作成

公開鍵ログインする設定

以下画面の通りPuttyの設定を作成して保存。

putty0000.JPG

putty0001.JPG

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を起動後に、保存しておいた設定をダブルクリックしてログイン時にユーザー名を入力してログインしていました。しかし、上記のバッチファイルを作成し、タスクバーにピン止めしておくことで、よく使うサーバにはすぐにログイン出来るようになりました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

viの移動系コマンド

vimの操作に慣れないので、逆引き用

文字単位

h
l
k
j
※数字との組み合わせ可能
9jなら9行分下へ、4lなら4文字分右

ワード単位

次の単語 w
前の単語 b
※数字との組み合わせ可能
3wなら3単語分次へ、4bなら4単語分前へ移動

行単位

行頭 0 または ^
行末 $
任意の行 :数字 ※:6ならファイルの6行目に移動

ファイル単位

ファイル先頭 gg
ファイル末尾 G

コマンド 結果
h 1文字左
l 1文字右
k 1文字上
j 1文字下
w 1単語次
b 1単語前
0 行頭
^
$ 行末
:数字 指定行へ
gg ファイル先頭
G ファイル末尾
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxのユーザー追加、useraddコマンドの使い方(パスワード指定)

Linux(ここではCenOS7)でuseraddコマンドを使用してユーザーを追加する方法を紹介します。
Linuxコマンドでユーザーを追加する方法として、useraddコマンドとadduserコマンドがありますが、CentOS7ではadduseruseraddのシンボリックリンクとなっているため同じコマンドとなります。

コマンド参照結果
[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/passwd
root: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/shadow
root:$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/group
root: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 ~]#

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxのユーザー追加、useraddコマンドの使い方

Linux(ここではCenOS7)でuseraddコマンドを使用してユーザーを追加する方法を紹介します。
Linuxコマンドでユーザーを追加する方法として、useraddコマンドとadduserコマンドがありますが、CentOS7ではadduseruseraddのシンボリックリンクとなっているため同じコマンドとなります。

コマンド参照結果
[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/passwd
root: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/shadow
root:$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/group
root: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 ~]#

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む