コンテンツにスキップ

Unix系標準ユーティリティ@ユーティリティ

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


adduser

adduser

シェルのユーザーを操作する。


-s

ユーザーが使用するシェルを設定する。

*実行例*

ユーザーを作成する。

無効なシェルを設定し、ログインできないようにしておく。

$ adduser -s /bin/false foo


chmod:change mode

<数字/シンボル>

ファイルやディレクトリの権限を変更する

数字モードとシンボルモードがある。

よく使用されるパーミッションのパターンは次の通り。

$ chmod 600 <ファイルへのパス>

$ chmod 600 <ディレクトリへのパス>


-R <数字/シンボル>

ディレクトリ内のファイルに対して、再帰的に権限を付与する。

ディレクトリ名にスラッシュをつける必要がある。

$ chmod -R 600 <ディレクトリ名>/


100番刻みの規則性

所有者以外に全権限が与えられない。

数字モード シンボルモード 所有者 グループ その他 特徴
500 記入中... r-x --- --- 所有者以外に全権限なし。所有者は、ReadとExecuteのみ。
600 記入中... rw- --- --- 所有者以外に全権限なし。所有者は、ReadとWriteのみ。
700 記入中... rwx --- --- 所有者以外に全権限なし。所有者は、全権限あり。


111番刻みの規則性

全てのパターンで同じ権限になる。

数字モード シンボルモード 所有者 グループ その他 特徴
555 a=+rx r-x r-x r-x 全てにWrite権限なし。ReadとExecuteのみ。
666 a=+rw rw- rw- rw- 全てにExecute権限なし。ReadとWriteのみ。
777 a=rwx rwx rwx rwx 全てに全権限あり。


その他でよく使用する番号

数字モード シンボルモード 所有者 グループ その他 特徴
644 記入中... rw- r-- r-- 所有者以外にWriteとExecute権限なしで、Readのみ。
755 記入中... rwx r-x r-x 所有者以外にWrite権限なしで、ReadとExecuteのみ。


<権限付与先>

シンボルモードと組み合わせて、特定のユーザーやグループに権限を付与する。

シンボル 説明
a 全てのシンボルを一括で選ぶことを表す。
u ディレクトリやファイルの所有ユーザーを表す。
g ディレクトリやファイルの所有グループを表す。
o その他のアカウントを表す。

*例*

$ chmod a+x foo

*例*

# あらかじめ、fooディレクトリの所有者 (ここでは、UUIDが999のユーザー) を設定しておく
$ chown -R 999:999 foo

# fooディレクトリの所有者に全権限を付与する
$ chmod -R u+rwx foo


go

現在のchmodコマンドの実行者以外に認可スコープを付与する。

$ chmod go+r <ファイルへのパス>


chown

chownとは

ユーザー所有権、グループ所有権、を変更する。

$ chown <ユーザー所有権>:<グループ所有権> <ファイル名>

*例*

ユーザー所有権をfooに、グループ所有権は変更しない

$ chown foo bar.txt

*例*

ユーザー所有権をfooに、グループ所有権をbarに変更する。

$ chown foo:foo bar.txt


-R

ディレクトリと、ディレクトリ内のファイルの所有権を再帰的に変更する。

$ chown foo:foo ./bar -R


cp

-Rp

ディレクトリの属性情報も含めて、ディレクトリとファイルを再帰的にコピーする。

$ cp -Rp /<ディレクトリ名1>/<ディレクトリ名2> /<ディレクトリ名1>/<ディレクトリ名2>
# 隠しファイルも含めて、ディレクトリの中身を他のディレクトリ内にコピー
# 『アスタリスク』でなく『ドット』にする
$ cp -Rp /<ディレクトリ名> /<ディレクトリ名>


-p

<ファイルへのパス>.YYYYmmdd』の形式でバックアップファイルを作成する。

$ cp -p <コピー元ファイルへのパス> <コピー先ファイルへのパス>.`date +"%Y%m%d"`


cron

cronとは

Unixにて、Linuxの能力の1個であるジョブ管理を実装する。

あらかじめ、ジョブ (定期的なバッチ処理) を登録しておき、指定したスケジュールに従って、ジョブを実行する。


cronファイル

# /etc/cron.hourly/cron-hourly.txt
# バッチ処理を、毎時・1分ごとに実行するように設定する。
1 * * * * root run-parts /etc/cron.hourly
# <- 最後は改行する。
ディレクトリ名 利用者 主な用途
/etc/crontab root 任意のcronファイルを配置するディレクトリ
/etc/cron.hourly root 毎時実行されるcronファイルを配置するディレクトリ
/etc/cron.daily root 毎日実行されるcronファイルを配置するディレクトリ
/etc/cron.monthly root 毎月実行されるcronファイルを配置するディレクトリ
/etc/cron.weekly root 毎週実行されるcronファイルを配置するディレクトリ

*実装例*

(1)

あらかじめ、各ディレクトリにcronファイルを配置しておく。

(2)

ジョブを登録するファイルを作成する。run-partsコマンドで、指定した時間に、各cronディレクトリ内のcronファイルを一括で実行するように記述しておく。

# 設定
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO="example@gmail.com"
LANG=ja_JP.UTF-8
LC_ALL=ja_JP.UTF-8
CONTENT_TYPE=text/plain; charset=UTF-8

# 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

# ジョブ
1 * * * * root run-parts /etc/cron.hourly # 毎時・1分
5 2 * * * root run-parts /etc/cron.daily # 毎日・2時5分
20 2 * * 0 root run-parts /etc/cron.weekly # 毎週日曜日・2時20分
40 2 1 * * root run-parts /etc/cron.monthly # 毎月一日・2時40分
@reboot make clean html # cron起動時に一度だけ


