管理タスク

# ユーザーアカウント
ユーザーアカウント情報は`/etc/passwd`ファイルに保存されている。1行につき1ユーザーアカウントの情報が記述されている。項目ごとに「：」で区切られている

#### /etc/passwdのフィールド内容

| 項目名(左から順) | 説明 |
|:-:|:-:|
| ユーザー名  | システム内で一意のアカウント名。同じシステム内で重複は不可  |
| パスワード  | 現在ではシャドウパスワードが使われているため、「x」が入力されている。`/etc/shadow`ファイルに格納され、rootユーザーのみ読み出し可能。  |
| UID(ユーザーID)  | ユーザーを識別するための一意なID。rootユーザーは必ず0で、一般ユーザーは1000以降の番号、1~99まではシステム管理用、500未満はデーモンやディレクトリの所有者として利用するシステムアカウントに使用される  |
| GID(グループID)  | グループを識別するための一意なID。`/etc/group`ファイルで定義される  |
| GECOS  | ユーザーのフルネームやその他の情報などを記述するコメント欄  |
| ホームディレクトリ  | ユーザーのホームディレクトリの絶対パスを格納  |
| デフォルトシェル  | ユーザーがログインしたり新たにシェルを開いた際に起動されるシェルの絶対パスを格納  |

::: note info
ユーザー新規追加後は`/etc/shadow`の2番目のフィールドが「!!」となっていて、パスワード設定されていない。
また、パスワードフィールドの1文字目に「**＊」、あるいは「!」を指定するとログインを拒否することが出来る**。
:::

#### /etc/shadowのフィールド内容

| フィールド番号 | 内容 |
|:-:|:-:|
| 1  | ログイン名  |
| 2  | 暗号化されたパスワード  |
| 3  | 1970年1月1日から、最後にパスワードが変更されたまでの日数  |
| 4  | パスワードが変更可となるまでの日数  |
| 5  | パスワードを変更しなければならない日までの日数  |
| 6  | パスワードの期限切れに何日前にユーザーに警告するかの日数  |
| 7  | パスワードの期限切れに何日後にアカウントを使用不能とするかの日数  |
| 8  | 1970年1月1日から、アカウントが使用不要になるまでの日数  |
| 9  | 予約されたフィールド  |

::: note info
パスワードフィールドの1文字目に「**＊」、あるいは「!」を指定するとログインを拒否することが出来る**
:::



### useraddコマンド
**書式:useradd [オプション] ユーザー名**
ユーザーアカウントを作成するためのコマンド。オプション省略すると、`/etc/default/useradd`ファイルの設定がデフォルト値として使用される。

| オプション | 説明 |
|:-:|:-:|
| -c コメント  | コメントフィールドを指定する  |
| -d パス  | ホームディレクトリを指定する  |
| -e  | アカウント失効日の指定  |
| -f  | パスワードが失効してからアカウントが使えなくなるまでの日数  |
| -g グループ名(GID)  | プライマリグループを指定する  |
| -G グループ名(GID)  | プライマリグループ以外に所属するグループを指定する  |
| -k  | skelディレクトリの指定  |
| -s パス  | デフォルトシェルを指定する  |
| -D  | デフォルトの設定値を表示もしくは設定する  |
| -m  | ホームディレクトリを自動的に作成する  |
| -M  | ホームディレクトリを作成しない  |

::: note info
ユーザーアカウントを作成すると、ホームディレクトリも同時に作成される。`/etc/skel`ディレクトリにひな形として置くことで、基本的な設定ファイル、どのユーザーでも必要と思われるファイルも同時に配布することが可能。
:::

::: note warn
**Debian系ディストリビューションの場合、[-m]オプションを指定しないとユーザー新規追加してもホームディレクトリは作成されない**
:::


#### /etc/login.defs
+ CREATE_HOMEがyesの場合
[-m]オプションなしでホームディレクトリを作成することが出来る

+ USERGROUPS_ENABがyesの場合
グループ名はユーザ名と同じ名前になる。グループIDはユーザーIDと同じ値になる。

+ USERGROUPS_ENABがnoの場合
グループIDはGROUPの値になる


### usermodコマンド
**書式：usermod [オプション] ユーザー名**
既存のユーザーアカウントを変更するコマンド。

