Linux コマンド基礎知識
SadServersを解くために必要な、トラブルシューティングに役立つLinuxコマンドをまとめています。
いきなり問題を解き始めても調べるばかりになってしまう…という方は、本記事でLinuxのコマンドを復習してから、SadServersの問題にとりかかってみてはいかがでしょうか。
※SadServers解説の作成と同時並行で、本記事を更新していきます。
私がまだ解説を作成していない問題の予習には使えない点、予めご了承ください。
また、汎用的なコマンドのみ記載しているため、Sadservers解説に登場するコマンドがすべて載っているわけではない点もご留意ください。
記載ルール
コマンドのうち、必須ではない引数やオプションは[]で囲んで表します。
$ command [オプション] 必須の引数 [必須ではない引数]
オプションは私がよく使うもののみご紹介します。
また、今回は評価式もオプションと表記します。
ディレクトリ・ファイル操作
コマンド | 用途 |
---|---|
pwd | カレントディレクトリを出力する |
cd | ディレクトリを移動する |
ls | ディレクトリ・ファイルを一覧出力する |
chmod | ディレクトリ・ファイルの権限を変更する |
chown | ディレクトリ・ファイルの所有者を変更する |
find | ディレクトリ・ファイルを検索する |
pwd
pwd
カレントディレクトリ(今自分が居るディレクトリ)を表示します。
$ pwd
コマンド例
$ pwd
/home/admin
cd
cd
ディレクトリを移動します。
ディレクトリを指定しない場合は、ホームディレクトリに移動します。
$ cd [オプション] [ディレクトリ]
コマンド例
$ pwd
/home/admin
$ cd ..
$ pwd
/home
$ cd /tmp
$ pwd
/tmp
$ cd
$ pwd
/home/admin
$ cd -
$ pwd
/tmp
ディレクトリは以下のように指定することもできます。
記号 | 意味 |
---|---|
~ | ホームディレクトリ |
. | 現在のディレクトリ |
.. | 親ディレクトリ |
- | ひとつ前に居たディレクトリ |
ls
ls
ディレクトリ・ファイルを一覧表示します。
ディレクトリを指定しない場合、カレントディレクトリのディレクトリ・ファイルを表示します。
$ ls [オプション] [ディレクトリ]
コマンド例
オプション | 内容 |
---|---|
-l | 詳細情報を表示する(慣れると見やすい) |
-h | ファイルサイズを見やすい形式で表示する(-lと併用) |
-d | 指定したディレクトリ自体の情報を表示する |
$ ls /etc
NetworkManager environment libaudit.conf pm shells
…
$ ls -l /etc
total 696
drwxr-xr-x 3 root root 4096 Sep 28 2021 NetworkManager
drwxr-xr-x 7 root root 4096 Sep 28 2021 X11
-rw-r--r-- 1 root root 2981 Sep 28 2021 adduser.conf
…
$ ls -lh /etc
total 696K
drwxr-xr-x 3 root root 4.0K Sep 28 2021 NetworkManager
drwxr-xr-x 7 root root 4.0K Sep 28 2021 X11
-rw-r--r-- 1 root root 3.0K Sep 28 2021 adduser.conf
…
$ ls -d /etc
/etc
$ ls -lhd /etc
drwxr-xr-x 71 root root 4.0K Apr 28 14:37 /etc
chmod(コマンド例未作成)
chmod
ファイル・ディレクトリのアクセス権限を変更します。
chmod パーミッション ファイル名orディレクトリ名
パーミッションの表し方についてはご自身で調べてみてください。
コマンド例
オプション | 内容 |
---|---|
-R | 再帰的に(=指定したディレクトリとディレクトリ内の全てファイルに対して)権限を変更する |
$
chown(コマンド例未作成)
chown
ファイル・ディレクトリの所有権を変更する
chown [オプション] [グループ]:[ユーザー] ファイル名orディレクトリ名
コマンド例
オプション | 内容 |
---|---|
-R | 再帰的に(=指定したディレクトリとディレクトリ内の全てファイルに対して)権限を変更する |
$
find
find
カレントディレクトリ以下のディレクトリ・ファイルを検索します。
$ find 検索ファイル名
コマンド例
オプション | 内容 |
---|---|
-type dまたはf | 検索対象がディレクトリかファイルか指定する。d:ディレクトリ f:ファイル |
-name 文字列 | 検索するディレクトリ・ファイル名を指定する。正規表現可。 |
$ find /etc -type f -name *ssh*
/etc/pam.d/sshd
/etc/default/ssh
/etc/ufw/applications.d/openssh-server
ファイル内容の表示
コマンド | 用途 |
---|---|
cat | ファイルの中身を出力する |
less | ファイルの中身を1ページずつ出力する |
head | ファイルの中身を先頭から抽出して出力する |
tail | ファイルの中身を末尾から抽出して出力する |
cat
cat
ファイルの中身を出力します。
複数のファイル名を指定した場合は、内容を繋げて出力します(cat
コマンドの本来の用途です)。
$ cat [オプション] ファイル名1 [ファイル名2]…
コマンド例
$ cat /etc/ssh/sshd_config
# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
…
ファイルの内容が長いと、画面が流れてしまって遡るのが大変なので、ファイル内容の確認にはcat
の代わりにless
を使うことが多いです。
cat
のファイル確認以外の用途は以下です。
-
cat
でファイル内容を出力し、パイプ(後述)を使って後のコマンドに処理させる - 作業前後のファイルを
cat
し、証跡としてログに残す
less
less
ファイルの中身を1画面ずつ出力します。ログを遡って調べるときに便利です。
ファイルの行数が非常に多い場合、cat
コマンドでは遡ったり該当箇所までたどり着いたりするのが大変ですが、less
コマンドなら、いろいろなオプションを使いながら効率的にファイルの中身を確認することができます。
$ less [オプション] ファイル名
コマンド例
$ less /etc/ssh/sshd_config
ファイルの中身を閲覧中に、以下のキーを入力してEnter
を押下すると、便利な操作が可能です。
キー | 用途 |
---|---|
f | 1画面進む |
b | 1画面戻る |
shift + G | ファイルの末尾に移動する(ログを調べるときに便利) |
/文字列 | 文字列を下方向に検索し、該当箇所にジャンプできる 次の該当箇所に行くには n 、前の該当箇所に行くにはN
|
v | 表示中のファイルをviエディターで編集する |
head
head
ファイルを先頭から抽出して表示します。デフォルトの抽出行は10行です。
複数のファイルを指定することもできます。
$ head [オプション] ファイル名1 [ファイル名2]…
表形式のファイルのヘッダーを確認するときなどに使います。
コマンド例
オプション | 内容 |
---|---|
-n 数字 | 先頭から任意の行数を抽出する |
-数字 | 先頭から任意の行数を抽出する(上のオプションの短縮形) |
$ head /etc/ssh/sshd_config
# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
$ head -3 /etc/ssh/sshd_config
# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
# This is the sshd server system-wide configuration file. See
tail
tail
ファイルを末尾から抽出して表示します。デフォルトの抽出行は10行です。
head
同様、複数のファイルを指定することもできます。
$ tail [オプション] ファイル名1 [ファイル名2]…
出力されたログの確認などに使います。
コマンド例
オプションはhead
コマンドと共通です。
オプション | 内容 |
---|---|
-n 数字 | 先頭から任意の行数を抽出する |
-数字 | 先頭から任意の行数を抽出する(上のオプションの短縮形) |
$ tail /etc/ssh/sshd_config
# override default of no subsystems
Subsystem sftp /usr/lib/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
ClientAliveInterval 120
$ tail /etc/ssh/sshd_config
# PermitTTY no
# ForceCommand cvs server
ClientAliveInterval 120
テキスト処理
コマンド | 用途 |
---|---|
vi | ファイルの内容を編集する |
echo | 文字列を出力する |
cut | ファイルの内容のうち、特定の列を出力する |
grep | ファイルの内容のうち、特定の文字列を含む行を出力する |
sort | ファイルの内容を並び替えて出力する |
uniq | ファイルの内容を、重複する行を削除して出力する |
vi
vi
ファイルの内容を編集します。
$ vi ファイル名
コマンド例
$ vi /etc/ssh/sshd_config
以下のキーを入力してEnter
を押下すると、便利な操作が可能です。
キー | 用途 |
---|---|
i | 編集する(編集モードの解除はEsc キー) |
yy | 1行コピー |
dd | 1行切り取り |
p | 1行下にペースト |
shift + G | ファイルの末尾に移動 |
/文字列 | 文字列を検索し、該当箇所にジャンプできる 次の該当箇所に行くには n 、前の該当箇所に行くにはN
|
:w | 保存 |
:q | 保存せず終了 |
:q! | 保存せず終了(強制) |
:wq | 保存して終了(よく使う) |
echo
echo
特定の文字列を標準出力する
$ echo
コマンド例
$ echo "1.2.3.4"
1.2.3.4
他にも、echo
コマンドは、シェル変数を表示する際にも使います。
シェル変数 | 用途 |
---|---|
$? | 直前に実行したコマンドの終了ステータス(0:成功 0以外:失敗) |
$$ | 現在のシェルのPID |
$ ./test.sh
$ echo $?
0
$ ./test; echo $? #一行で終了ステータスを確認する書き方もある
0
$ echo $$
123
cut
cut
$ cut [オプション] ファイル名
コマンド例
オプション | 用途 |
---|---|
-d | 区切り文字を指定する |
-f | 何列目を抽出するのかを指定する 複数の列の内容を連結する場合は、 ,(カンマ) で区切る |
$ cat test.txt
aaa 111
bbb 222
ccc 333
$ cut -d " " -f 1 test.txt
aaa
bbb
ccc
grep
grep
ファイルの中身のうち、正規表現に一致する行を抽出します。
$ grep 正規表現 ファイル名
コマンド例
オプション | 用途 |
---|---|
-n | 行番号を表示する |
-i | 大文字小文字を区別しない |
$ grep Password /etc/ssh/sshd_config
PasswordAuthentication no
#PermitEmptyPasswords no
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication, then enable this but set PasswordAuthentication
$ grep -n Password /etc/ssh/sshd_config
58:PasswordAuthentication no
59:#PermitEmptyPasswords no
80:# PasswordAuthentication. Depending on your PAM configuration,
84:# PAM authentication, then enable this but set PasswordAuthentication
$ grep -i Password /etc/ssh/sshd_config
#PermitRootLogin prohibit-password
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
#PermitEmptyPasswords no
# Change to yes to enable challenge-response passwords (beware issues with
# PasswordAuthentication. Depending on your PAM configuration,
# the setting of "PermitRootLogin without-password".
# PAM authentication, then enable this but set PasswordAuthentication
sort
sort
ファイルの内容を並び替えて出力します。
$ sort [オプション] ファイル名
コマンド例
オプション | 用途 |
---|---|
-n | 文字列を数値として並び替える |
-r | 逆順に並び替える |
-k 数字 | 並び替えに使う列を指定する |
-t 文字 | 区切り文字を指定する |
$ cat test.txt
1 a
2 b
3 c
10 d
20 e
30 f
$ sort -k 1 -t " " test.txt
1 a
10 d
2 b
20 e
3 c
30 f
$ sort -k 1n -t " " test.txt
1 a
2 b
3 c
10 d
20 e
30 f
uniq
uniq
ファイルの内容を、重複する行を削除して出力する。
$ uniq [オプション] ファイル名
コマンド例
オプション | 用途 |
---|---|
-c | 各行の前に出現回数を出力する |
-u | 重複していない行だけ出力する |
-d | 重複している行だけ出力する |
$ cat test.txt
aaa
aaa
aaa
bbb
bbb
ccc
ddd
$ uniq test.txt
aaa
bbb
ccc
ddd
$ uniq -c test.txt
3 aaa
2 bbb
1 ccc
1 ddd
$ uniq -u test.txt
ccc
ddd
$ uniq -cu test.txt
1 ccc
1 ddd
$ uniq -d test.txt
aaa
bbb
$ uniq -cd test.txt
3 aaa
2 bbb
コマンド結果の受け渡し
コマンド | 用途 | |
---|---|---|
> | コマンドの標準出力をファイルに出力(上書き)する | |
>> | コマンドの標準出力をファイルに出力(追記)する | |
| (パイプ) | コマンドの標準出力を次のコマンドに標準入力として渡す | |
| xargs | コマンドの標準出力を次のコマンドに引数として渡す |
>
>
コマンドの標準出力をファイルに出力(上書き)します。
$ コマンド > ファイル名
コマンド例
$ echo "1.2.3.4" > answer.txt
$ cat answer.txt
1.2.3.4
$ echo "5.6.7.8" > answer.txt
$ cat answer.txt
5.6.7.8
>>
>>
コマンドの標準出力をファイルに出力(追記)します。
$ コマンド >> ファイル名
コマンド例
$ echo "1.2.3.4" > answer.txt
$ cat answer.txt
1.2.3.4
$ echo "5.6.7.8" >> answer.txt
$ cat answer.txt
1.2.3.4
5.6.7.8
|(パイプ)
|(パイプ)
コマンドの標準出力を次のコマンドに標準入力として渡します。
$ コマンド | コマンド
それぞれのコマンドの絞り込むためのオプションを覚えるよりも、コマンドの出力をパイプしてgrep
で絞り込んだ方が、覚えるオプションが減って便利です。
コマンド例
$ ls | grep test
test.txt
$ ps aux | grep sshd
root 592 0.0 1.5 13348 7192 ? Ss 14:37 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
admin 1232 0.0 0.1 5264 704 pts/1 S<+ 14:53 0:00 grep sshd
xargs
xargs
コマンドの標準出力を次のコマンドに引数として渡します。
$ コマンド | xargs コマンド
コマンド例
$ ls
test1.txt test2.txt
$ ls | xargs cat
aaa
bbb
" | "と" | xargs "の使い分け
|
と| xargs
の使い分け
右のコマンドが、標準入力を待ち受けているなら|
、引数を待ち受けているなら| xargs
を使います。
- 標準入力を待ち受けているコマンドの例
- head
- tail
- grep
- 引数を待ち受けているコマンドの例
- cat
- find
|
、| xargs
でファイル名を渡すとどうなるか
catに$ ls
test1.txt test2.txt
$ head test*
==> test1.txt <==
aaa
==> test2.txt <==
bbb
|
で渡した場合
$ ls | cat
test1.txt
test2.txt
パイプだと、cat
の引数に渡されません。
そのため、ls
はls
の結果を出力し、cat
は何も渡されなかったことになります。
| xargs
で渡した場合
$ ls | xargs cat
aaa
bbb
一方、xargs
を使うと、cat
の引数にtest1.txt、test2.txtを渡してくれて、```cat test1.txt test2.txt"を実行してくれます。
プロセス関連
コマンド | 用途 |
---|---|
systemctl | サービスを操作する |
ps | OSで実行中のプロセスを表示する |
lsof | 開かれているファイルを表示する |
kill | プロセスを停止する |
systemctl
systemctl
サービスを操作します。
コマンド例
コマンド | 用途 |
---|---|
systemctl status サービス名 | サービスの状態を確認する |
systemctl start サービス名 | サービスを起動する |
systemctl stop サービス名 | サービスを停止する |
systemctl restart サービス名 | サービスを再起動する (設定ファイルを読み込ませたいときによく使う) |
$ systemctl status httpd
$ systemctl start httpd
$ systemctl stop httpd
$ systemctl restart httpd
ps
ps
OSで実行中のプロセスを一覧表示します。
$ ps [オプション] ファイル名
コマンド例
オプション | 用途 |
---|---|
a | 端末を持つすべてのプロセスを表示する |
x | 端末を持たないすべてのプロセスを表示する |
u | 見やすさ重視のフォーマットで出力する |
私はps aux
をよく使います。
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 2.1 100228 9900 ? Ss 14:36 0:02 /sbin/init
root 2 0.0 0.0 0 0 ? S 14:36 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 14:36 0:00 [rcu_gp]
[ ]
で囲まれているのは、カーネルプロセスです。
grep
も併用して、カーネルプロセスを除外する以下のコマンドも個人的によく使います。
$ ps aux | grep -v "\["
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 2.1 100228 9924 ? Ss 14:36 0:02 /sbin/init
root 195 0.0 2.7 64792 12856 ? Ss 14:36 0:00 /lib/systemd/systemd-journald
lsof
lsof
開かれているファイルを表示します。
$ lsof [オプション] [検索先]
コマンド例
$ lsof
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 259,1 4096 2 /
systemd 1 root rtd DIR 259,1 4096 2 /
systemd 1 root txt REG 259,1 1739200 3503 /usr/lib/systemd/systemd
…
$ lsof /home/*
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
gotty 562 admin cwd DIR 259,1 4096 272476 /home/admin
bash 678 admin cwd DIR 259,1 4096 272476 /home/admin
asciinema 682 admin cwd DIR 259,1 4096 272476 /home/admin
kill
kill
プロセスを停止します。
$ kill [オプション] プロセス番号
コマンド例
トラブルシューティングでは、強制終了が使えれば十分だと思います。
オプション | 用途 |
---|---|
-9 | 強制終了 |
$ kill -9 1000
ネットワーク関連
コマンド | 用途 |
---|---|
ping | パケットを送受信し、通信相手と通信できるか確認する |
curl | URLを指定してファイルを送受信する |
nmap | ポートをスキャンする |
ss | 「ソケット」の情報を出力する |
ping
ping
通信相手にパケットを送り、パケットが返ってくるか確かめることで、通信相手と通信が疎通しているか確認します。
$ ping 接続先IP or ホスト名
コマンド例
オプション | 用途 |
---|---|
-c | ping回数を指定する |
$ ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.025 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.035 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.038 ms
^C
--- localhost ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5128ms
rtt min/avg/max/mdev = 0.025/0.036/0.043/0.006 ms
$ ping -c 1 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.021 ms
--- localhost ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.021/0.021/0.021/0.000 ms
pingが通ることが分かったら、Ctrl + C
でコマンドを中断しましょう。
curl
curl
URLを指定してファイルを送受信します。
$ curl 任意のURL
コマンド例
$ curl 8.8.8.8
なお、8.8.8.8はgoogleが提供するパブリックDNSサービス(Google Public DNS)です。
nmap
nmap
任意のホストのポートをスキャンします。
ホストが開いているポートを確認したいときに使います。
$ nmap 接続先IP or ホスト名
コマンド例
$ nmap localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2024-04-28 15:34 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00015s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
8080/tcp open http-proxy
Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds
ss
ss
「ソケット」の情報を出力します。
$ ss [オプション]
コマンド例
コマンド | 用途 |
---|---|
-n | ポート番号をサービス名に変換しない |
-a | LISTEN、LISTEN以外のソケットを表示する |
-t | TCPソケットを表示する |
-u | UDPソケットを表示する |
-p | ポートを使用しているプロセスを表示する |
$ sudo ss -natup
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=596,fd=4))
tcp LISTEN 0 4096 0.0.0.0:8888 0.0.0.0:* users:(("docker-proxy",pid=1787,fd=4))
…
ファイルシステム関連
コマンド | 用途 |
---|---|
df | ディスクの空き容量を一覧表示する |
lsblk | ブロックデバイスを一覧表示する |
df
df
ディスクの空き容量を表示します。
$ df [オプション] [ディレクトリ]
コマンド例
コマンド | 用途 |
---|---|
-h | ファイルサイズを見やすい形式で表示する |
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 218M 0 218M 0% /dev
tmpfs 46M 348K 46M 1% /run
/dev/nvme0n1p1 7.7G 1.3G 6.1G 18% /
tmpfs 228M 12K 228M 1% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/nvme0n1p15 124M 11M 114M 9% /boot/efi
lsblk
lsblk
ブロックデバイスを一覧表示します。
df
コマンドと比べて、パーティションが見やすいです。
$ lsblk [オプション] [デバイス名]
コマンド例
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 8G 0 disk
├─nvme0n1p1 259:1 0 7.9G 0 part /
├─nvme0n1p14 259:2 0 3M 0 part
└─nvme0n1p15 259:3 0 124M 0 part /boot/efi
Discussion