cron.dファイル

複数のcronファイルで全ての1つのディレクトリで管理する場合に使用する。

ディレクトリ名 利用者 主な用途
/etc/cron.d root 上記以外の自動タスク設定ファイルを配置するディレクトリ


crond

crondとは

cronデーモンを起動するためのプログラムである。

語尾の『d』は、デーモンの意味である。


-n

フォアグラウンドプロセスとしてcronを起動する。

$ crond -n


crontab

crontabとは

crontabファイルを操作する。

作成したcronファイルを登録できる。

cron.dファイルは操作できない。

$ crontab <ファイルへのパス>

*実装例*

(1)

拡張子は自由で、時刻とコマンドが実装されたファイルを用意する。この時、最後に改行がないとエラー (premature EOF) になるため、改行を追加する。

# /etc/cron.hourly/cron-hourly.txt
# 毎時・1分
1 * * * * root run-parts /etc/cron.hourly
# <- 最後は改行する。
# /etc/cron.daily/cron-daily.txt
# 毎日・2時5分
5 2 * * * root run-parts /etc/cron.daily
# <- 最後は改行する。
# /etc/cron.monthly/cron-monthly.txt
# 毎週日曜日・2時20分
20 2 * * 0 root run-parts /etc/cron.weekly
# <- 最後は改行する。
# /etc/cron.weekly/cron-weekly.txt
# 毎月一日・2時40分
40 2 1 * * root run-parts /etc/cron.monthly
# <- 最後は改行する。
# cron起動時に一度だけ
@reboot make clean html
# <- 最後は改行する。
(2)

このファイルをcrontabコマンドで登録する。cronファイルの実体はないことと、ファイルの内容を変更した場合は登録し直さなければいけないことに注意する。

$ crontab /etc/cron.hourly/cron-hourly.txt
(3)

登録されている処理を取得する。

$ crontab -l

1 * * * * root run-parts /etc/cron.hourly/cron.hourly
(4)

ログに表示されているか否かを確認する。

$ cd /var/log

$ tail -f cron
(5)

改行コードを確認。改行コードが表示されない場合はLFであり、問題ない。

$ file /etc/cron.hourly/cron-hourly.txt

foo.txt: ASCII text


-e

エディタを開き、登録済みのcronファイルを変更/削除する。

$ crontab -e

# 登録されたcronファイルが表示されるため、変更/削除する。
1 * * * * rm foo


-l

登録済みのcronファイルの一覧を表示する。

$ crontab -l

# crontabコマンドで登録されたcronファイルの処理
1 * * * * rm foo


curl

curlとは

HTTPプロトコルでリクエストを送信する。

テストサイト (例:httpbin.org) に送信すると、通信を検証できる。

なお、TCPスリーウェイハンドシェイクを実行する場合はncコマンドを使用する。

ダウンロードのためのユーティリティとしては、curlコマンドよりもwgetコマンドの方が良い。


-d

メッセージボディを設定する。

*例*

$ curl -X POST -H "Content-Type:application/json" -d '{}' https://example.com/foo


-s (小文字)

ダウンロードの進捗ログを表示しない。

$ curl -sL https://example.com/foo

curlコマンドの結果から、特定の文字を抽出できる。

# 『=』より後ろのバージョンを取得する
$ curl -s https://example.com/foo.txt | grep version= | sed -e 's/^[^=]*=//'


-sS (小文字)

ダウンロードの進捗ログを表示しないが、エラーは表示する。

$ curl -sSL https://example.com/foo


-k

SSL証明書のエラーを無視する。

自己署名SSL証明書を使用している場合に、以下のようなエラーでHTTPSリクエストを送信できないため、これを無視する。

$ curl https://*.*.*.* -H 'Host:example.com'

curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

# kオプションを有効化する。
$ curl https://*.*.*.* -k -H 'Host:example.com'


-L

指定したURLでリダイレクトが行われても、リダイレクト後のURLからファイルをインストールする。

リダイレクトを含む場合、ダウンロードしたディレクトリが空になってしまうため、必ずつけておく。

*例*

$ curl -L https://example.com/foo


-o (小文字)

インストール後のファイル名を定義する。これを指定しない場合、-Oオプションを有効化する必要がある。

インストール対象が圧縮ファイルの場合、圧縮ファイルの解凍後ファイルは圧縮ファイルの元々の名前になるため、-oオプションは意味がない。

一方で、ディレクトリを指定してダウンロードする方法はなく、-Oオプションをしてしなければならない。

*例*

$ curl -L -o <ファイルへのパス> https://example.com


-O (大文字)

インストール後のファイル名はそのままでインストールする。これを指定しない場合、-oオプションを有効化する必要がある。

$ curl -LO https://example.com


--resolve

ドメインとIPアドレスを紐付け、指定した名前解決を行いつつ、curlコマンドを実行する。

$ curl --resolve <ドメイン名>:<ポート番号>:<IPアドレス> https://example.com

*例*

リクエストの名前解決時に、example.comを正引きすると127.0.0.1が返却されるようにする。

$ curl --resolve example.com:80:127.0.0.1 https://example.com


-v

HTTPリクエストの詳細な情報を出力する。

$ curl -v https://example.com


-X

HTTPメソッドを設定する。

*例*

$ curl -X GET https://example.com


df

dfとは

パーティションの状態をデバイスファイル名で取得する。

パーティションで区切られたストレージのうち、マウントされているもののみを取得する。

*例*

$ df

