2022/06/30
WEBの開発を行っていると、SSHターミナルソフトを使ってLinuxコマンドで操作することがよくあります。
ただ、プログラミングは慣れているけど、Linuxなどのサーバー周りは苦手という人が結構多かったりします。
今回はLaravelプログラマーがよく使うLinuxコマンドをまとめてみました。
一般ユーザでは権限がない場合はLinuxコマンドの前に「sudo」を頭につけます。
# スーパーユーザで実行
$ sudo cp php.ini php.ini.20210921
Index
- 基本コマンド(sudo・exit・shutdown・reboot・pwd・cd・ls・mkdir・rm・touch・cp・mv・chmod・chown・ln・grep)
- ファイルを閲覧する(cat・cat & grep・less・vi・tail)
- パッケージの管理(yum・apt-get)
- WEBからファイルをダウンロード(wget・curl)
- バージョンの確認(OS・PHP・MySQL)
- アプリケーションの起動(Apache・MySQL)
- curl(カール)コマンド
- 圧縮したアーカイブの作成と解凍・展開(tarコマンド)
- リダイレクションとパイプ(>>・>・|)
- キーペア [ 秘密鍵と共通鍵 ] 作成(ssh-keygen)
- コマンドの履歴を見る(history)
- PHPを実行
- コマンドのフルパスを表示(which)
- ローカル/リモート間のコピー(scp)
- 不正アクセス確認(lastb)
- SSHでログイン(ssh)
- 公開鍵をリモートサーバーに登録(ssh-copy-id)
- サービスの起動や停止、状態確認(systemctl)
- ファイアウォールの設定(firewall-cmd)
- ドキュメントルート所有者・権限変更(chown・chmod)
- 秘密鍵を一時的に保持(ssh-agent)
- Apacheのログ(生ログ)の確認方法
- php.ini のパスの確認方法
- Linuxのユーザ追加(useradd)
- システムのタイムゾーンを設定(timedatectl)
基本コマンド
sudo
コマンド、exit
コマンド、shutdown
コマンド、reboot
コマンド、pwd
コマンド、cd
コマンド、ls
コマンド、mkdir
コマンド、rm
コマンド、touch
コマンド、cp
コマンド、mv
コマンド、chmod
コマンド、chown
コマンド、ln
コマンド、grep
コマンド
sudo コマンド
sudoコマンドは、他のユーザーとしてコマンドを実行するコマンドです。よくroot(スーパーユーザー)にスイッチするときに使います。
# rootユーザに切り替え
# rootユーザのパスワードが求められる
$ su
# 引数に「-」を付けると、そのユーザーの環境変数(PATHなど)を引き継ぐ
$ su -
# 現在のユーザ名を表示
$ whoami
# 「wget」パッケージのインストールを root 権限で実行したい場合
$ sudo yum install wget
exitコマンド
ログアウトします。
# ショートカッキーは「Ctrl+D」
$ exit
shutdownコマンド
システムを安全に終了させるためのコマンド。
# 今すぐにシャットダウンさせる
$ shutdown -h now
# 再起動
$ shutdown -r now
rebootコマンド
再起動コマンド
# 基本的にrootユーザのみコマンド実行可能
$ sudo su
$ reboot
cdコマンド
他のディレクトリに移動する時に使います。
絶対パスで指定すると、自分がどのディレクトリにいても必ず移動できます。
なお、相対パスでの移動も可能。相対パスで指定する場合は、現在のディレクトリを起点に移動します。
$ pwd
/home/laraweb
$ cd /var/www
$ pwd
/var/www
~(チルダ)
~ は特殊な文字列で自分のホームに戻ります。
$ pwd
/home/laraweb/tutorial/app/Http
$ cd ~
$ pwd
/home/laraweb
lsコマンド
現在のディレクトリに存在するディレクトリやファイルを表示します。
# listの略
# ディレクトリを含むファイルリストを表示
# 中身を確認したいときに使う
$ ls
dir1 file.txt
# 更に詳細なリストを表示する
$ ls -l
# ls -l を更に略したもの
$ ll
mkdirコマンド
ディレクトリを作成します。
$ mkdir { ディレクトリ名 }
rmコマンド
ファイルやディレクトリを削除する時に使用します。
ファイルを削除したい場合
$ rm { ファイル名 }
ディレクトリを削除したい場合
$ rm -r { ファイル名 }
ディレクトリ内部の削除確認メッセージを飛ばす場合
$ rm -rf { ファイル名 }
touchコマンド
空のファイルを新規に作成します。
$ touch { ファイル名 }
# 実例
$ touch a.dat
既存ファイル名を指定すると、ファイルの更新日時が現在の時刻に変わります。
cpコマンド
ファイルをコピーする時に使います。
mvコマンド
ファイルを移動させます。
$ mv { 移動元 } { 移動先 }
リネームする際にも使用します。
例)file.txt を file_tmp.txt にリネーム
$ mv file.txt file_tmp.txt
正規表現も使えます。
例)「file*.txt」(※"file" とつくテキストファイル)を「dir1」へ移動
$ mv file*.txt dir1/
chmod コマンド
Linux は Windows よりもファイルやディレクトリの権限が厳しいかったりします。なので、何も考えずにファイルを作成すると見れない場合があります。その際に chmod で権限を与えます。
# 構文
$ chmod { パーミッション } { ファイル名/ディレクトリ名 }
# 例)test01.sh にすべての利用者に対してすべての権限を与える
$ chmod 777 work/test01.sh
アクセス権 | 8進数 |
---|---|
rwx | 7 |
rw- | 6 |
r-x | 5 |
r-- | 4 |
-wx | 3 |
-w- | 2 |
--x | 1 |
--- | 0 |
パーミッションの確認
現在のパーミッションは -l
オプションをつけた ls コマンドで見ることができます。
$ ls -l
ディレクトリ以下のファイルも全部変更
ディレクトリごとファイルの権限をまとめて変更するときには -R
というオプションをつけます。
# dir というディレクトリと、その中身のファイル全ての権限が変更できます
$ chmod -R 777 dir
chown コマンド
指定したファイルやディレクトリのユーザー所有権(所有者)やグループ所有権(グループ)を変更します。
# 書式
$ chown -R {所有者名} {ディレクトリ名}
# ユーザー所有権を「root」に変更
$ chown root file
# ユーザー所有権「root」グループ所有権「root」に変更
$ chown root:root file
ln コマンド
シンボリックリンクを張るときに使います。そこに存在しないファイルを、存在するように見せたりするコマンドです。デプロイ周りで使われることが多いです。
#--------------------------------------------------------------------------------------------------
# ドキュメントルートが「/home/ユーザー名/html」
# ドキュメントルートをLaravelプロジェクト名のフォルダの中になる「public」フォルダ以下を参照してほしい
#--------------------------------------------------------------------------------------------------
# もし、「html」フォルダにシンボリックリンクを貼る場合、名前を変更
$ cd /home/ユーザー名
$ mv html html_BAK
# 最後に「/」(スラッシュ)は入れないほうがいい
$ ln -s /home/ユーザー名/Laravelプロジェクト名/public /home/ユーザー名/html
# 相対パスでもOK(※個人的にはこっちの方がいい)
$ ln -s ./Laravelプロジェクト/public ./html
# シンボリックリンクを削除する場合
$ unlink /home/ユーザー名/html
grep コマンド
grepコマンドは前の処理結果の中で、指定した値を含む処理結果のみを表示する絞り込みコマンド。
## 構文
$ 処理 | grep 値
## 場所を確認
$ php -i | grep php.ini
Configuration File (php.ini) Path => /etc
## ファイルの存在確認
$ ls /etc | grep php.ini
php.ini.default
## ファイルの作成
$ cp /etc/php.ini.default /etc/php.ini
ファイルを閲覧する(cat・cat & grep・less・vi・tail)
cat
コマンド、cat
コマンド&grep
コマンド、less
コマンド、vi
コマンド、tail
コマンド
catコマンド
ファイルの内容を全て表示することができます。
$ cat FooController.php
ファイルを作成
$ cat > { 新規ファイル名 }
Hello,World. #ファイル内容を入力
# Ctrl + Dで終了
catコマンド&grepコマンド
catコマンドはパイプ「|」を使ってgrepコマンドと組み合わせて使うことができます。
# sample.txt内の「target」という文字列を含む行を検索して表示
$ cat sample.txt | grep target
less コマンド
テキストファイルの中身をターミナル上でスクロールしながら閲覧できるコマンドです。
ファイルを閲覧する場合は通常こちらのコマンドを使います。
ログファイルの閲覧もこのコマンドを使います。
$ less hoge.txt
無条件で指定するべきオプション
オプション | 説明 |
---|---|
-N | 行番号が左につきます。かなり見やすくなるのでおススメです。 |
-M | 現在の行や行数に対するパーセントが表示されます。現在位置が把握しやすくなります。左下に表示されます。 |
-i | 検索時に全部小文字で入力したときだけ、大文字・小文字を無視して検索します。 |
コマンドをまとめると、以下になります。
$ less -iNM hoge.txt
# laravel のエラーログを確認する場合
$ less -iNM storage/logs/laravel-2019-04-25.log
less起動中に使うコマンド
オプション | 説明 |
---|---|
q | lessコマンドを終了 |
SPACE | 1画面分下にスクロール |
b | 1画面分上にスクロール |
j | 次の行 |
k | 前の行 |
gg | 先頭に飛ぶ |
G | 末尾に飛ぶ |
/{ 検索文字列 } | { 検索文字列 }を検索します。(n で次へ、N で前へ)検索ヒットした箇所は反転します。 |
リアルタイムに更新されるデータを見る
less 起動中に shift + f
ctrl + c でキャンセルします。
tail
コマンドと違って、キャンセルしてまたless内で検索かけたり、ログを遡ったりできます。
vi コマンド
vi とは Linux を含む Unix ベースの OS で利用できるテキストエディタのことです。主にファイルを編集する時に使うコマンドです。
$ vi { ファイル名 }
vi には コマンドモード
と インサートモード
があり、はじめはコマンドモードで起動されます。
インサートモードへ変更
キーボードの i(insert)を押すと編集モードに移行します。
(※他の方法でも移行できますが、ここでは割愛します。)
コマンドモードへ変更
escキー を押下するとコマンドモードへ戻ります。
vi エディタ利用中に、なぜか「ESC」キーが調子悪くなったので、その際に利用したショートカット。
下記のショートカットキーを利用すれば、インサートモードからノーマルモードに「ESC」キーを利用せずに戻ることが可能。
viを閉じる
[ コマンドモード ] の状態で以下を実行。
:wq | 保存して終了 |
:q! | 編集内容を保存したくない場合 |
行番号の表示
:set number | vi もしくは vim に行番号が表示されます。 |
検索
less や man コマンド内でも利用する標準操作です。コマンドモードで操作します。
キー入力 | 動作 |
---|---|
/<文字列> | 文字列を検索する(順方向) |
?<文字列> | 文字列を検索する(逆方向) |
n | 順方向へ検索する |
N | 逆方向へ検索する |
削除
viコマンドで最もつまづくのが文字の削除です。入力モードのまま、上下左右へのカーソルの移動、delete、BackSpaceなどの文字をしようとすると、想定外の文字が入力されます。
1)「escキー」でコマンドモードへ変更
2)上下左右のカーソル移動後、「x」キーで一文字削除
ファイルの内容を変更するのではなく、閲覧、確認するだけなら次のコマンドを使用します。
cat | 保存して終了 |
more | 編集内容を保存したくない場合 |
less | ファイルの内容を表示する。上下カーソルキーでスクロールができる。 |
tail コマンド
tail コマンドはファイルの最終行から数行を表示するコマンドです。
標準では10行を表示します。
Apacheのアクセスログを見るのによく利用します。
# 構文
[root@example ~]# $tail ファイル名
# 例)アクセスログ
[root@example ~]# $tail -f /var/log/httpd/access.log
オプション | 解説 |
---|---|
-f | ファイルの追記を監視する |
パッケージの管理(yum・apt-get)
RedHat系(Amazon Linux、CentOS)→ yumコマンド
Debian系(Ubuntu)→ apt-getコマンド
yum
# アップデート可能なインストール済みのパッケージを一覧表示
$ yum check-update
# OSのアップデート
$ yum update
#-------------------------
# パッケージのインストール
#------------------------
# 構文
$ yum install パッケージ名
# 半角スペース区切りで複数パッケージをインストールすることも可
$ yum install パッケージ1 パッケージ2
# 実例「Apache」をインストールする
# CentOS では httpd は Apache のことを指す
$ yum install httpd
#-------------------------
# その他
#------------------------
# パッケージの詳細情報を確認
$ yum info mysql-community-server
# パッケージのアップデート
$ yum update httpd
# パッケージのアンインストール
$ yum remove httpd
#-------------------------
# リポジトリを指定してインストール
#
# mysqlやphpなどはyumのデフォルトのリポジトリでは古い
# remiなど別のリポジトリからインストールする
#
#------------------------
# リポジトリの指定には、「enablerepo」オプションを使う
$ yum install -enablerepo=リポジトリ パッケージ1 パッケージ2 ...
# PHPのインストール PHPの拡張パッケージもあわせて導入
$ yum install --enablerepo=remi,remi-php74 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-json php-mysqlnd php-common php-cli php-imap php-opcache
#-------------------------
# ローカルのrpmパッケージをインストール
#------------------------
# ローカルにある RPM パッケージも yum を使って依存性を解決しながら、インストールできます
$ yum localinstall RPMファイルパス
# MySQL Yum リポジトリの追加
$ yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
apt-get
### アプリ(Node.js)のインストール
# sudoコマンドをつけてroot権限で実行します
# パッケージを管理しているDB(パッケージマネージャ)を更新して、最新の状態にする
# パッケージの更新自体はしない
$ sudo apt-get update
# Node.jsをインストール
$ sudo apt-get install nodejs
# npm(パッケージの管理を行える)をインストール
$ sudo apt-get install npm
# ワンラインでも可能
$ sudo apt-get install nodejs npm
# パッケージの削除(設定ファイルは残る)
$ sudo apt-get remove nodejs npm
# パッケージの削除(設定ファイルも)
$ sudo apt-get purge nodejs npm
# インストールされているパッケージを全更新
$ sudo apt-get upgrade
WEBからファイルをダウンロード(wget・curl)
wget
wget コマンドは、WEBサーバーからコンテンツを取得するためのコマンドです。
wget { ファイルのURL }
でWEBサーバーからコンテンツを取得します。
$ wget http://hogemoge.com/example.zip
wgetコマンドは CentOS などではデフォルトでインストールされていない場合があります。インストール自体は難しくありませんが、代わりに curl
(カール)を使うことができます。
curl
curl コマンドも、ファイルをダウンロードしたりアップロードしたりするためのコマンドです。最近のLinuxディストリビューションではデフォルトでインストールされています。
curl { ファイルのURL }
でWEBサーバーからコンテンツを取得します。
# composerのインストール
$ curl -sS https://getcomposer.org/installer | php
-sS
のオプションは「進捗は表示されないけどエラーは表示する」という意味です。
バージョンの確認(OS・PHP・MySQL)
OS
$ grep -H "" /etc/*version ; grep -H "" /etc/*release
# 以下のコマンドでもOK
$ cat /etc/*release
$ cat /etc/*version
PHP
$ php -v
$ php --version
MySQL
#-------------------------------------------------------------
# SQLの場合、大抵は「クライアント」と「サーバ」とで分かれている
#-------------------------------------------------------------
# mysql はクライアント
$ mysql --version
# mysqld はサーバ
# 通常はこっちのバージョンを確認する
$ mysqld --version
# mysqに接続し、version関数を利用してもOK
mysql> select version();
データベースサーバープログラム。ディスクまたはメモリ内の実際のデータベースへのアクセスを管理する。
【 MySQLクライアント 】
サーバと通信してサーバが管理するデータベース内の情報を操作するためのプログラム。
アプリケーションの起動(Apache・MySQL)
Apache
#---------------------------
# Ubuntu の場合
#---------------------------
[root@example ~]# service apache2 restart
#---------------------------
# CentOS7 の場合
#---------------------------
# Apache の状態の確認
[root@example ~]# systemctl status httpd
# Apache を起動
[root@example ~]# systemctl start httpd
# Apache を再起動
[root@example ~]# systemctl restart httpd
# Apache を自動で起動
[root@example ~]# systemctl enable httpd
# Apache の停止
[root@example ~]# systemctl stop httpd
#---------------------------
# CentOS6まで
#---------------------------
# Apache の状態を確認する
[root@example ~]# service httpd status
[root@example ~]# /etc/init.d/httpd status
# Apache を起動する
[root@example ~]# service httpd start
# Apache を停止する
[root@example ~]# service httpd stop
# Apache を再起動する
[root@example ~]# service httpd restart
# サービス(Apache)の自動起動を有効にする
[root@example ~]# chkconfig httpd on
MySQL
#---------------------------
# CentOS7 の場合
#---------------------------
# MySQL の状態の確認
$ systemctl status mysqld
# MySQL を起動
$ systemctl start mysqld
# MySQL を自動で起動
$ systemctl enable mysqld
# MySQL の停止
$ systemctl stop mysqld
#---------------------------
# CentOS6まで
#---------------------------
# MySQL の起動
$ service mysqld start
# MySQL の停止
$ service mysqld stop
# MySQL の再起動
$ service mysqld restart
# MySQL の確認
$ service mysqld status
# MySql の自動起動
$ chkconfig mysqld on
curl(カール)コマンド
基本形
アクセスできたかどうかの確認だけならば、わざわざブラウザを開かずとも黒い画面から curl
コマンドだけで確認が可能です。
# 基本形
$ curl http://127.0.0.1:8080/
GET や POST を指定する場合
# GET送信
$ curl -X GET http://loclhost:8080/test?name=Taro
# POST送信
$ curl -X POST -d 'name=Taro' http://localhost:8080/test
-X
は GET や POST を指定します。
-d
は POST のデータを指定します。形式は 'value=name' です。
HTTPヘッダを指定
$ curl -X POST -H 'Content-Type: application/json' -d '{"name" : [ "Yamada" , "Taro" ] , "Age" : 36 }' http://localhost:8080/
HTTP ヘッダを指定します。ユーザエージェントとかリファラとか
圧縮したアーカイブの作成と解凍・展開(tarコマンド)
Linuxでは、複数のファイルをまとめて1つのアーカイブファイルとして作成するには「tar」コマンドを使用します。
圧縮したアーカイブを作成
# 構文
$ tar cvzf アーカイブ名 ファイル1 ファイル2…
# 例)test01.txt と test02.txt を test.tar.gz で圧縮アーカイブを作成
$ tar cvzf test.tar.gz test01.txt test02.txt
実演
以下は、tarコマンドで使用する主なオプションです。
オプション | 説明 |
---|---|
c | 新しいtarファイルを作る(create) |
v | 圧縮・解凍状況を表示(基本的にvは指定しなくてもOK) |
f | 圧縮ファイル名指定(filename) |
z | gzipの圧縮処理を行う |
t | アーカイブファイルの一覧を表示する |
x | アーカイブを展開 |
p | パーミッション保持したまま |
tarコマンドでパーミッション保持したまま圧縮/解凍するには「P」オプションをつける。Laravelのプロジェクト丸ごと移動させるときに便利です。
(※解凍時はroot権限でないとパーミッションを持ったまま解凍できない模様。)
# パーミッション保持したまま圧縮
[root@example ~]# tar cvzfp xxx.tar.gz ディレクトリ名
# パーミッション保持したまま解凍
[root@example ~]# tar xvzfp xxx.tar.gz
圧縮したアーカイブを解凍・展開する
# 構文
$ tar xvzf アーカイブ名
# 例)アーカイブ test.tar.gz を解凍・展開
$ tar xvzf test.tar.gz
実演
リダイレクションとパイプ(>>・>・|)
Unix、Linuxのコマンドで、標準出力の結果を何かに渡したいときには、リダイレクションである「>」「>>」やパイプ「|」をよく使います。
リダイレクション
リダイレクションは、標準出力をテキストファイルに渡したいときに使用します。
「>>」リダイレクション
ファイルへの追記するときに使います。
# sample.list に追記
$ echo 3 tarou tarou@sample.com >> sample.list
$ cat sample.list
1 Ichiro ichiro@sample.com
2 Jiro jirosample.com
3 tarou tarou@sample.com
「>」リダイレクション
ファイルへの上書きをするときに使います。
# sample.list を上書き
$ echo 3 tarou tarou@sample.com > sample.list
$ cat sample.list
3 tarou tarou@sample.com
パイプ
パイプは、標準出力をコマンドに渡したいときに使用します。
形式
# コマンド1の結果をコマンド2へ渡して結果を出力します
$ コマンド1 | コマンド2
例)ps aux
で実行中のプロセスを出力し(ターミナルには出力されない)、その中からキーワードhttpd
にマッチする行を出力する
$ ps aux | grep httpd
キーペア [ 秘密鍵と共通鍵 ] 作成(ssh-keygen)
GitのリモートリポジトリとSSH接続させるときに使います。
# -f は鍵の名前を指定
# -t は鍵の種類を指定(rsa、dsa、ecdsa、ed25519)
# -b は鍵の暗号化強度
$ ssh-keygen -f client_rsa -t rsa -b 2048
# -C はコメント
# GitLabではコメントに登録メールアドレスを入れないと
# 「Permission denied」が出るケースもある
$ ssh-keygen -C "login@foobar.com" -t rsa -f client_rsa
$ ls
client_rsa client_rsa.pub
# この後、公開鍵をリモートサーバーに登録する
$ ssh-copy-id -i ~/.ssh/client_rsa.pub admin@192.168.1.100
.pub が名前についていない方(client_rsa)は秘密鍵です。秘密鍵はクライアント側に保存。
コマンドの履歴を見る(history)
#-----------------------------
# lessコマンドと組み合わせて使う
#-----------------------------
$ history | less
#-----------------------------
# 特定のパターンを含むコマンド
#-----------------------------
# 「docker」を含むコマンドだけを抽出
$ history | grep docker
# それでも出力件数が多い場合
$ history | grep docker | less
#-----------------------------
# 直前のコマンドだけに絞り込む
#-----------------------------
# デフォルトは10行
$ history | tail
# 件数を指定する場合
$ history | tail -20
「less」コマンド中に使える操作
コマンド | 説明 |
---|---|
SPACEキー | 1画面スクロール |
bキー | 1画面逆スクロール |
gキー | 先頭に移動 |
Gキー | 末尾に移動 |
/検索ワード | 文字列検索 |
PHPを実行
ちょっとしたPHPをコマンドラインから実行
# ファイルに書いたPHPを実行
$ php /path/to/php/file.php
# phpコマンドのrオプションでコマンドラインに書いたphpを実行できる
$ php -r 'echo "Hello world!",PHP_EOL;'
Hello world! ← 実行結果
# 現在日時入りのメールを送る
$ php -r "mail('test@exmaple.com', 'test', date('Y-m-d H:i:s') . 'メールを送ります');"
# wgetコマンドっぽいことをする
$ php -r "file_put_contents('test.html', file_get_contents('https://www.laraweb.net/'));"
# MySQLに接続ができるか確認する(Trueが返ってくれば接続OK)
$ php -r "var_dump(mysql_connect('host', 'user', 'password'));"
コマンドのフルパスを表示(which)
ローカル/リモート間のコピー(scp)
リモートマシンとローカルマシン、あるいはリモートマシン同士でファイルのコピーする際に使用するLinuxコマンドです。
通信には
ssh
を使用します。
#----------------------------------------------
# ローカルからリモートにコピー
#----------------------------------------------
# 【例】a.txtをローカルからリモートの/remote/directoryにコピーする場合
$ scp a.txt usernmae@remote.example.com:/remote/directory
# ディレクトリごとコピー
# リモートの「directory」直下に「dir」ディレクトリが作成される
$ scp -r /local/dir usernmae@remote.example.com:/remote/directory
### 公開鍵認証を使ってSCP ###
# 構文
$ scp -i 秘密鍵 送りたいファイル名 SSHアカウント@ホスト名:送信先リモートのパス
$ scp -i ~/.ssh/user/deploy.pem index.html deploy@remote.example.com:/var/www/yourdomain/httpd
#----------------------------------------------
# リモートからローカルにコピー
#----------------------------------------------
# 【例】リモートの/remote/directory/a.txtをローカルの/local/directoryにコピーする場合
$ scp username@remote.example.com:/remote/directory/a.txt /local/directory/
### 公開鍵認証を使ってSCP ###
# 構文
$ scp -i 秘密鍵 SSHアカウント@ホスト名:コピーしたいファイル名 受取先リモートのパス
$ scp -i ~/.ssh/user/deploy.pem deploy@remote.example.com:/var/lib/mysql-files/favorite.csv /c/sqldump
実演
不正アクセス確認(lastb)
専用サーバー、仮想専用サーバー(VPS)、自宅サーバーなどを運用していると、ほぼ必ず目にする不正アクセス。
確認するには
lastb
コマンド。ログインに失敗した履歴を閲覧できます。
# root権限で実行しないと "Permission denied" になります。
$ sudo lastb
# 件数を絞る
$ lastb -10
実演
解決策
SSHデフォルトのポート番号(22)を変えると、かなりの確率でなくなります。
# root権限で実行しないと編集できません。
$ sudo vi /etc/ssh/sshd_config
:
# 任意の空きポート番号を指定する
# WELL KNOWNポート番号( 0 ~ 1023 )とREGISTERDポート番号( 1024 ~ 49151 ) を避ける
# 基本的に空いている49152 ~ 65535 で指定するといい
Port 54321
:
# 設定ファイル変更後は sshd を再起動
# Ubuntuの場合
$ sudo /etc/init.d/ssh restart
SSHでログイン(ssh)
# IPアドレスを指定してログイン
$ ssh 192.168.1.100
# ホスト名(example.com)を指定してログイン
$ ssh example.com
# ユーザ名(admin) + IPアドレスを指定してログイン
$ ssh admin@192.168.1.100
# ユーザ名(admin) + ホスト名(example.com)を指定してログイン
$ ssh admin@example.com
# 秘密鍵を指定してログイン
$ ssh -i 秘密鍵ファイルのパス ユーザー名@IPアドレス
# 実例
$ ssh -i ~/.ssh/client_rsa admin@192.168.1.100
#パスワードの変更
# SSHでログイン後、以下のコマンドを入力
# その後、現在のパスワード → 新しいパスワードを入力
$ passwd
パスワードの変更(実演)
公開鍵をリモートサーバーに登録(ssh-copy-id)
ローカルで生成した公開鍵をリモートサーバーに登録する方法です。
# -iオプションで任意の公開鍵を指定
$ ssh-copy-id -i (公開鍵) (SSHアカウント@接続先のIPアドレス)
# 実例
$ ssh-copy-id -i ~/.ssh/client_rsa.pub admin@192.168.1.100
サービスの起動や停止、状態確認(systemctl)
systemctl は systemd を操作するコマンドです。
linux のシステムとサービスを管理するデーモンです。RHEL7、CentOS7、Amazon Linux2 などは、サービスの管理に systemd が使われています。
#-----------
# 書き方
#-----------
$ systemctl コマンド ユニット名.service
# 末尾の.service は省略可
$ systemctl コマンド ユニット名
#---------------------------------
# SSHサーバーである sshd を例にする
#---------------------------------
# サービスのステータス確認
$ systemctl status sshd
# サービスの起動
$ systemctl start sshd
# サービスの再起動
$ systemctl restart sshd
# サービスの停止
$ systemctl stop sshd
# サービスの自動起動を有効
$ systemctl enable sshd
# サービス自動起動を無効
$ systemctl disable sshd
ファイアウォールの設定(firewall-cmd)
firewall-cmd
はファイアウォールの設定を行うコマンドです。
CentOS7 では、ファイアウォールの設定コマンドとして firewalld を使います。CentOS6 までは iptables でしたが、CentOS7 からはデフォルトのファイアウォールコマンドが変更になっています。
Ubuntu →
ufwコマンド
openSUSE →
SUSEfirewall2コマンド
ルール | ルールの保存先 |
---|---|
ランタイムルール | ルールはメモリ上に保存される。firewalldをリスタートすると消える |
パーマネントルール | ルールはファイル(/etc/firewalld/zones配下)に保存される。firewalldをリスタートすると、ファイルからルールが読み込まれメモリに展開される。 |
# ファイアウォールが起動中かどうかを確認するコマンド
$ firewall-cmd --state
# 現在のファイアウォール設定を確認する
$ firewall-cmd --list-all
# 設定の再読み込み
$ firewall-cmd --reload
# ファイアウォールの起動
$ systemctl start firewalld
# ファイアウォールの停止
$ systemctl stop firewalld
# ファイアウォールの再起動
$ systemctl restart firewalld
#-----------------------------------
# ファイアウォールに http 通信を許可
#-----------------------------------
# -add-service=http で、httpサービスが追加される
# -zone=public は、ゾーンとしてpublicを使う設定(お約束)
# -parmanetは変更を継続的に適用するためのオプション
# OS再起動後も設定内容は持続される
$ firewall-cmd --add-service=http --zone=public --parmanent
# 設定を反映
$ firewall -cmd --reload
# 設定状態を確認
$ firewall -cmd --list-all
# firewall-cmd に指定できるサービス名称の一覧確認
$ firewall -cmd --get-services
ドキュメントルート所有者・権限変更(chown・chmod)
Apache をインストールするとデフォルトでは /var/www/html の場所が HTML を設置するディレクトリ(ドキュメントルート)になります。
ただ、書き込み権限がrootユーザーのみなので、apacheユーザーと一般ユーザーでも書き込みできるように、権限を変更してあげます。
#ドキュメントルートまで移動
$ cd /var/www
#--------------------------
#所有者・権限を変更
#--------------------------
#htmlディレクトリの所有者をapacheに
#グループを一般ユーザー(例ではlaraweb)に
$ chown apache:laraweb html
#権限を変更
#所有者とグループの権限を全部OKにする
$ chmod 775 html
実演
秘密鍵を一時的に保持(ssh-agent)
ssh-agent を起動して秘密鍵を登録しておけば、 ssh コマンドを実行した際に自動的に秘密鍵を適用して認証処理を行ってくれます。
パスフレーズの入力は、秘密鍵の登録時に一度行うだけで済みます。
# ssh-agent の起動
$ eval `ssh-agent`
# 秘密鍵を ssh-agent に追加
$ ssh-add 秘密鍵へのファイルパス
# 実例
$ ssh-add ~/.ssh/gitlab_rsakey
# 登録されている鍵の公開鍵一覧を表示
$ ssh-add-l
# 登録されている鍵を削除
$ ssh-add -d 秘密鍵へのパス
実演
Apacheのログ(生ログ)の確認方法
Apache のログの設置場所は、/etc/httpd/conf/httpd.conf
に書かれています。
# httpdディレクトリは権限がrootユーザになっている
$ sudo vim /etc/httpd/conf/httpd.conf
vim で開き、検索コマンドで検索します。
検索コマンドに、/CustomLog
(アクセスログ)と入力。
エラーログを記述している箇所を見る場合は /EddorLog
と入力。
小文字の n キー・・・順送り
大文字の N キー・・・逆送り
以下のように見つけることができます。
恐らく大体は以下のように設定されています。
エラーログ:/var/log/httpd/error_log もしくは /var/log/apache2/error_log
ログの確認するコマンドは、lessコマンドが一般的です。
#------------------------------
# エラーログを表示
#------------------------------
$ less /var/log/httpd/error_log
$ less /var/log/apache2/error_log
#-----------------------------
# リアルタイムでログを確認
#-----------------------------
$ tail -f /var/log/apache2/error_log
$ tail -f /var/log/apache2/access_log
q キー・・・lessコマンドの終了
/ キー・・・検索(※viと同じ)
n キー・・・順送り
access_log … アクセスログ
error_log … エラーログ
ssl_access_log … SSLアクセスログ
ssl_error_log … SSLエラーログ
ssl_request_log … SSLアクセスログ
php.ini のパスの確認
# コンソール上で実行して確認
$ php -r "phpinfo();" | grep "php.ini"
Configuration File (php.ini) Path => /home/riki/.phpenv/versions/5.6.10/etc
Loaded Configuration File => /home/riki/.phpenv/versions/5.6.10/etc/php.ini
# PHP拡張モジュール mysqli を確認
php -r "phpinfo();" | grep mysqli
コマンドラインのみで PHP の実行ができる。
--run
の省略形。【 grepコマンド 】
# 構文
$ grep 検索正規表現 ファイル名
# ファイル名が指定されない場合は標準入力を対象にする
$ cat access.log | grep "GET / "
Linuxのユーザ追加(useradd)
CentOS7でのuseraddコマンドを使用してユーザを追加する方法を紹介します。
# useraddコマンドを使ってユーザの追加
$ useradd ユーザ名
# passwdコマンドでパスワード設定
$ passwd ユーザ名
実演
これで SSHクライアントソフトを使って一般ユーザでSSHにログインできます。
上記の作業だけでSSHに繋がらない場合は、SSHの設定ファイルにユーザ名を追記します。
# SSHの設定ファイルを vim で開く
[root@example ~]# vim /etc/ssh/sshd_config
AllowUsers が設定されていれば、そこにユーザ名を追加します。
AllowUsers yamada sato honjou
設定ファイルを変更したら、最後にデーモンを再起動します。
[root@example ~]# systemctl restart sshd
システムのタイムゾーンを設定(timedatectl)
PHP の time() 関数を使ってタイムスタンプを取得したとき、時間がずれていることとかありませんか?
この場合、timedatectl コマンドを使ってタイムゾーンを日本(Asia/Tokyo)にしてやると上手くいきます。
以上です。
新しいLinuxの教科書
ただ、読むだけではなく実践しながら進める形式になっています。(※コマンド一覧とか早引きの本ではありません)初心者がつまずくであろう箇所は補足説明がしっかり入っています。基本を大事にしている本なので、書いてあることはとてもわかりやすいです。それゆえ、中級者以上の方には物足りないかもしれませんが、初学者にはススメします!
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。