俺のLinuxチートシート

## はじめに
Linuxで使ったことのあるコマンドです。
都度調べるのは面倒なのでboostnoteにまとめてます。
今回はそれを共有
別々で保存していた記事をくっつけているので、途中で書き方が変わってますがあしからず

## Linux　コマンド

**cdコマンド**

ディレクトリを移動します。

**lsコマンド**

ディレクトリの内容を表示します。 ls -a コマンドで、隠しファイルを含めたディレクトリ全内容を表示します。

**mkdirコマンド**

ディレクトリを新規作成します。

**touch ファイル名**

ファイルを作成  タイムスタンプの更新

**rmコマンド**

ファイルを削除します。

**rm -r <ディレクトリ名>**
ディレクトリを消去

**cpコマンド**

ファイルをコピーします。

**cp -r <ディレクトリ名> <コピー後の名前>**
ディレクトリごとコピー

**mvコマンド**

ファイルの移動とファイル名の変更を行います。

**catコマンド**

ファイルの中身を表示します。

**open .**
カレンとディレクトリをFinderで開く

**root権限を借りて実行**
`sudo コマンド`

**タイムスタンプ更新**
`touch -t YYYYMMDDHHmm.ss 既存のファイル名`

**ファイルの種類を識別**
`file 既存ファイル名`

**リダイアレクト(書き込む+新しいファイルを作成もできる)**
`echo hogehoge > test.txt`
`echo piyopiyo >> test.txt`

**パイプ**(コマンドの入出力を他のコマンドに渡す)
`ls | grep`

**出力結果を捨てる**
`./main 2> /dev/null`

**結果を反転させる**
`./main 2> /div/null | rev`

**プロセスを管理する**
`ps aux`

**バックグラウンドでジョブを実行**
`コマンド名 &`

**実行中のコマンドを強制終了**
`kill コマンド名`
`kill PID`

**PATHを一覧を表示**
`echo $PATH$`

**実行に必要なファイルのPATHを表示**
`which コマンド`

**PATHを通す**
`export PATH=$PATH:/home/sample`

**実行権限を確認**
`ls -l`

**権限を設定・変更**
`chmod 権限　ファイル名` *詳しい説明はLinux　基礎*

**ファイルやディレクトリの所有者を変更**
`chown 新しい所有者　ファイル名`

**所属しているグループの権限も変更**
`chown 新しい所有者:新しい所有グループ ファイル名`

**ディレクトリ内全てのファイルやディレクトリの権限を変更**
`chown -R 新しい所有者:新しい所有グループ ファイル名`

**ユーザ関連**
`useradd -m ユーザ名`userを追加 optでhomeディレクトリも作成
`userdel -r ユーザ名`userを削除 optでhome...
`passwd` userのpasswordを設定
`passwd ユーザ名`自分以外のuserのpasswordを設定
`passwd -S ユーザ名` passwordを確認
`passwd -d ユーザ名` passwordを削除

**環境変数関連**
`env` 現在ある環境変数を確認
`export 環境変数名=値` 環境変数を追加
`unset 環境変数名` 環境変数を削除

**ファイルやディレクトリを探す**
`find ./*.java`
`find ./*.java -atime 1` 昨日アクセス
`find ./*.java -atime -2` 2日以内にアクセス
`find ./*.java -atime +2` 2日より前にアクセス
`find ./*.java -mtime 0` 特定の日に更新されたファイルやディレクトリ
`find ./*.java -empty` 空のディレクトリ検索

**ファイルの中身を絞り込み**
`grep 特定の文字　ファイル名`

**カレントディレクトリにあるファイルやディレクトリを絞り込み**
`grep　特定の文字 ./*`

**ファイルの中身を並び替える**
`sort ファイル名`
`-n` *代償を基準に並び替える*
`-k`*空白で区切られる何個目のフィールドを基準にするか*

**隣り合った行で重複しているものをまとめる**
`uniq　ファイル名`
`sort ファイル名 | uniq`*組み合わせる*
`-u`　重複していない行だけ抽出する

**2つのテキストファイルの差分を見る**
`diff 1つ目のファイル名　2つ目のファイル名`

**文字列の置き換え**
`tr` 先に対象が必要でパイプを併用する
`cat sample.txt | tr s a > new.txt` sをaに変更

**sedを使った文字列の置き換え**
`sed`
`sed -e 's/te/se/' old.txt > new2.txt` teをseに変更