Filesystem      512-blocks      Used Available Capacity iused      ifree %iused  Mounted on
/dev/disk1s1s1   976490576  44424136 671194960     7%  559993 4881892887    0%   /
devfs                  393       393         0   100%     681          0  100%   /dev
/dev/disk1s5     976490576  10485816 671194960     2%       5 4882452875    0%   /System/Volumes/VM
/dev/disk1s3     976490576    774096 671194960     1%    1648 4882451232    0%   /System/Volumes/Preboot
/dev/disk1s6     976490576    224048 671194960     1%     450 4882452430    0%   /System/Volumes/Update
/dev/disk1s2     976490576 247856952 671194960    27% 1367035 4881085845    0%   /System/Volumes/Data
map auto_home            0         0         0   100%       0          0  100%   /System/Volumes/Data/home
/dev/disk1s1     976490576  44424136 671194960     7%  553759 4881899121    0%   /System/Volumes/Update/mnt1
/dev/disk2s1        610224    421128    189096    70%     360 4294966919    0%   /Volumes/Kindle
/dev/disk3s1        188336    149544     38792    80%     735 4294966544    0%   /Volumes/Amazon Chime


-h、-m、-t

ストレージの使用状況をメガバイトで取得する。

*例*

デバイスファイルと、これがマウントされたディレクトリの使用率を確認できる。

# -h:--human-readable
$ df -h -m --total

Filesystem                        1M-blocks    Used   Available   ifree %iused  Mounted on
devtmpfs                               1851       0        1851             0%  /dev
tmpfs                                  1869       0        1869             0%  /dev/shm
tmpfs                                  1869     192        1677            11%  /run
tmpfs                                  1869       0        1869             0%  /sys/fs/cgroup
/dev/mapper/rhel-root                 45031    3490       41541             8%  /
/dev/sda1                              1014     202         813            20%  /boot

...

total                                 557167 390644      140909            74%  -


fdiskとの違い

類似するdfコマンドでは、パーティションで区切られたストレージのうちでマウントされたもののみを取得する。

一方でfdiskコマンドでは、マウントされているか否かに関わらず、パーティションで区切られた全てのストレージを取得する。


diff

diffとは

テキストファイルの内容を比較する。

別途、colordiffパッケージを入れると見やすくなる。


-u

プラスとマイナスで差分を取得する。

$ diff -u foo.txt bar.txt


リダイレクトの比較

リダイレクトしたテキストを比較する。

$ diff <(echo 'test') <(echo 'tests')

-test
+tests


du

duとは

指定したディレクトリ内のサブディレクトリのサイズ、ディレクトリ全体の合計サイズ (KB) 、を取得する。

# 表示結果をサイズの降順に並び替える。
$ du ./ | sort -n

21816   ./vendor/foo/bar/baz/qux
27004   ./vendor/foo/bar/baz
27036   ./vendor/foo/bar
27604   ./vendor/foo
115104  ./vendor
123016  ./


-h

読みやすい単位で、指定したディレクトリ内のサブディレクトリのサイズ、ディレクトリ全体の合計サイズ (KB) 、を再帰的に取得する。ただし、細かい数値が省略されてしまうため、より正確なサイズを知りたい場合は、-hオプションを使用しないようにする。

$ du -h ./

21K   ./vendor/foo/bar/baz/qux # 読みやすいが、細かい数値は省略されてしまう。
27K   ./vendor/foo/bar/baz
27K   ./vendor/foo/bar
27K   ./vendor/foo
1.1M  ./vendor
1.2M  ./


--max-depth=1

再帰的にディレクトリのサイズを取得する時に、階層の深さを設定する。

$ du -h ./vendor/foo --max-depth=1

27K   ./vendor/foo
26K   ./vendor/foo2
29K   ./vendor/foo3
1.1M  ./vendor


-s

指定したディレクトリ内の合計サイズ (KB) を取得する。

$ du -s ./

12345678 ./


echo

echoとは

定義されたシェル変数を出力する。

変数名には$マークを付ける。

ダブルクオートはあってもなくても良い。

$ <変数名>=<値>

$ echo $<変数名>

$ echo "$<変数名>"


-e

エスケープシーケンスを有効化する。

# 改行できるようになる
$ VAR=FOO\nBAR

# バックスラッシュを使えるようになる
$ echo $VAR
$ VAR=FOO\\BAR

# バックスラッシュを使えるようになる
$ echo $VAR


export

exportとは

基本的な手順としては、シェル変数を設定し、これを環境変数に追加する。

# シェル変数を設定
$ PATH=$PATH:<バイナリファイルへのあるディレクトリへの絶対パス>
# 環境変数に追加
$ export PATH

シェル変数の設定と、環境変数への追加は、以下の通り同時に記述できる。

# 環状変数として、指定したバイナリファイル (bin) のあるディレクトリへの絶対パスを追加。
# バイナリファイルを入力すると、絶対パス
$ export PATH=$PATH:<バイナリファイルへのあるディレクトリへの絶対パス>
# 不要なパスを削除したい場合はこちら
# 環状変数として、指定したバイナリファイル (bin) のあるディレクトリへの絶対パスを上書き
$ export PATH=/sbin:/bin:/usr/sbin:/usr/bin


/home/centos/.bashrcファイル

OSを再起動すると、exportコマンドの結果は消去されてしまう。

そのため、再起動時に自動的に実行されるよう、.bashrcファイルに追記しておく。

# Source global definitions
if [ -f /etc/bashrc ]; then
  . /etc/bashrc
fi

# User specific environment
PATH="$HOME/.local/bin:$HOME/bin:$PATH"

# fooバイナリファイルのパスを追加 を追加 <--- ここに追加
PATH=$PATH:/usr/local/sbin/foo

export PATH

# Uncomment the following line if you don"t like systemctl"s auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions


fdisk

-l

