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 ...]
基本的な使い方¶
文字列の表示に関する様々なユーティリティ (例:ls
、cat
、find
など) と組み合わせて使用する。
$ 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
-v¶
指定した文字を除外する。
$ cat foo.txt | grep -v 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 |
パケットフィルタリング型ファイアウォールとしてパケットを制限する。 | INPUT 、OUTPUT 、FORWARD |
nat |
NAPTルーターとして、DNAT処理する。 | POSTROUTING 、PREROUTING 、OUTPUT |
mangle |
特定のパケットのヘッダー情報を変更する。 | POSTROUTING 、PREROUTING 、INPUT 、OUTPUT 、FORWARD |
raw |
特定のパケットを処理せずにそのまま通過させる。 | PREROUTING 、OUTPUT |
security |
SELinuxを適用する。 | INPUT 、OUTPUT 、FORWARD |
▼ チェイン¶
通過するパケットに対する処理内容を定義する。
テーブルごとに使用できるチェインが異なる。
チェイン名 | 説明 |
---|---|
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)¶
指定したテーブル (filter
、nat
、mangle
、Raw
) を持つ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とは¶
ファイルには2
GBを超えてテキストを書き込めない。
そのため、ログを継続的にファイルに書き込む場合は、定期的に、書き込み先を新しいファイルに移行する必要がある。
ローテションされた過去のログファイルでは、ファイル名の末尾に最終日付 (例:-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 # ストレージ (AWS EBSボリュームのルートボリューム)
└─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 # ストレージ (AWS EBSボリュームの追加ボリューム)
lsof:List open file¶
-i¶
使用中のポートを全て取得する。
$ lsof -i
-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>
sysctl¶
sysctlとは¶
/proc/sys
ディレクトリ配下のカーネルに関するパラメータを設定する。
パラメーター | 説明 |
---|---|
net 系 |
ネットワークのパラメーター |
fs 系 |
ファイルシステムのパラメーター |
kernel 系 |
カーネルのパラメーター |
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
- https://zenn.dev/suzuki_hoge/books/2021-12-m1-docker-5ac3fe0b1c05de/viewer/2-arm#2.-uname-%E3%81%A7-cpu-%E3%81%AE%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B
- https://blog.future.ad.jp/small-talk-about-it-001-why-is-amd64-even-though-the-intel-cpu
unlink¶
unlinkとは¶
カレントディレクトリのシンボリックリンクを削除する。
*実行例*
$ 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 <ファイルへのパス>