| オプション | 説明 |
|:-:|:-:|
| -c コメント  | コメントフィールドを変更する  |
| -d パス  | ホームディレクトリを変更する  |
| -e  |  アカウント失効日の指定  |
| -f  | パスワードの失効までの猶予日数を表示  |
| -g グループ名(GID)  | プライマリグループを変更する  |
| -G グループ名(GID)  | プライマリグループは変更せず、所属するグループを変更する  |
| -s パス  | ログインシェルを変更する  |
| -L(-l)  | パスワードをロックして一時的に無効化する  |
| -U  | パスワードのロックを解除する  |
| -e  | アカウントが失効する日を変更する  |
| -p  | crypt関数で暗号化済みのパスワードを設定。rootユーザのみ実行可能 |


### chsh(change shell)コマンド
**書式:chsh -s ログインシェル ユーザー名**
ログインシェルを変更するための専用コマンド。
ログインシェルに`/bin/false`を指定することにより、対話的なログインを禁止することが出来る。また、ログインシェルを`/sbin/nologin`に設定することで、アカウントが現在使えない旨のメッセージを表示した後ログアウトさせることも可能。


### userdelコマンド
**書式:userdel [オプション] ユーザー名**
ユーザーアカウントを削除するコマンド。オプションない場合はアカウントのみ削除される

| オプション | 説明 |
|:-:|:-:|
| -r(--remove)  | ホームディレクトリも同時に削除する  |
| -f(--force)  | ログイン中でもアカウントを削除する  |



### chageコマンド
**書式：chage [オプション(引数)] ユーザー名**
アカウント失効日の設定と表示するコマンド。

