Linux 標準教科書


### linuxとは

カーネルとユーザーランドで構成されているらしい

## 学んだこと

- `>`で結果を出力できる

```
➜  Desktop cat someoutput | tr a A > newsomeoutput
➜  Desktop cat newsomeoutput
yAmAdA 100
tAnAkA 20
kAndA 60
```


### 使いそうなメソッド

- find

```
公式
find パス名 --name ファイル名
```

- head 行数指定で表示できるらしい

```
➜  Desktop head someoutput
hello
```


- sort

ファイルの中身もソートできるみたい

```
➜  Desktop cat someoutput
yamada 100
tanaka 20
kanda 60
➜  Desktop sort someoutput
kanda 60
tanaka 20
yamada 100
➜  Desktop sort -r someoutput # rは reverse
yamada 100
tanaka 20
kanda 60

➜  Desktop sort -n -k 2 someoutput # nは数字をみる kは行を
tanaka 20
kanda 60
yamada 100
```

- tar コマンド （| パイプを使う）

※破壊的メソッドではないみたい
```
➜  Desktop cat someoutput
yamada 100
tanaka 20
kanda 60
➜  Desktop cat someoutput | tr a A
yAmAdA 100
tAnAkA 20
kAndA 60
```

変更したモノを他のファイルに出力する

```
➜  Desktop cat someoutput | tr a A > newsomeoutput
➜  Desktop cat newsomeoutput
yAmAdA 100
tAnAkA 20
kAndA 60
```

- diff

オプションは必須だな。 `-n（unified）`は馴染みがある形式

```
➜  Desktop diff -u someoutput newsomeoutput
--- someoutput	2020-01-02 03:02:12.000000000 +0900
+++ newsomeoutput	2020-01-02 03:12:35.000000000 +0900
@@ -1,3 +1,3 @@
-yamada 100
-tanaka 20
-kanda 60
+yAmAdA 100
+tAnAkA 20
+kAndA 60
```


## viコマンドについて

ここはそんなに興味ないから。
編集と保存ができれば良いかな

- 検索 `/`
- 置換

```
:1s/old/new/g
```

```
  1 yamada 100
  2 tanaka 20
  3 kanda 60

:1s/yamada/nkanda/g

  1 nkanda 100
  2 tanaka 20
  3 kanda 60
変わった。
ファイル全文検索して変換とかもあるらしい。

```
全文検索
`%s`で全文検索
```
:%s/melon/*MELON*/g
```

## 管理権限について

ユーザーの種類

- グループ
- ユーザー
メモリやファイルなどの資源を利用する最小単位の権限

- ユーザー作成

`useradd` ユーザー名  ※macは違うみたい
`-g` グループ名

- ユーザーの権限を変更する

`usermod` ユーザー名

- ユーザー削除

`userdel` ユーザー名

- グループ作成

`groudadd` グループ名

編集削除はユーザーと同じで、頭文字だけgroupに変更する

- password

`etc/passwd`の中にある

- groupファイル
グループが格納されている
`etc/group` 

- `root` `su`

## ユーザー権限とアクセス権限

### ファイルの所有者と所有グループ

- chown ユーザー（グループ） ディレクトリ
- chown ユーザー（グループ） ディレクトリ


```
# nobodyに変更された

➜  Desktop ls -l user
-rw-r--r--  1 username  staff  0  1  2 03:44 user


➜  Desktop ls -l user
-rw-r--r--  1 nobody  staff  0  1  2 03:44 user

# 編集しようとするも readonlyで変更できない
➜  Desktop vi user
```

- chgrp グループ ディレクトリ
- chgrp グループ ファイル

### ファイルとアクセス権限

- 権限は3つある。読み（r read）、書き（w write）、実行（x exec?）


`d rwx rwx rwx`
左からファイル種類、所有ユーザー（u）、所有グループ（g）、その他（o）


- 変更コマンド

