schedule2019-03-18

初心者がCUIに慣れるためのLinuxコマンドのまとめ

黒い画面のCUIを操作することにかなり苦労した覚えがあります。 初心者がCUIに慣れるためのLinuxコマンドをまとめました。

コマンドの解説は多くありますが、操作の流れの中での解説はあまりみかけないので書いてみました。

途中のこのような部分はコラム的なTipsです。
(1度コラムを書いてみたかった)

説明等に間違いや誤字脱字がありましたら、twitter問い合わせからお知らせ下さると大変有難いです。

この記事の目標

Linuxに慣れていないエンジニアが「コンフィグのあのパラメータ変えといて」や「ログ確認してくれない?」と言った指示を一人で完遂できるところまでです。

具体的には以下のことを目指します。

  1. ルート権限 sudo
  2. ディレクトリの探索
  3. ファイルの確認
  4. ファイルの複製・削除・作成・移動
  5. ファイルの編集

そして、具体例としてApacheのログの確認とコンフィグの変更を行います。

熟練者から見るともっと良い方法があるかもしれません。 しかし、まずは一人で作業がこなせるようになることが大事です。

慣れてきたらもっといい方法を探して覚えれば大丈夫!!

ルート権限 sudo

UNIX(LinuxのOSの総称)では、重要なファイルの閲覧や操作に管理者権限が必要です。

sudoはルート権限レベルでプログラムを実行するためのコマンドです。

表記の先頭の$について

$ [コマンド] [オプション]

先頭の`は、画面の入力を受け付ける部分です。 root権限の時は`#`になります。 `から先のコマンドから入力してください。

また、コピペの防止だと個人的に解釈しています。 よくわからないコマンドは入力しないよう気を付けてください。

ディレクトリの探索

まずはディレクトリを移動して探索ができるようなコマンドです。

コマンド 意味
pwd 現在のディレクトリのフルパスを表示
cd ディレクトリを移動
ls ディレクトリ内のファイルを表示。よく似たllは情報も表示する

例 「確か"/var/log/"にApacheのアクセスログがあるから探してみて」

ログの確認を頼まれました。 まずは目的のaccess.logを探します。

ここで、ApacheはWEBサーバーです。サイトにアクセスがあるとaccess.logというファイルにログ(アクセス履歴)が残ります。

現在地を確認 pwd

迷ったらこれを打ちます。

$ pwd
/home/ubuntu

どうやらubuntuというユーザーのホームディレクトリからスタートしています。

"/var/log/"まで移動する cd

cd [ディレクトリパス]で移動します。

$ cd /var/log/
$ pwd
/var/log/

ディレクトリ名やファイル名はtabキーを押すと入力を補完してくれます。 例えばcd /vまで打ってからtabキーを押すとcd /var/まで補完します。

ひとつ下のディレクトリへ戻るときはcd ../とします。

$ cd /var/log/
$ cd ../
$ pwd
/var/

ディレクトリ内を確認しながらアクセスログを探す ls

lsで現在のディレクトリ内のファイルやディレクトリを表示できます。

$ ls
alternatives.log  apparmor  auth.log  redis   sysstat   unattended-upgrades
apache2           apt       bootstrap.log  dbconfig-common  postgresql

いっぱい出てきました。 apacheは頭文字aなので絞り込んでみます。

$ ls a*
apparmor  auth.log  apache2  apt 

*ワイルドカードといって以降の文字を曖昧にして検索できます。

確認するとapache2という名前のディレクトリがあり、これの中にありそうです。

ls [ディレクトリ名]でそのディレクトリ内を確認できます。

$ ls apache2/
access.log  error.log  other_vhosts_access.log
$ cd apache2
$ pwd
/var/log/apache2

access.logを見つけました!

/var/log/apache2というパスにあったようです。

ファイルの確認・表示

目的のファイルを見つけられたら、ファイルの中身を確認します。

コマンド 意味
cat ファイルを全て表示
tail ファイルの後方の数行を表示。
`cat grep [文字列]`

例 「アクセスログの"POST"でアクセスしてるデータ見せてくれない?」

WEBサイトのアクセスは基本GETの通信が多いかと思います。 その中でサーバへのリクエストがPOSTで来ているデータが見たいようです。

GETとPOSTの違いについて - Qiita

あまり良い例が浮かばなかった。 例としては微妙かもしれない。。。

ファイルを確認する cat

cat [ファイル名]でファイルの中身を確認できます。