| オプション | 説明 |
|:-:|:-:|
| -l(list)  | アカウントとパスワードの失効日の情報を表示。**このオプションのみ一般ユーザーでも使用可**  |
| -d(lastday)  | パスワードの最終更新日を設定。年月日をYYYY-MM-DDの書式、もしくは1970年1月1日からの日数で指定する  |
| -m(mindays)  | パスワード変更間隔の最短日数を設定  |
| -M(maxdays)  | パスワードを変更なしで使用できる最長日数を設定  |
| -W(warndays)  | パスワードの変更期限の何日前から警告を出すかを指定  |
| -I(inactive)  | パスワードの変更期限を過ぎてからアカウントが使用できなくなるまでの猶予日数。この猶予期間ではログイン時にパスワードの変更を要求される  |
| -E(expiredate)  | アカウントの失効日を設定(失効日の翌日から使用不可になる）。年月日をYYYY-MM-DDの書式、もしくは1970年1月1日からの日数で指定する  |


![キャプチャ9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/bd1e9ac6-afe2-8680-91ab-01b2946585ef.png)




### passwdコマンド
**書式:passwd [オプション] ユーザー名**
パスワードを変更するためのコマンド。一般ユーザーは自分のパスワードだけ変更することが出来る。
設定、変更するときPAMの設定ファイルであるsystem-auth内にあるpasswdタイプのエントリに記述されている暗号化アルゴリズム(ハッシュ関数)が使われている。

| オプション | 説明 |
|:-:|:-:|
| -i(inactive)  |  パスワードの失効までの猶予日数を表示。  |
| -l  | パスワードをロックして一時的に無効化する  |
| -u  | パスワードのロックを解除する  |
| -x(expire)  | パスワードを変更なしで使用できる最長日数を設定  |

::: note info
`/etc/passwd`の第2フィールド内にx以外の暗号化パスワードが入っている時があるが、特に何も設定しなくてもシステムは正常に動作する
:::

::: note info
**・PAM(Pluggable Authenticaton Module)とは？？**
LinuxなどのUNIX系OSで、各アプリケーションから共通の認証方式を利用できるようにする仕組み。OS標準のユーザー認証をアプリケーションから利用することができる。
:::


# グループアカウント
グループアカウント情報は`/etc/group`ファイルに保存されている。
ユーザーは**プライマリグループ(基本グループ)、サブグループ(参加グループ**)と複数のグループに属することが可能。

| 項目名(左から順) | 説明 |
|:-:|:-:|
| グループ名  | グループの名称  |
| グループパスワード  | 現在ではシャドウパスワードが使われているため、「x」が入力されている。  |
| GID(グループID)  | グループを識別するためのGID  |
| グループメンバー  | このグループをサブグループにしているユーザー名が入る。複数のユーザーが属している場合は、「,」で区切っている  |


### groupsコマンド
所属するグループを確認するコマンド。

### groupaddコマンド
**書式：groupadd グループ名**
グループを作成するコマンド。オプション指定がない場合は、現在使用されている最大値+1が設定される。
新しいグループに追加すると、`/etc/group`,`/etc/gshadow`の最終行に表示される。

| オプション | 説明 |
|:-:|:-:|
| -g  | GIDを指定する  |

### groupmodコマンド
**書式：groupmod [オプション] グループ名**
既存のグループを変更するコマンド。rootユーザーのみ使用可能
**所属するユーザーを変更することは不可**

| オプション | 説明 |
|:-:|:-:|
| -g GID  | GIDを変更する  |
| -n グループ名  | グループ名を変更する  |

### groupdel
**書式：groupdel グループ名**
グループを削除するコマンド。削除対象グループをプライマリグループとするユーザーがいる場合は削除不可。


### gpasswdコマンド
`/etc/group`を管理するコマンドで、グループのパスワードや所属するメンバーなどを設定する。

### idコマンド
**書式：id [オプション] ユーザー名**
ユーザのUID（ユーザID）や、所属するグループのGID（グループID）を確認するコマンド。ユーザ名を省略すると、コマンドを実行したユーザの情報が表示される。また、オプションを省略すると、UIDと所属する全てのグループのGIDを表示する。

| オプション | 説明 |
|:-:|:-:|
| -u  | UIDを表示  |
| -g  | ユーザーのプライマリグループのGIDを表示  |
| -G  | 所属するすべてのグループGIDを表示  |



# ジョブスケーリング
定期的に実施する作業については、自動的に実行されるように設定することによって、システム管理コストを下げることが出来る。



## cron
定期的にジョブを実行することが出来る機能。スケジュールを管理する**crond**(`/usr/bin/crond`)があり、1分ごとにcrontabファイルを調べて実行すべきスケジュールが存在すればジョブを実行する
Debian系はcron(`/usr/bin/cron`)。

crondが実行するファイルは`/var/spool/cron`,`/etc/cron.d`ディレクトリ以下にの設定ファイルおよび`/etc/crontab`ファイル。

ユーザ用と管理者が設定するシステム用の2種類の設定ファイル（crontabファイル）がある。

+ **ユーザ用**
crontabファイルは`/var/spool/cron/ユーザ名`だが、**テキストエディタで直接編集はできない**。ユーザ用のcronの設定を行うには**crontab**コマンドを使用する

+ **管理者用**
crontabファイル`/etc/crontab`はviなどのテキストエディタで**直接編集可能**。ユーザ用のcrontabファイルの書式と異なり、各コマンドの実行ユーザも指定する必要がある。

~~~md
[root@localhost systemd]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
~~~




#### anacron(`/usr/sbin/anacron`)
コマンドを日単位の間隔で定期的に実行する。システム管理者がシステムの保守のために設定する。




### crontabコマンド
**書式：crontab [オプション]**
crontabファイルを編集するためのコマンド。ユーザーのcrontabファイルは`/var/spool/cron`ディレクトリ以下に置かれるが、エディタで直接編集ができないためこのコマンドを使用する

| オプション | 説明 |
|:-:|:-:|
| -e  | エディタを使ってcrontabファイルを編集する  |
| -l  | crontabファイルの内容を表示する  |
| -r  | crontabファイルを削除する  |
| -i  | crontabファイル削除時に確認する  |
| -u ユーザー名  | ユーザーを指定してcrontabファイルを編集する(rootユーザーのみ)  |

#### crontabファイル
**書式：分 時 日 月 曜日 コマンド**
「＊」は全ての値にマッチする、複数の値を指定する場合は「,」、間隔を指定する場合は「*/n(n:整数)」と指定する
1行ごとに、自動的に実行するコマンドおよびその実行日時を指定する。

| フィールド | 内容 |
|:-:|:-:|
| 分  | 0~59までの整数  |
| 時  | 0~23までの整数  |
| 日  | 1~31までの整数  |
| 月  | 1~12までの整数、もしくはjan~decまでの文字列  |
| 曜日  | 0~7までの整数(0,7：日曜~6:土曜)、もしくはSun,Monなどの文字列  |
| コマンド  | 実行すべきコマンド  |


| 表記 | 説明 |
|:-:|:-:|
| *  | 全ての値に一致  |
| -  | 範囲の指定。「1-3」と指定すると「1から3」を意味する  |
| ,  | 複数の値の指定。「1,2,3」と指定すると「1と2と3」を意味する|
| /  | 間隔の指定。「1-7/2」と指定すると「1から7の間で2間隔」を意味する  |

~~~md
#毎日23:15に/usr/local/bin/backupプログラムを実行する
15 23 * * * /usr/local/bin/backup

#2時間ごとに/usr/local/bin/syscheckプログラムを実行する
0 */2 * * * /usr/local/bin/syscheck
~~~

| ファイル/ディレクトリ | 説明 |
|:-:|:-:|
| /etc/crontab  | **システムのcrontabファイル**  |
| /etc/cron.d  | 各種のcronジョブを記述したファイルを収めたディレクトリ  |
| /etc/cron.hourly/  | 1時間に1度実行されるcronジョブを記述したファイルを収めたディレクトリ  |
| /etc/cron.daily/  | 1日に1度実行されるcronジョブを記述したファイルを収めたディレクトリ  |
| /etc/cron.weekly/  | 週に1度実行されるcronジョブを記述したファイルを収めたディレクトリ  |
| /etc/cron.mounthly/  | 月に1度実行されるcronジョブを記述したファイルを収めたディレクトリ  |
| /var/spool/cron(/var/spool/cron/crontabs/)  | **ユーザーのcrontabファイルを収めたディレクトリ**。ディストリビューションによってはディレクトリ名が変わる。rootユーザーのみアクセス可能。  |

### cronの実行権限
ユーザー単位で制限をかけることができる。以下のファイルどちらにも記述がない場合、**CentOSはrootユーザーのみ、Ubuntuは全てのユーザーがcronを利用することが出来る**

1. **/etc/cron.allow**ファイルがあれば、記述のあるユーザのみが利用可能
2. **/etc/cron.allow**ファイルがなければ、**/etc/cron.deny**を参照し、そこに記述のないユーザが利用可能
3. 両方のファイルがなければ、rootユーザのみが利用可能


## at
1回限りの実行スケジュールを行う。スケジューリングを実施するには**atd(`/usr/sbin/ard`)**が動作している必要がある。

::: note info
システムの負荷が低くなった時に指定したコマンドを1回だけ実行するには**bacthコマンド**を使用する。
:::


### atコマンド
**書式：at [オプション] 時間**
**書式：at [-f ファイル名] 日時**
対話式でコマンドを指定し、日時を指定すると入力モードになる。Ctrl＋Dでコマンドの入力を終了する。
また、対話式ではなくあらかじめテキストファイルにコマンドを記述しておき、そのファイルを指定する方法もある。

| オプション | 説明 |
|:-:|:-:|
| -d /-r | 予約中のジョブを上部番号で指定して削除する(=atrmコマンド)  |
| -l  | 予約中のジョブを表示する(=atqコマンド) 。rootユーザーが実行した場合は、全てのユーザのジョブを表示する。 |
| -f  | コマンドを記述したファイルを指定する  |

### atのアクセス制御
cronのアクセス制御同様に、ユーザー単位で制限をかけることができる。以下のファイルどちらにも記述がなければ全てのユーザーがatを利用でき、**どちらのファイルもなければ、rootユーザーのみatを利用可能**

デフォルトでは、空の`/etc/at.deny`ファイルがあり、全てのユーザーが利用できるようになっている。

1. **/etc/at.allow**ファイルがあれば、記述のあるユーザのみが利用可能
2. **/etc/at.allow**ファイルがなければ、**/etc/at.deny**を参照し、そこに記述のないユーザが利用可能
3. 両方のファイルがなければ、**rootユーザのみが利用可能**


::: note info
**/etc/at.allow**、**/etc/at.deny**ファイルどちらにもユーザー名の記載がある場合、**/etc/at.allow**ファイルが優先される
:::


## batchコマンド
**システムの負荷の少ないタイミングで指定した時間に1回だけコマンドを自動実行する**。設定されたジョブの管理は、atコマンドを使用して行う。
コマンドを入力すると、プロンプトが「at>」に変わり、コマンドを入力できるようになるので、実行したいコマンドを入力して、最後にCtrl+Dで終了する。


## timerユニット
systemdのtimerユニットを使うと、cronの代わりにジョブスケジューラとして使用することが可能になる。書式は「man 7 systemd.time」で確認可能

### monotonic timer(モノトニックタイマー)
何らかのイベントから一定時間経過した後に発動し、以後定期的に実施される。タイマーユニット設定ファイルの[Timer]セクションにスターティングポイントからの時間間隔を指定して実行する。

~~~ md
[Timer]
## タイマーをアクティベートしてからの時間
OnActiveSec=1hour
## 繰り返して実行する場合の時間間隔
OnunitActiveSec=1hour
## タイマーを利用して実行するファイル
Unit=timer-test.service
~~~

### realtime timer(リアルタイムタイマー)
crontabと同様にカレンダーで指定して定期的に実施される
実行時刻は「曜日 年-月-日 時刻」で指定する。省略は可能で、全てを省略した場合、当日の0:00:00となる。
~~~ md
[Timer]
## 毎日4時に実行する
OnCalendar=*-*-* 4:00:00
## タイマーを利用して実行するファイル
Unit=timer-test.service
~~~


### systemd-runコマンド
systemdで、一時的なユニットを作成してジョブを実行するコマンド。使用することでより簡単にジョブをスケジューリングすることができる。


# localization(ローカライゼーション)
言語や通貨単位、日付の書式などを地域や国に合わせること。最近のソフトウェアでは、最初から多言語・他地域に対応する様に作られている。これを**国際化(internationalization:i18n**)という

## ロケール
地域情報のことで、多くのソフトウェアは利用者の地域情報に従って表示言語や表示書式を変更できるように作られている。
環境変数LANG、LC_ALLを使って全てのカテゴリをまとめて設定することが出来る。
systemdが動作するシステムでのシステム全体のロケール設定ファイルは`/etc/locale.conf`になる。

| カテゴリ | 説明 |
|:-:|:-:|
| LC_CTYPE  | 文字の種類やその比較・分類の規定  |
| LC_COLLATE  | 文字の称号や整列に関する規定  |
| LC_MESSAGES  | メッセージ表示に使用する言語  |
| LC_MONETARY  | 通貨に関する規定  |
| LC_NAME  | 名前に関する規定  |
| LC_ADDRESS  | アドレス、ロケーションに関する規定  |
| LC_TELEPHONE  | 電話番号に関する規定  |
| LC_NUMERIC  | 数値の書式に関する規定  |
| LC_TIME  | 日付や時刻の書式に関する規定  |
| LC_ALL  | 指定した値がすべてのカテゴリを上書きし、カテゴリごとの設定ができないためあまり推奨されない  |
| LANG  | 指定した値がすべてのカテゴリを上書きし、カテゴリごとの設定ができる  |

**書式:言語名_国家もしくは地域名.文字コード**
一時的に変更したい場合は、「**変数名=ロケール名**」をコマンドの前に置く。
| ロケール名 | 説明 |
|:-:|:-:|
| C,POSIX  | 英語  |
| ja_JP.utf8(ja_JP.UTF-8)  | 日本語/Unicode  |
| ja_JP.eucJP  | 日本語/EUC-JP  |
| ja_JP.shiftJIS  | 日本語/シフトJIS  |
| en_US.utf8  | 英語(米)/Unicode  |

::: note info
デフォルトのロケールはC（POSIX）ロケール。
:::



### localeコマンド
**書式：locale [オプション]**
現在のロケール設定を確認するコマンド。引数なしで実行すると、現在設定されているロケール情報をすべて表示する。

| オプション | 説明 |
|:-:|:-:|
| -a  | 現在システムで使用できるロケールを表示する  |
| -m  |  利用できる文字コードの一覧 |

## 文字コード
多くのディストリビューションではUTF―8を利用しているが、日本ではいくつかの文字コードが存在している。

| 文字コード | 説明 |
|:-:|:-:|
| ASCII  | 7ビットで表される基本的な128種類の文字(英数字+α)  |
| ISO-8859  | ASCIIを拡張した8ビットの文字コードで256種類の文字  |
| UTF-8  | Unicodeを使った文字コードで、1文字を1~6バイトで表す  |
| 日本語EUC(EUC-JP)  | UNIX環境で標準的に利用されていた日本語の文字コード  |
| シフトJIS  | Windowsで利用される日本語の文字コード  |
| ISO-2022-JP  | 電子メールなどで利用される日本語の文字コード(JISコード)  |
| Unicode  | 多言語を扱うために符号化文字集合(文字コード表)。UTF-8（Linux標準使用）、UTF-16、UTF-32などがある。  |

### iconvコマンド
**書式：iconv [オプション] 入力ファイル**
文字コードを変換するコマンド。

| オプション | 説明 |
|:-:|:-:|
| -f(from) 入力文字コード  | 変換前の文字コードを指定する  |
| -t(to) 入力文字コード | 変換して出力したい文字コードを指定する  |
| -l  | 扱える文字コードを表示する  |

~~~ md
#日本語EUCで作成されたreport.euc.txtをUTF-8に変換してreport.utf8.txtとして保存

$ iconv -f eucjp -t utf8 report.euc.txt > report.utf8.txt
~~~