パーティションの一覧を取得する。

$ fdisk -l

ディスク /dev/vda: 20 GiB, 21474836480 バイト, 41943040 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 301D27AA-0BF9-4B81-9B4A-3138251A4FD7

# パーティションの情報
デバイス   開始位置 最後から セクタ サイズ タイプ                 UUID
/dev/vda1      2048   206847   204800   100M Linux ファイルシステム 56713D43-4900-46EB-92D5-1D09C9449B11
/dev/vda2    206848  4401151  4194304     2G Linux スワップ         D156FFCF-97DE-45EB-A6B0-21A9B876129A
/dev/vda3   4401152 41943006 37541855  17.9G Linux ファイルシステム C7A19722-4C31-4646-8ED4-DD4D86EFBC50


file

fileとは

ファイルの改行コードを取得する。

# LFの場合 (何も表示されない)
$ file foo.txt
foo.txt: ASCII text

# CRLFの場合
$ file foo.txt
foo.txt: ASCII text, with CRLF line terminators

# CRの場合
$ file foo.txt
foo.txt: ASCII text, with CR line terminators<br>


find

-type

ファイルを検索する。

アスタリスクを付けなくとも、自動的にワイルドカード (*) が働く。

$ find ./* -type f | xargs grep "<検索文字>"
# パーミッションエラーなどのログを破棄して検索。
$ find ./* -type f | xargs grep "<検索文字>" 2> /dev/null

実行例

設定ファイルの場所を探す。

$ find ./* -type f | xargs grep ".conf" 2> /dev/null

SSL証明書の場所を探す。

$ find ./* -type f | xargs grep ".crt" 2> /dev/null


-name

ファイル名が.confで終了するものを全て検索する。

$ find ./* -name "*.conf" -type f

名前が dir で終了するディレクトリを全て検索する。

$ find ./* -name "*dir" -type d

ルートディレクトリ配下で、 <検索文字>という文字をもち、ファイル名が.confで終了するファイルを全て検索する。

$ find ./* -name "*.conf" -type f | xargs grep "<検索文字>"

指定した拡張子のファイルを全て削除する。

$ find ./* -name "*.txt" -type f | xargs rm -rf


free

-m、--t

物理メモリ、スワップ領域、の使用状況をメガバイトで取得する。

# m:--mega
$ free -m --total

              total        used        free      shared  buff/cache   available
Mem:          15387        2682        6672           1        6032       12459
Swap:             0           0           0

メモリ使用率は、以下の計算式で算出できる。

メモリ使用率 =
( ( Total - Free ) / Total * 100 ) =
((15387 - 12459) / 15387) * 100 = 19 %


grep

grepとは

標準出力に出力された文字列のうち、合致するもののみを取得する。

$ grep -h

usage: grep [-abcdDEFGHhIiJLlMmnOopqRSsUVvwXxZz] [-A num] [-B num] [-C[num]]
        [-e pattern] [-f file] [--binary-files=value] [--color=when]
        [--context[=num]] [--directories=action] [--label] [--line-buffered]
        [--null] [pattern] [file ...]


基本的な使い方

文字列の表示に関する様々なユーティリティ (例:lscatfind、など) と組み合わせて使用する。

$ cat foo.txt | grep bar
$ cat foo.txt | grep bar

grepコマンドを忘れると、後続のコマンドに取得内容をパラメーターとして渡すことになるが、これで問題が起こることがある。


--

ハイフンを含む文字列を取得する。

$ cat foo.txt | grep -- "--bar"


-A、-B、-C

標準出力に出力された文字列のうち、周辺 (以降、以前、前後) の数行を取得する。

# 以降5行
$ cat foo.txt | grep bar -A 5
# 以前5行
$ cat foo.txt | grep bar -B 5
# 前後5行
$ cat foo.txt | grep bar -C 5


-e

標準出力に出力された文字列のうち、複数の文字列を取得する。

$ cat foo.txt | grep -e bar -e baz


-E

標準出力に出力された文字列のうち、正規表現で文字列を取得する。

ログの最初のタイムスタンプに基づいてログをフィルタリングしたい時に役立つ。

$ cat foo.txt | grep -E "^2023-01-01 12:00"


-i

標準出力に出力された文字列のうち、大文字と小文字を区別せずに、合致するもののみを取得する。

$ cat foo.txt | grep -i bar


history

historyとは

指定した履歴数でコマンドを取得する。

$ history 100

履歴1000件の中からコマンドを検索する。

$ history 1000 | grep <過去のコマンド>

番号を除きたい場合、awkコマンドを使用する。

$ history | awk '{$1=""; print $0}'


id

idとは

現在の実行ユーザーを確認する。

$ id

uid=999 gid=0(root) groups=0(root),999
項目 説明
uid ユーザー番号を表す。
gid ユーザー名を表す。root権限の実行ユーザーの場合は、(root)がつく。
groups プライマリグループのグループ番号を表す。root権限の実行ユーザーの場合は、(root)がつく。
番号 プライマリグループ名を表す。


iptables

iptablesとは

iptablesの設定を取得/変更する。

Linux/Ubuntuでのiptablesは、標準的なNAPTルーターかつパケットフィルタリング型ファイアウォールである。


テーブル

▼ テーブルとは

各パケット処理の実行タイミングを制御する。

テーブル名 説明 チェイン
filter パケットフィルタリング型ファイアウォールとしてパケットを制限する。 INPUTOUTPUTFORWARD
nat NAPTルーターとして、DNAT処理する。 POSTROUTINGPREROUTINGOUTPUT
mangle 特定のパケットのヘッダー情報を変更する。 POSTROUTINGPREROUTINGINPUTOUTPUTFORWARD
raw 特定のパケットを処理せずにそのまま通過させる。 PREROUTINGOUTPUT
security SELinuxを適用する。 INPUTOUTPUTFORWARD

▼ チェイン

通過するパケットに対する処理内容を定義する。

テーブルごとに使用できるチェインが異なる。

チェイン名 説明
INPUT 受信を許可/拒否する対象のパケットを定義する。
OUTPUT 送信を許可/拒否する対象のパケットを定義する。
FORWARD 転送を許可/拒否する対象のパケットを定義する。
PREROUTING 宛先IPアドレスとポートを変換する対象のパケットを定義する。ルーティング前に実行する。
POSTROUTING 送信元IPアドレスとポートを変換する対象のパケットを定義する。ルーティング後に実行する。


サブコマンド

▼ -L (--list)

全てのChainのルールの一覧を取得する。

$ iptables -L

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

...

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

...

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

...

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

...

Chain名を指定することもできる。

$ iptables -L <Chain名>

▼ -S

全てのChainのルールをコマンド形式で取得する。

$ iptables -S

-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P POSTROUTING ACCEPT
-P OUTPUT ACCEPT

...


オプション

▼ --line-number

Chain内の各ルールを番号付きで取得する。

$ iptables --line-number

▼ -t (--table)

指定したテーブル (filternatmangleRaw) を持つChainのみを取得する。

$ iptables -L -t nat

▼ -n (--numeric)

ChainのIPアドレスを名前解決せずに、IPアドレスのまま取得する。

$ iptables -L -n

▼ -v

Chain内のルールを詳しく取得する。

$ iptables -L -v


less

lessとは

標準出力への出力内容が膨大な場合に、ページングしながら出力する。

出力内容が大きい場合に『...』を出力してしまうようなツールにも有用である。

$ cat foo.txt | less


ln

シンボリックリンクとは

ファイルやディレクトリのショートカットのこと。

シンボリックリンクに対する処理は、リンク先のファイルやディレクトリに転送される。


-s

カレントディレクトリ配下に、シンボリックリンクを作成する。

リンクの元になるディレクトリやパスを指定する。

$ ln -s <リンク先までのパス> <シンボリックリンク名>


kill

-9

指定したPIDのプロセスを削除する。

$ kill -9 <プロセスID>

指定したコマンドによるプロセスを全て削除する。

$ sudo pgrep -f <コマンド名> | sudo xargs kill -9


logrotate

logrotateとは

ファイルには2GBを超えてテキストを書き込めない。

そのため、ログを継続的にファイルに書き込む場合は、定期的に、書き込み先を新しいファイルに移行する必要がある。

ローテションされた過去のログファイルでは、ファイル名の末尾に最終日付 (例:-20220101) をつけておく。


ls

-1

ファイル名のみを一列で取得する。

$ ls -1

foo
bar
baz
qux


-l、-a

隠しファイルや隠しディレクトリも含めて、全ての詳細を取得する。

この時に表示される日付は、最終更新日である。

$ ls -l -a

-rw-r--r--  1 root   8238708 Jun 19 20:18 foo
-rw-r--r--  1 root     20734 Jun 19 20:18 bar
-rw-r--r--  1 root 266446929 Jun 19 20:18 baz
-rw-r--r--  1 root 174540990 Jun 19 20:18 qux


-h

ファイルサイズをわかりやすい単位で取得する。

ディレクトリのサイズは取得できない。

$ ls -l -h

-rw-r--r-- 1 root root 7.9M Jun 19 20:18 foo
-rw-r--r-- 1 root root 21K  Jun 19 20:18 bar
-rw-r--r-- 1 root root 255M Jun 19 20:18 baz
-rw-r--r-- 1 root root 167M Jun 19 20:18 qux


lsblk

lsblkとは

ストレージ上にある、物理ボリューム、パーティション、論理ボリューム、を取得する。

個別に取得したければ、物理ボリュームはpvdisplayコマンド、パーティションはfdiskコマンド、論理ボリュームはlvdisplayコマンド、で確認する。

$ lsblk

NAME          MAJ:MIN RM   SIZE  RO  TYPE  MOUNTPOINT
xvda          202:0    0    16G   0  disk             # ストレージ
└─xvda1       202:1    0     8G   0  part  /          # パーティション
  ├─root      253:0    0     5G   0   lvm  /          # 論理ボリューム
  └─swap      253:1    0     3G   0   lvm  [SWAP]
nvme1n1       259:1    0   200G   0  disk  /var/lib   # ストレージ


lsof:List open file

-i、-P

使用中のポートをプロセス別に取得する。

$ lsof -i -P | grep LISTEN

phpstorm   4145 hasegawa   25u  IPv6 *****      0t0  TCP localhost:6942 (LISTEN)
phpstorm   4145 hasegawa   27u  IPv6 *****      0t0  TCP localhost:63342 (LISTEN)
com.docke 46089 hasegawa   63u  IPv6 *****      0t0  TCP *:3500 (LISTEN)
com.docke 46089 hasegawa   75u  IPv4 *****      0t0  TCP localhost:6443 (LISTEN)
com.docke 46089 hasegawa   78u  IPv6 *****      0t0  TCP *:8500 (LISTEN)
com.docke 46089 hasegawa   80u  IPv6 *****      0t0  TCP *:3000 (LISTEN)
LINE      48583 hasegawa    7u  IPv4 *****      0t0  TCP localhost:10400 (LISTEN)
Google    93754 hasegawa  140u  IPv4 *****      0t0  TCP localhost:56772 (LISTEN)
minikube  97246 hasegawa   19u  IPv4 *****      0t0  TCP 192.168.64.1:50252 (LISTEN)


lvdisplay

論理ボリュームの一覧を取得する。

$ lvdisplay

  --- Logical volume ---
  LV Name               /dev/VolGroup00/LogVol00
  VG Name               VolGroup00
  LV UUID               m2sx31-yglu-wjsG-yqq0-WPPn-3grk-n2LJBD
  LV Write Access       read/write
  LV Status             available
  # open                1
  LV Size               230.81 GB
  Current LE            7386
  Segments              1
  Allocation            inherit
  Read ahead sectors    0
  Block device          253:0

  --- Logical volume ---
  LV Name               /dev/VolGroup00/LogVol01
  VG Name               VolGroup00
  LV UUID               VR4EHJ-mpxW-uadd-CpTX-lEyz-2OEU-0TyYDn
  LV Write Access       read/write
  LV Status             available
  # open                1
  LV Size               1.94 GB
  Current LE            62
  Segments              1
  Allocation            inherit
  Read ahead sectors    0
  Block device          253:1


lvextend

lvextendとは

論理ボリュームに紐づくデバイスファイルを指定し、論理ボリュームのサイズを拡張する。


-l

指定した条件で、論理ボリュームを拡張する。

*例*

パーティションの空きサイズの100%を使用して拡張する。

$ lvextend -l +100%FREE <デバイスファイル名>

50G分の領域を拡張する。

$ lvextend -l +50G <デバイスファイル名>

*例*

あらかじめ、論理ボリュームに紐づくデバイスファイル名を確認する。

$ lvdisplay

--- Logical volume ---
LV Name               /dev/VolGroup00/LogVol00
VG Name               VolGroup00
LV UUID               m2sx31-yglu-wjsG-yqq0-WPPn-3grk-n2LJBD
LV Write Access       read/write
LV Status             available
# open                1
LV Size               230.81 GB
Current LE            7386
Segments              1
Allocation            inherit
Read ahead sectors    0
Block device          253:0

論理ボリュームのサイズを拡張する。

# 空きサイズの100%を使用して拡張する。
$ lvextend -l +100%FREE /dev/VolGroup00/LogVol00


mkdir

-p

複数階層のディレクトリを作成する。

$ mkdir -p /<ディレクトリ名1>/<ディレクトリ名2>


mkswap、swapon、swapoff

スワッピング方式

物理メモリのアドレス空間管理の方法の一種。

スワッピング方式


スワップ領域の作成方法

# 指定したディレクトリをスワップ領域として使用
$ mkswap /swap_volume
# スワップ領域を有効化
# 優先度のプログラムが、メモリからディレクトリに、一時的に退避されるようになる
$ swapon /swap_volume
# スワップ領域の使用状況を確認
$ swapon -s
# スワップ領域を無効化
$ swapoff /swap_volume


mount

mountとは

指定したデバイスファイルを、これに紐づくディレクトリ (マウントポイント) にマウントする。

$ mount -t /dev/sdb1 <マウントポイントとなるディレクトリ>


-t

マウントのファイル共有システムの種類を設定する。

種類によって、パラメーターの入力方法が異なる。

NFSによるマウントを実行する。

$ mount -t nfs <NFSサーバーのホスト名>:<マウント元ディレクトリ> <マウント先ディレクトリ>


nc:netcat

ncとは

指定したIPアドレス/ドメインに、TCPスリーウェイハンドシェイクを実行する。

curlコマンドではHTTPプロトコルしか扱えず、TCPスリーウェイハンドシェイクを検証したい場合 (例:Alpine) に役立つ。

$ nc <IPアドレス/ドメイン> <ポート番号>


-v

ログを出力しつつ、ncコマンドを実行する。

$ nc -v <IPアドレス/ドメイン> <ポート番号>

パケットに9000番ポートに送信する。

$ nc -v 127.0.0.1 9000

# 失敗の場合
nc: connect to 127.0.0.1 port 9000 (tcp) failed: Connection refused

# 成功の場合
Connection to 127.0.0.1 9000 port [tcp/*] succeeded!


-t

TCPスリーウェイハンドシェイクを実行する。

デフォルトで有効になっている。

$ nc -t <IPアドレス/ドメイン> <ポート番号>


httpで送信 (オプション無し)

echoコマンドと組み合わせることにより、HTTPでリクエストを送信できる。

$ echo -en "GET / HTTP/1.1\n\n" | nc -v <ドメイン> 80


nl

nlとは

標準出力に出力した文字に行数を追加する。

$ cat foo.txt | nl


od:octal dump

odとは

ファイルを8進数の機械語で出力する。

$ od <ファイルへのパス>


-Ad、-tx

ファイルを16進数の機械語で出力する。

$ od -Ad -tx <ファイルへのパス>


opsnssl

opsnsslとは

指定した暗号アルゴリズムを使用して、文字列を暗号化/復号化する。


enc

▼ -d

指定したアルゴリズムを使用して、文字列を復号化する。

$ opsnssl enc -aes-256-cbc -d -in encrypted.txt -out plane.txt

▼ -e

指定したアルゴリズムを使用して、文字列を暗号化する。

$ opsnssl enc -aes-256-cbc -e -in plan.txt -out encrypted.txt


list-cipher-algorithms

▼ list-cipher-algorithmsとは

使用できる暗号アルゴリズムの一覧を取得する。

$ openssl list-cipher-algorithms

AES-128-CBC
AES-128-CFB
AES-128-CFB1

...

RC4
RC4-40
RC4-HMAC-MD5

よく使用するAES-256アルゴリズムは、以下の通りである。

$ openssl list-cipher-algorithms | grep AES-256

AES-256-CBC
AES-256-CFB
AES-256-CFB1
AES-256-CFB8
AES-256-CTR
AES-256-ECB
AES-256-OFB
AES-256-XTS
AES256 => AES-256-CBC
AES-256-CBC
AES-256-CFB
AES-256-CFB1
AES-256-CFB8
AES-256-CTR
AES-256-ECB
AES-256-OFB
AES-256-XTS
aes256 => AES-256-CBC


x509

▼ -dates

証明書の有効期限を取得する。

$ openssl x509 -noout -dates -in foo.crt

notBefore=Dec  9 09:31:55 2020 GMT # 開始日
notAfter=Jan 10 09:31:55 2022 GMT  # 終了日


printenv

printenvとは

全ての環境変数を取得する。

$ printenv

また、特定の環境変数を取得する。

$ printenv VAR


ps: process status

psとは

プロセスを取得する。


-aux

▼ -auxとは

稼働しているプロセスの詳細情報を表示する。

代わりに、-efオプションを使用しても良い。

# 稼働しているプロセスのうち、指定した名前のプロセスを取得する。
$ ps -aux | grep <検索文字>

▼ -ef

稼働しているプロセスの詳細情報を表示する。

代わりに、-auxオプションを使用しても良い。

# 稼働しているプロセスのうち、指定した名前のプロセスを取得する。
$ ps -ef | grep <検索文字>


rm

-rf

トレイリングスラッシュなしの場合、ディレクトリ自体と中のファイルを再帰的に削除する。

$ rm -rf <ディレクトリ名>

トレイリングスラッシュとワイルドカード (*) ありの場合、ディレクトリ内のみを削除する。

$ rm -rf <ディレクトリ名>/*/*