**cutコマンドで指定した文字列を切り取る**
*切り取った部分が結果として出力される点に注意*
`cut -c 2 sample.txt` sampleから2文字目を切り取る
`cut -c 1-2 sample.txt` 1~3文字目を切り取る
`cun -c 1,2,3,4 sample.txt`1,2,3,4文字目を切り取る
`cut -d , -f 1 sample.txt | sort | uniq -u`*組み合わせで細かくフィルターをかけられる*
`echo aaa:bbb:ccc | cut -d : -f 2` bbbが出力される(区切り文字列追加)

**ファイルの文字数を数える**
`wc -c ファイル名`

## 応用？？　ちょいむず

**ftpで接続** *ftpは主にファイルを送受信するために使う*
`ftp サーバーのアドレス`

**ファイルの送受信**
`ftp > get ./ファイル名`*ftpに接続した際にいたディレクトに保存される*
`ftp > put ./ファイル名`

**ホームゲートウェイを確認**
`route`

**特定の相手への応答と所要時間を確認**
`pin IPアドレスまたはドメイン名`
`pin -c 2 IPアドレスまたはドメイン名`リクエスト数を設定
`pin -w 5 IPアドレスまたはドメイン名`リクエストを秒数で設定

**特定のドメインに対して名前解決する**
`nslookup ドメイン名`

**現在使用しているDNSサーバーを確認**
`cat /etc/resolv.conf` resolv.confファイルを確認する

**HTTPレスポンスの中身を見る(Get)**
*指定のURLはサーバーIDでも同じこと*
`curl 指定のURL` httpレスはheaderとbodyに分かれてる　デフォはbody
`curl -I 指定のURL`Headerだけをみたい場合
`curl -i 指定のURL` headerもbodyも両方表示する
`curl 指定のURL -o res.txt`レスをファイルに出力する

**POSTで確認する**
`curl -XPOST -d 'name=user' 指定したURL`  -dの後ろにPOSTする内容
`curl -XPOST -d 'name=user&job=engineer' 指定したURL`


**特定のURLからリソースをダウンロードする**
`sudo apt install wget` Linux標準機能ではないためinstall
`wget 指定したURL `
`wget 指定したURL -O ./sample.txt` -Oでdirとfile名と指定


**Linuxのパッケージ管理ツール**
`dpkg --help` dpkgコマンド一覧
`dpkg -l` 既存パッケージ一覧
`dpkg -s パッケージ名` 特定のパッケージの詳細情報
`dpkg -i パッケージファイル名` package fileのdevファイルを元にinstall

**Linux依存関係も解決する管理ツール**
`apt update` aptを使う前に必ずupdateする
`apt install パッケージ名`
`apt remove　パッケージ名`
`apt --purge remove パッケージ名` 依存関係も含めてアンインストール

**Apachでwebサーバーを立てる**
`sudo apt install apach2` apach2をinstall
`sudo apache2ctl start` apach2を起動

**Apacheで自分の作成したhtmlファイルを公開**
`/var/www/html` ここにhtmlファイルを移動する 最初に表示するファイルはindex.html

**Nginxでwebサーバーを立てる**
`sudo apt install nginx` nginxをinstall
`sudo nginx` nginxを起動

**Nginxで自分の作成したhtmlファイルを公開**
`/etc/nginx/sites-enabled/default` にrootの記載あり defaultはfile
`/var/www/html` デフォルトだとここにhtmlファイルを置いて公開可能

`defaultを編集してrootを書き換えることも可能` 
`nginx -s reload`で際読み込み 

## 説明形式じゃないと理解しづらいコマンド


## 実行権限

**ファイルの種類**
テキストファイル
バイナリファイル

**実行権限を確認する**
`ls -l`


1文字目：　ファイルの種類 「-」だとファイル。「d」だとディレクトリ

2文字目から3文字刻みで　所有者　グループ　その他のユーザー

d rwx r-x r-x


読む(4) : r → ファイルの中身を見る権限
書く(2) : w → ファイルを編集する権限
実行(1) :x → ファイルを実行する権限

読む(4)+書く(2)+実行(1)=7

drwxrwxrwsなら 777で表すことができる

**実行権限を変更する**
chmod 744 ファイル名

---
**実行ファイルを実行する際に問題が派生した場合**
ELFファイルなのか
実行権限は持っているのか
パスは適切か
を疑う


