📖

Linux コマンド基礎知識

2024/01/14に公開

SadServersを解くために必要な、トラブルシューティングに役立つLinuxコマンドをまとめています。
いきなり問題を解き始めても調べるばかりになってしまう…という方は、本記事でLinuxのコマンドを復習してから、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
find

find

カレントディレクトリ以下のディレクトリ・ファイルを検索します。

$ find 検索ファイル名

-nameオプションを使用すると、検索先のディレクトリを指定できます。

$ find 検索先 -name 検索ファイル名 [オプション] 

 

コマンド例

オプション 内容
-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が表示されます。

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
       

catに|| xargsでファイル名を渡すとどうなるか

$ ls
test1.txt  test2.txt
$ head test*
==> test1.txt <==
aaa

==> test2.txt <==
bbb

 

|で渡した場合

$ ls | cat
test1.txt
test2.txt

パイプだと、catの引数に渡されません。
そのため、lslsの結果を出力し、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ソケットを表示する
$ ss -natu
Netid State  Recv-Q Send-Q                     Local Address:Port             Peer Address:Port                                        Process                                        
udp   UNCONN 0      0                              127.0.0.1:323                   0.0.0.0:*                                                                                          
udp   UNCONN 0      0                                0.0.0.0:68                    0.0.0.0:*                                                                                          
udp   UNCONN 0      0        [fe80::826:b8ff:fe57:b653]%ens5:546                      [::]:*

ファイルシステム関連

コマンド 用途
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