sed

-i -e s/<置換前>/<置換後>/g

文字列を置換する。また、-iオプションで元のファイルを上書きする。findコマンドと組み合わせて、特定のファイルのみで実行できるようにすると良い。複数の置換を実行する場合は、-eオプションを並べる。

$ find ./* \
    -name "*.md" \
    -type f | xargs sed -i -e 's/、/、/g' -e 's/。/。/g'

スラッシュを含む文字列を置換する場合には、スラッシュをエスケープする必要である。

$ find ./* \
    -name "*.md" \
    -type f | xargs sed -i -e 's/foo\/bar/FooBar/g'

補足としてMacOSで-iオプションを使用する場合は、オプションの引数に空文字を渡す必要がある。

# MacOSの場合
$ find ./* \
    -name "*.md" \
    -type f | xargs sed -i '' -e 's/foo\/bar/FooBar/g'


<行数>s/^

ハット (^) が先頭であることを表す。

ファイルの指定した行の先頭にテキストを追加する。

# 1行目先頭に挿入しつつ、改行する
$ find ./* \
    -name "*.md" \
    -type f | xargs sed -i '1s/^/Foo\n\n/g'
# MacOSの場合
# 1行目先頭に挿入しつつ、改行する
$ find ./* \
    -name "*.md" \
    -type f | xargs sed -i '' '1s/^/Foo\n\n/g'


<行数>s/$

ドル ($) が先頭であることを表す。

ファイルの指定した行の末尾にテキストを追加する。

# MacOSの場合
# 2行目末尾に挿入しする
$ find ./* \
    -name "*.md" \
    -type f | xargs sed -i '' '2s/$/Foo/g'


条件

▼ OR条件

ブロックを使用し、OR条件を定義する。注意点として、;を使用して、ブロック内の処理の終了を宣言する必要がある。

# MacOSの場合
$ find ./* \
    -name "*.md" \
    -type f | xargs sed -i '' -e '/foo/! {/bar/! {/baz/! {/qux/! s/before/after/g;} ;} ;}'


service

アプリケーション系ミドルウェア (PHP-FPM、uWSGI) 、Web系ミドルウェア (Apache、Nginx) 、データ収集系エージェント (datadogエージェント、cloudwatchエージェント) などで様々なデーモンの操作に使用される。ただし、デーモン自体もコマンドを提供しているため、できる限りデーモンを使用する。


set

setとは

現在設定されているシェル変数の一覧を取得する。

$ set


-n

シェルスクリプトの構文解析を実行する。

$ set -n


-e

一連の処理の途中で0以外の終了ステータスが出力された場合、全ての処理を途中終了する。

$ set -e


-x

一連の処理をデバッグ情報として出力する。

$ set -x


-u

一連の処理の中で、未定義の変数が存在した場合、全ての処理を途中終了する。

$ set -u

-o pipefail

パイプライン (|) 内の一連の処理の途中で、エラーが発生した場合、その終了ステータスを出力し、全ての処理を途中終了する。

$ set -o pipefail


ssh:secure shell

-l、-p、<ポート番号>、-i、-T

事前に、秘密鍵の権限は『600』にしておく。tty (擬似ターミナル) を使用する場合は、-Tオプションをつける。

$ ssh -l <リモートサーバーのユーザー名>@<リモートサーバーのIPアドレス> -p 22 -i <秘密鍵へのパス> -T

*例*

$ ssh -l foo_user@10.0.0.1 -p 22 -i ./etc/foo.key -T


-vvv

ssh接続時にログを出力する。

# -vvv:ログを出力する
$ ssh -l <リモートサーバーのユーザー名>@<リモートサーバーのIPアドレス> -p 22 -i <秘密鍵へのパス> -T -vvv

*例*

$ ssh -l foo_user@10.0.0.1 -p 22 -i ./etc/foo.key -T -vvv

-L

リモートサーバーへの接続に踏み台サーバーでsshコマンドを実行する必要がある場合に、踏み台サーバー上でのsshコマンドをローカルマシン上で実行する。

ローカルマシンのポート番号に対する通信を、踏み台サーバーを介して、リモートサーバーのポートにフォワーディングする。

$ ssh -L20000:<リモートサーバー>:<ポート番号> <踏み台サーバーのユーザー名>@<踏み台サーバーのIPアドレス>

*例*

ローカルマシンの20000番ポートに対する通信を、踏み台サーバーを介して、リモートサーバーの3306番ポートにポートフォワーディングする。

$ ssh -L20000:10.0.0.1:3306 foo_user@192.168.0.1


~/.ssh/configファイル

設定が面倒なsshコマンドのオプションの引数を、~/.ssh/configファイルに記述しておく。

# サーバー1
Host <接続名1>
    User <サーバー1のユーザー名>
    Port 22
    HostName <サーバー1のホスト名>
    IdentityFile <秘密鍵へのパス>

# サーバー2
Host <接続名2>
    User <サーバー2のユーザー名>
    Port 22
    HostName <サーバー2のホスト名>
    IdentityFile <秘密へのパス>

これにより、コマンド実行時の値渡しを省略できる。

tty (擬似ターミナル) を使用する場合は、-Tオプションをつける。

# 秘密鍵の権限は、事前に『600』にしておく
$ ssh <接続名> -T


strace

straceとは

ユーティリティによるシステムコールをトレースする。

$ strace <任意のユーティリティ>


-c

システムコールごとに情報を取得する。

# curlコマンドのシステムコールをトレースする。
$ strace -c curl -s -o /dev/null https://www.google.com/

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 17.15    0.010642          76       139           mmap
 16.64    0.010329         120        86         2 read
 16.64    0.010326         137        75           rt_sigaction

...

  0.08    0.000048          24         2         2 access
  0.00    0.000000           0         1           execve
------ ----------- ----------- --------- --------- ----------------
100.00    0.062070                   584        12 total


-e

トレースの内容をフィルタリングし、取得する。

# ネットワークに関する情報のみを取得する。
$ strace -e trace=network curl -s -o /dev/null https://www.google.com/

socket(AF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0

...

sin_addr=inet_addr("*.*.*.*")}, [128->16]) = 0
getsockname(3, {sa_family=AF_INET, sin_port=htons(60714), sin_addr=inet_addr("*.*.*.*")}, [128->16]) = 0

+++ exited with 0 +++


-p

ユーティリティがすでに実行途中の場合、プロセスIDを指定してシステムコールをトレースする。

$ strace -p <プロセスID>


tail

tailとは

指定したファイルの最終行から数行を取得する。

全てを取得するcatコマンドとは異なり、巨大なファイル (例:ログ) の内容を取得するために使用する。

$ tail foo.log


-f

テキストのリアルタイムな追記に追従しながら、内容を取得する。

$ tail -f foo.log


tar

-C

解凍後のファイルの配置先を設定する。

補足として、配置先のディレクトリは事前に作成しておく必要がある。

$ mkdir /foo
$ tar -xvf foo.tar.gz -C /foo


-x

圧縮ファイルを解凍する。

$ tar -xvf foo.tar.gz


-f

圧縮ファイル名を指定する。

これを付けない場合、テープドライブが指定される。

$ tar -xvf foo.tar.gz


-v

解凍中のディレクトリ/ファイルの作成ログを取得する。

$ tar -xvf foo.tar.gz

./
./opt/
./opt/foo/
./opt/foo/bar/
./opt/foo/bar/install.sh
./opt/foo/bar/baz/
./opt/foo/bar/baz/init.sh


-g

圧縮ファイル (.gzip形式) を解凍する。

ただし、デフォルトで有効になっているため、オプションは付けないくても問題ない。

# gオプションはデフォルトで有効になっている
$ tar -xvf foo.tar.gz


timedatactl

timedatactlとは

タイムゾーンを操作する。


set-timezone

# タイムゾーンを日本時間に変更
$ timedatectl set-timezone Asia/Tokyo

# タイムゾーンが変更されたかを確認
$ date


top

topとは

各プロセスの稼働情報 (ユーザー名、CPU、メモリ) を取得する。

CPU使用率昇順に並べる。

$ top


-a

メモリ使用率昇順に取得する。

$ top -a


tr

trとは

指定した文字列をトリミングする。

*実行例*

#!/bin/bash

cat ./src.txt | tr "\n" "," > ./dst.txt


uname

uname

OSの情報を表示する。


-m

対応するCPUアーキテクチャを表示する。

# Intelの場合
$ uname -m

x86_64

# IntelとAMDは互換性があるため、AMD表記のCPUの場合があある
$ uname -m

amd64
# Armの場合
$ uname -m

arm64
# AMDの場合
$ uname -m

amd64


カレントディレクトリのシンボリックリンクを削除する。

*実行例*

$ unlink <シンボリックリンク名>


wc

-l

行数を数える。

echoの改行を無効化 (-n) して、行数としてカウントされないようにする。

$ echo -n diff | wc -l


wget

-o

ダウンロードの実行ログの出力先のファイルを指定する。

$ wget -o wget.log http://www.example.com/

実行ログは例えば以下の通りである。

$ cat wget.log

github.com (github.com) をDNSに問いあわせています... *.*.*.*

...

保存完了 [44368/44368]


-O

保存先のファイル名を設定する。

$ wget -O foo.gz http://www.example.com/

-の場合、標準出力に処理ログを出力することになり、ダウンロードは起こらない。

$ wget -O - http://www.example.com/


-q

ダウンロードの実行ログを取得しない。

$ wget -q http://www.example.com/


vim:Vi Imitaion、Vi Improved

vimとは

ファイルを開き、編集する。

*実行例*

$ vim <ファイルへのパス>