$ cat access.log
64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846
64.242.88.10 - - [07/Mar/2004:16:06:51 -0800] "GET /twiki/bin/rdiff/TWiki/NewUserTemplate?rev1=1.3&rev2=1.2 HTTP/1.1" 200 4523
64.242.88.10 - - [07/Mar/2004:16:10:02 -0800] "GET /mailman/listinfo/hsdivision HTTP/1.1" 200 6291
64.242.88.10 - - [07/Mar/2004:16:11:58 -0800] "GET /twiki/bin/view/TWiki/WikiSyntax HTTP/1.1" 200 7352
64.242.88.10 - - [07/Mar/2004:16:20:55 -0800] "GET /twiki/bin/view/Main/DCCAndPostFix HTTP/1.1" 200 5253
64.242.88.10 - - [07/Mar/2004:16:23:12 -0800] "GET /twiki/bin/oops/TWiki/AppendixFileSystem?template=oopsmore&param1=1.12&param2=1.12 HTTP/1.1" 200 11382
64.242.88.10 - - [07/Mar/2004:16:24:16 -0800] "GET /twiki/bin/view/Main/PeterThoeny HTTP/1.1" 200 4924
64.242.88.10 - - [07/Mar/2004:16:29:16 -0800] "GET /twiki/bin/edit/Main/Header_checks?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851
64.242.88.10 - - [07/Mar/2004:16:30:29 -0800] "GET /twiki/bin/attach/Main/OfficeLocations HTTP/1.1" 401 12851
64.242.88.10 - - [07/Mar/2004:16:31:48 -0800] "GET /twiki/bin/view/TWiki/WebTopicEditTemplate HTTP/1.1" 200 3732
64.242.88.10 - - [07/Mar/2004:16:32:50 -0800] "GET /twiki/bin/view/Main/WebChanges HTTP/1.1" 200 40520

(省略)

どうやら、データが大量にあって追いきれませんでした。

ファイルの後方の数行を表示 tail

一番新しいログはファイルの末尾にあります。

tail [ファイル名]で後方の10行を表示して確認します。

$ tail access.log
10.0.0.153 - - [12/Mar/2004:12:23:41 -0800] "GET /dccstats/stats-hashes.1week.png HTTP/1.1" 200 1670
10.0.0.153 - - [12/Mar/2004:12:23:41 -0800] "GET /dccstats/stats-spam.1month.png HTTP/1.1" 200 2651
10.0.0.153 - - [12/Mar/2004:12:23:41 -0800] "GET /dccstats/stats-spam-ratio.1month.png HTTP/1.1" 200 2023
10.0.0.153 - - [12/Mar/2004:12:23:41 -0800] "GET /dccstats/stats-hashes.1month.png HTTP/1.1" 200 1636
10.0.0.153 - - [12/Mar/2004:12:23:41 -0800] "GET /dccstats/stats-spam.1year.png HTTP/1.1" 200 2262
10.0.0.153 - - [12/Mar/2004:12:23:41 -0800] "GET /dccstats/stats-spam-ratio.1year.png HTTP/1.1" 200 1906
10.0.0.153 - - [12/Mar/2004:12:23:41 -0800] "GET /dccstats/stats-hashes.1year.png HTTP/1.1" 200 1582
216.139.185.45 - - [12/Mar/2004:13:04:01 -0800] "GET /mailman/listinfo/webber HTTP/1.1" 200 6051
pd95f99f2.dip.t-dialin.net - - [12/Mar/2004:13:18:57 -0800] "GET /razor.html HTTP/1.1" 200 2869
d97082.upc-d.chello.nl - - [12/Mar/2004:13:25:45 -0800] "GET /SpamAssassin.html HTTP/1.1" 200 7368

行の中央にGETの文字があります。 これが、GETでアクセスしているログです。

つまり、ここがPOSTになっている行を探せば良さそうです。

tail -f access.log
オプション-fを付けると新しく書き込まれた行が逐次表示できる。 稼働中のサイトのテストなんかで役立ちます。
文字が流れていくのでハッカー気分も味合えます!

見終わったらCtrl + cで戻りましょう。

特定の文字列を含む行を表示する | grep

POSTの行だけ探さないといけません。 その時はcat [ファイル名] | grep [文字列]を入力してください。