*消去コマンド**
dw de d$

## 標準入力・標準出力・標準エラー出力
Linuxには３種類の入出力名が存在します。

標準入力：0
標準出力：1
標準エラー出力：2
それぞれには、上記のように割り振り番号が指定されています。

/dev/nullファイルは特殊で、MacやWindowsなどのOSでいうゴミ箱に該当するものです。

そのことから、/dev/nullファイルに出力結果をリダイレクトすることを「捨てる」と言ったりします。

**エラー出力をゴミ箱に擦れる**
`出力結果 2>/dev/null` *2と>の間にスペースを開けないことがポイント* 

## 正規表現

^文字 → 行頭の文字は何かを表す
$文字 → 行末の文字は何かを表す
. → 任意の1文字があることを表す
* → 直前の文字を0回以上繰り返すことを表す
[文字] →[]の中に入っている文字のどれかがあることを表す
[^文字] → []の中に入っている以外の文字を表す
¥ → 正規表現で使われている記号をふつうの文字として使う
() → 正規表現適用範囲のグループ化

正規表現の例
`grep -E '(=6)(.)*(9)$' secrets.txt`

## IPアドレスを調べる
`ifconfig`

IPアドレス `inet`
MACアドレス `ether`
サブネットマスク `netmask`
サーバーのネットワークアドレス `inetとnewmaskをAND計算`


## ncコマンドでサーバーと通信
*netcatの略*
TCPまたはUDPの通信

**ipアドレスとポート番号を指定して相手のサーバーに接続する**
`nc サーバーのアドレス サーバーのポート番号`

**自分がサーバーとなり、相手からの接続を待ち受ける**
`nc -l 受診したいポート番号`

**UDPで通信**
`nc -ulp 受診したいポート番号`

## シンボリックリンク
特定のファイルやディレクトリのパスを保存し、使用することで実際にそのパスにアクセスできるもの

**新規のシンボリックリンクを作成**
`ln -s 元のファイルやディレクトリ　シンボリックリンクの名前`

**既存のパスの情報を変更**
`ln -nfs 元のファイルやディレクトリ　シンボリックリンクの名前`

**削除**
`unlink シンボリックリンクが存在する元のファイルやディレクトリ`


## SSHコマンドと認証
SSHとはネットウェアークを介して別のコンピュータに接続する通信プロトコルの1種
*データやパスワードなどを暗号化して安全に通信することができる*
*パスワード認証と公開鍵認証の2つの認証方法があるが、鍵の使用が推奨*
*`/etc/ssh/sshd_config`ファイルでパスワド認証を無効にできる*
*鍵の保存場所は`authorized_keys`*

**sshでコンピュータに接続する**
`ssh ユーザー名@IPアドレス`

**ペアの鍵を作る**
`ssh-keygen`
`ssh-keygen -f 鍵を保存したい場所/名前`保存場所をやファイル名を指定

**公開鍵をsshで接続したサーバーに設定する例**
`cat id_rsa.pub | ssh envader@172.19.2.11 'cat >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys'`

**パスワードログインを禁止にする**
`sudo vi /etc/ssh/sshd_config`
PasswordAuthenticationの部分をnoにして #を取る

## バージョンの確認
`uname`でカーネルの名前やバージョンなどを確認できる
これだけでは、Linuxという情報以外何も分からないので、知りたい情報に合わせてオプションを指定します。

-o → OSの名前を表示
-v → カーネルのバージョンを表示
-r → カーネルのリリース番号を表示
-p → CPUの種類を表示
-a → unameコマンドで確認できる全ての情報を表示
OSのバージョンを確認する場合は/etcにあるos-releaseというファイルを確認します。

`cat /etc/os-release`

## path
PATHの一覧を確認するためには、以下のコマンドを使用します。
`echo $PATH`

PATHは環境変数に登録されているため、$という記号を前に付けてechoで出力することで、環境変数として登録されているPATHの一覧を表示することができるのです。

whichとは、特定のLinuxコマンドの実行に必要なファイルのPATHを表示するのに使用するコマンドです
`thich ls`

「PATHを通す」とは、新たなパスを追加して他のディレクトリ上にあるコマンドを認識させることです。
`export PATH=$PATH:/home/sample`
上記のコマンドを使うことで、新たに/home/sample上に存在するシェルスクリプトが認識され、コマンドとして使用することが出来るようになります