```
chmod モード ファイル

➜  Desktop ls -l user
-rw-r--r--  1 username  staff  0  1  2 03:55 user


# groupに wの権限を追加した 追加は+
-rw-r--r--  1 username  staff  0  1  2 03:55 user
➜  Desktop chmod g+w user
➜  Desktop ls -l user
-rw-rw-r--  1 username  staff  0  1  2 03:55 user

# groupに wの権限を削除 追加は-
➜  Desktop chmod g-w user
➜  Desktop ls -l user
-rw-r--r--  1 username  staff  0  1  2 03:55 user

# 8進数で変更 これが 664とかなんとかか

➜  Desktop ls -l user
-rw-r--r--  1 username  staff  0  1  2 03:55 user
➜  Desktop chmod 664 user
➜  Desktop ls -l user
-rw-rw-r--  1 username  staff  0  1  2 03:55 user
```

## シェルスクリプト

カーネルはOSの基本部分でハードウェアを操作する機能をもつ。
カーネルの機能を操作する際にOSそ操作する。
それがシェル

- 作成

```
touch lsdata.sh

#!/bin/bash  # 利用するシェルファイルを選択

ls # 実行したいコマンドを
date

```

- 実行

```
➜  Desktop sh lsdate.sh
スクリーンショット 2020-01-01 11.13.02.png # 一覧
パフォーマンス改善.md
2020年 1月 2日 木曜日 12時16分37秒 JST # dateで日付がでる
```

- echoコマンド （引数で与えた文字を標準出力するコマンド）

```
➜  Desktop echo message test
message test
```

- 変数

ターミナルでもこんな使い方できるのか

```
➜  Desktop abc=123 # 代入は=をくっつける
➜  Desktop echo $abc
123
```

- exportコマンド

```
export abc=345 # 環境変数を設定
```

- シェル変数 環境変数確認

シェル変数 `set`
環境変数確認 `env`


- 引数 実行時の引数を`$1`などで呼べる



```
➜  Desktop sh lsdate.sh hello yahoo
$1: hello
$2: yahoo

# ファイルの中身

➜  Desktop cat lsdate.sh
# !/bin/bash

echo '$1:' $1
echo '$2:' $2
```

- if

```
➜  Desktop sh lsdate.sh hello
文字は同じ


➜  Desktop cat lsdate.sh
# !/bin/bash

STR1='hello'

if [ $STR1 = $1 ]; then # 変数を呼ぶときは$をつける
 echo "文字は同じ"
fi

```

- 繰り返し、関数などもある見たい

#### 実際のシェル

起動ときにやることが多いらしい。
構成は、メインのファイルと、切り分けた関数ファイルで分けるのかも

```
# 構成
etc/functions/関数ファイル.sh
init.sh

#init.shで
# !/bin/bash
.etc/functions/* #ここで切り分けた関数を読み込む
```


## デバック方法

実行するときに、`x`オブションをつける

```
➜  Desktop sh -x lsdate.sh
+ echo '$1:'
$1:
+ echo '$2:'
$2:
```

## ネットワーク

IPアドレスとTCP（Transfer Control Protcol）

データ送信の際にIPアドレスでサーバーまで届けて、どこアプリケーションに届けるかはTCPポート（22:ssh 80:アプリケーション）で判別する

- ping コマンド

```
➜  Desktop ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
Request timeout for icmp_seq 0
```

- 経路確認

```
➜  Desktop traceroute lpi.jp
traceroute to lpi.jp (3.112.116.66), 64 hops max, 52 byte packets
 1  192.168.3.1 (192.168.3.1)  2.046 ms  2.912 ms  2.549 ms
 2  * * *
 3  softbank32432423432.bbtec.net (221.110.235.201)  43.241 ms  25.163 ms  29.019 ms
```

### ネットワークの設定

- ifconfigコマンド

`inet`がipアドレス
https://www.atmarkit.co.jp/ait/articles/0109/29/news004.html