$ cat access.log | grep POST
h24-71-249-14.ca.shawcable.net - - [07/Mar/2004:22:29:41 -0800] "POST /mailman/options/cnc_notice HTTP/1.1" 200 3533
h24-71-249-14.ca.shawcable.net - - [07/Mar/2004:22:30:08 -0800] "POST /mailman/options/cnc_notice HTTP/1.1" 200 13973
h24-71-236-129.ca.shawcable.net - - [09/Mar/2004:15:51:24 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 2182
h24-71-236-129.ca.shawcable.net - - [09/Mar/2004:15:52:09 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 2182
h24-71-236-129.ca.shawcable.net - - [09/Mar/2004:15:52:15 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597
h24-71-236-129.ca.shawcable.net - - [10/Mar/2004:11:19:32 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597
h24-71-236-129.ca.shawcable.net - - [10/Mar/2004:11:41:52 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597
10.0.0.153 - - [10/Mar/2004:12:02:59 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597
10.0.0.153 - - [10/Mar/2004:12:05:06 -0800] "POST /mailman/options/ppwc/ppwctwentynine@shaw.com HTTP/1.1" 200 14579
10.0.0.153 - - [10/Mar/2004:12:05:54 -0800] "POST /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 23169
10.0.0.153 - - [10/Mar/2004:12:07:07 -0800] "POST /mailman/admin/ppwc/members/add HTTP/1.1" 200 6762
10.0.0.153 - - [10/Mar/2004:12:07:25 -0800] "POST /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 24577
h24-71-236-129.ca.shawcable.net - - [11/Mar/2004:12:29:03 -0800] "POST /mailman/admindb/ppwc HTTP/1.1" 200 3407
h24-71-236-129.ca.shawcable.net - - [11/Mar/2004:12:29:27 -0800] "POST /mailman/admindb/ppwc HTTP/1.1" 200 1134

見事、POSTのログだけ抽出できました!

|パイプラインといってコマンドを繋ぐ役割をします。 grepは文字列を検索するコマンドです。

cat [ファイル名] | grep [文字列]の意味は、catで表示するファイルの中からgrepで一致する行だけに絞り込んでいることになります。

grepgrep [文字列] [ファイル名]としても使えますが、パイプラインを挟んだほうが使い勝手が良さそうです。
例えば、さらにIPアドレスで絞り込むにはこう書けます。

$ cat access.log | grep POST | grep 10.0.0.153
10.0.0.153 - - [10/Mar/2004:12:02:59 -0800] "POST /mailman/admin/ppwc HTTP/1.1" 200 19597
10.0.0.153 - - [10/Mar/2004:12:05:06 -0800] "POST /mailman/options/ppwc/ppwctwentynine@shaw.com HTTP/1.1" 200 14579
10.0.0.153 - - [10/Mar/2004:12:05:54 -0800] "POST /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 23169
10.0.0.153 - - [10/Mar/2004:12:07:07 -0800] "POST /mailman/admin/ppwc/members/add HTTP/1.1" 200 6762
10.0.0.153 - - [10/Mar/2004:12:07:25 -0800] "POST /mailman/admin/ppwc/members?letter=p HTTP/1.1" 200 24577

また、正規表現についても覚えるともっと便利に使いこなせます。

参考:grepでこういう時はどうする? - Qiita

access.logのサンプルはこちらを借りています。 その為、日付が2004年と古いです。

ファイルの複製・編集

コマンド 意味
cp ファイルをコピー
vi ファイルを編集

例 「 Apacheのポートを80から8080に変更しといて」

一般のWEBサーバーはHTTPのリクエストを80ポートで受け付けています。 開発環境や他のWEBサーバーが同居する場合、被らないように違うポート(8080や8081)などに変えることがあります。

ポートの設定ファイルは"/etc/apache2/ports.conf"にあることを教わったので、まずは確認してみます。

$ cd /etc/apache2/
$ cat ports.conf
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 80

<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

#はコメントです。

# Listen 80
Listen 8080

このように書き換えれば、8080ポートに変更できます。

ファイルの複製 cp

ファイルをいきなり書き換えてはダメです。 間違えて消した場合など復元が難しくなります。

バックアップをとってから編集してください。 ports.conf.orgという名前でバックアップを取ります。

cp [複製元ファイル] [複製先ファイル]でできます。

$ cd /etc/apache2/
$ cp ports.conf ports.conf.org
$ ls p*
ports.conf  ports.conf.org

これで、間違えてしまってもports.conf.orgを戻せば大丈夫です。

ファイルの編集 vim

ここから編集ですが、viは説明が長くなるので推敲します。

書き途中で読んでくださった方申し訳ない。

$ sudo vi ports.conf

参考

ファイルの作成・削除

コマンド 意味
cp ファイルをコピー
rm ファイルを削除
touch ファイルを作成

※ 削除については下記のコマンドは実行しないでください。全ディレクトリが消えます。

# rm -rf /*

OSによっては確認や

参考:rootで rm -rf /* したら - Shin x blog