Linux コマンド 早見表

2022/06/30

WEBの開発を行っていると、SSHターミナルソフトを使ってLinuxコマンドで操作することがよくあります。

ただ、プログラミングは慣れているけど、Linuxなどのサーバー周りは苦手という人が結構多かったりします。

今回はLaravelプログラマーがよく使うLinuxコマンドをまとめてみました。

【 point 】
一般ユーザでは権限がない場合は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コマンド

sudo コマンド

sudoコマンドは、他のユーザーとしてコマンドを実行するコマンドです。よくroot(スーパーユーザー)にスイッチするときに使います。


# rootユーザに切り替え
# rootユーザのパスワードが求められる
$ su

# 引数に「-」を付けると、そのユーザーの環境変数(PATHなど)を引き継ぐ
$ su -

# 現在のユーザ名を表示
$ whoami

# 「wget」パッケージのインストールを root 権限で実行したい場合
$ sudo yum install wget

普通は su コマンドで切り替える権限は与えられることはあまりありません。sudo コマンドを頭につけてコマンドを実行することが多いです。

 

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

ファイルをコピーする時に使います。


$ cp 元ファイル 先ファイル

# ディレクトリごとコピー
$ cp -r コピー元ディレクトリ コピー先ディレクトリ

 

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

ポイント

さくらのレンタルサーバに Laravel をデプロイするときに使います。

 

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

上記の状態だと、php.iniは存在しないので、php.ini.defaultをコピーして、php.iniを作成しています。

 

ファイルを閲覧する(cat・cat & grep・less・vi・tail)

catコマンド、catコマンド&grepコマンド、lessコマンド、viコマンド、tailコマンド

catコマンド

ファイルの内容を全て表示することができます。


$ cat FooController.php 

チェックただし、長いファイルの場合はターミナルを埋め尽くしてしまいます。そのため、catコマンドはファイル閲覧の用途には向いていません。catコマンドはパイプ「|」を使ってgrepコマンドと組み合わせて使うことが多いです。

 
ファイルを作成


$ 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 を立ち上げようとすると vim が立ち上がるケースもあります。vim は vi に少々機能追加したもので、同じものだと思っておいて困ることはありません。

$ vi { ファイル名 }

vi には コマンドモードインサートモード があり、はじめはコマンドモードで起動されます。

 

インサートモードへ変更

キーボードの i(insert)を押すと編集モードに移行します。
(※他の方法でも移行できますが、ここでは割愛します。)

 

コマンドモードへ変更

escキー を押下するとコマンドモードへ戻ります。

【 vi ESCキーを利用せずにモードを切り替える 】
vi エディタ利用中に、なぜか「ESC」キーが調子悪くなったので、その際に利用したショートカット。
下記のショートカットキーを利用すれば、インサートモードからノーマルモードに「ESC」キーを利用せずに戻ることが可能。

ctrl + c

 

viを閉じる

[ コマンドモード ] の状態で以下を実行。

:wq 保存して終了
:q! 編集内容を保存したくない場合
チェック保存していない状態では :q コマンドは受け付けられません。保存して終了するか、: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 ファイルの追記を監視する
終了するときは Ctrl + C

 

パッケージの管理(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

POINT!

wgetコマンドは CentOS などではデフォルトでインストールされていない場合があります。インストール自体は難しくありませんが、代わりに curl(カール)を使うことができます。

 

curl

curl コマンドも、ファイルをダウンロードしたりアップロードしたりするためのコマンドです。最近のLinuxディストリビューションではデフォルトでインストールされています。

curl { ファイルのURL }でWEBサーバーからコンテンツを取得します。


# composerのインストール
$ curl -sS https://getcomposer.org/installer | php

POINT!

-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サーバー 】
データベースサーバープログラム。ディスクまたはメモリ内の実際のデータベースへのアクセスを管理する。
 
【 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

サービスの起動と停止はroot権限でないと実行できません

 

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

サービスの起動と停止はroot権限でないと実行できません

 

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/

 

H オプションについての解説

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 パーミッション保持したまま
【 POINT 】
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.pub)が公開鍵。このキーペアを使ってリモートサーバーと認証します。
.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)


whichコマンドの後に検索するコマンド名を指定します。


# 構文
$ which コマンド名

# 実例:mysqlがどこにあるか調べる
$ which mysql
/usr/bin/mysql

 

実演


 

ローカル/リモート間のコピー(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

 

よく間違えるのですが、SSHでLinuxに接続してscpコマンドを実行すると上手くいきません。Git Bashでローカルからscpコマンドを実行させます。

 

実演

<ローカルからリモートにコピー>

<リモートからローカルにコピー>

ローカルでのダウンロード先の場所がCドライブ直下だとエラーになるので注意!
 

 

不正アクセス確認(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

【 AWS EC2 の場合 】
AWSコンソールにて、インバウンドの設定をします。
TCP ルートに変更したポート番号(例では54321)を指定し、SSHの記述は削除します。

 

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 を操作するコマンドです。

【 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 と入力。

【 vimでの操作 】
小文字の n キー・・・順送り
大文字の N キー・・・逆送り

以下のように見つけることができます。

恐らく大体は以下のように設定されています。

アクセスログ:/var/log/httpd/access_log
エラーログ:/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

【 lessコマンドでの操作 】
q キー・・・lessコマンドの終了
/ キー・・・検索(※viと同じ)
n キー・・・順送り
/var/log/httpd にあるログ。
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

【 -r パラメータってなに?】
コマンドラインのみで PHP の実行ができる。
--run の省略形。
 
【 grepコマンド 】


# 構文
$ grep 検索正規表現 ファイル名

# ファイル名が指定されない場合は標準入力を対象にする
$ cat access.log | grep "GET / " 

 

Linuxのユーザ追加(useradd)

CentOS7でのuseraddコマンドを使用してユーザを追加する方法を紹介します。


# useraddコマンドを使ってユーザの追加
$ useradd ユーザ名

# passwdコマンドでパスワード設定
$ passwd ユーザ名

 

実演

 
これで SSHクライアントソフトを使って一般ユーザで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)にしてやると上手くいきます。


# 現在のタイムゾーンの設定値を確認
$ timedatectl status

# タイムゾーンが America になっていたら日本に変更
$ timedatectl set-timezone Asia/Tokyo

# 設定確認
$ timedatectl status

 

実演

[ Local time ]
システムクロックともいいますが、OS が持っている時間のことです。datta コマンドで表示される時間は "Local time" で設定されている時間が表示されます。

 
以上です。

 

新しいLinuxの教科書

ただ、読むだけではなく実践しながら進める形式になっています。(※コマンド一覧とか早引きの本ではありません)初心者がつまずくであろう箇所は補足説明がしっかり入っています。基本を大事にしている本なので、書いてあることはとてもわかりやすいです。それゆえ、中級者以上の方には物足りないかもしれませんが、初学者にはススメします!

公式サイトで詳細を見る

オススメ

 

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-周辺知識