Linux 101 By tomkimra ©︎ 2022 tomkimra 1
この資料について をCLI(Command Line Interface)で使う場合に,コマンドやシステムについて 知っておくと理解が捗る知識やHowToを記載しています. 「Windowsしか触ったことないよ」というような方が主な対象です. コマンドのオプションなどはあまり網羅的には書いていません. 学習環境としてWindows 10上のWSL2(後述)を利用します.そのため通常のUbuntu とは異なるコマンドについては本資料では触れません Linux ©︎ 2022 tomkimra 2
事前準備 のUbuntuをインストールしておきます. ※WSL: 端的にいえば Windows 上で Linux のコマンドが動かせるシステム 「Windowsの機能の有効化または無効化」ダイアログで「Linux用Windowsサブシ ステム」にチェックが入っていることを確認 その後 PowerShellを管理者権限で開き, wsl --install Ubuntu-20.04 を実行 ウィンドウが開き,しばらくするとUbuntu用のユーザ名とパスワードを入力するよ う求めてくる.設定するユーザ名とパスワードはWindowsのとは関係なくてもい い. 参考 WSL(Windows Subsystem for Linux) https://zenn.dev/ctrlkeykoyubi/articles/002-wsl2-ubuntu https://www.kkaneko.jp/tools/wsl/wsl2.html ©︎ 2022 tomkimra 3
コマンドラインに親しむ ©︎ 2022 tomkimra 4
のUbuntuを開きます. デスクトップ環境でのCLIアプリケーションを,よくターミナルや端末と言いますが, 以後端末というとこのCLIのことを指していると思ってください. WSL hoge@linux-pc:~ $ | | | └ | | └-| └----------└---------------- プロンプト カレントディレクトリ マシン名 ユーザ名 このプロンプト $ の後にコマンドを記述します. ©︎ 2022 tomkimra 5
コマンドと引数(オプション)を入力し,Enterを押すとそのコマンドが実行されます ( [] で書かれた内容はそのキーを押すということ) pwd という今のディレクトリ (= カレントディレクトリ ) を出力するコマンドを実行して みます. キー] hoge@linux-pc:~ $ pwd [Enter /home/hoge 以降の内容では, $ の後に書かれているものだけを記述します. また以降ではEnterキーは省略します ©︎ 2022 tomkimra 6
Linux のディレクトリ構造 のディレクトリ構造はツリー構造で, / (=ルート)から始まり, / で区切られ ます.つまり下記はルートの home の hoge ディレクトリがカレントディレクトリと いうことになります. ~ は特殊なディレクトリで,今のユーザのホームディレクトリを指します(つまり ~ = /home/hoge ) Linux hoge@linux-pc:~ $ pwd /home/hoge ©︎ 2022 tomkimra 7
よく出てくるディレクトリ /home : /dev : /etc : 各ユーザのホームディレクトリ デバイスファイルが入っているディレクトリ アプリケーション・プログラムの設定があるディレクトリ ©︎ 2022 tomkimra 8
よく使うコマンド(1) hoge@linux-pc:~ $ ls bin dev home mnt boot etc lib media hoge@linux-pc:~ $ cd hoge@linux-pc:home $ / proc run snap sys usr opt root sbin tmp var /home 引数(なければカレントディレクトリ)のファイルのリストを表示 (listと覚える) cd : カレントディレクトリを引数で指定した先に変える ls : ©︎ 2022 tomkimra 9
特殊なディレクトリ カレントディレクトリ自体を指します .. カレントディレクトリの一つ上のフォルダを指します . hoge@linux-pc:home $ cd ../ hoge@linux-pc:/ $ cd ~ hoge@linux-pc:~ $ ©︎ 2022 tomkimra 10
入力補完 キーを1回押すと,今入力中の文字からフォルダが一意に決まる場合,補完されま す.一意に決まらない場合,もう一度[Tab]を押すと候補が出力されます [Tab] hoge@linux-pc:~ $ cd /va[Tab] ↓ hoge@linux-pc:~ $ cd /var/ hoge@linux-pc:~ $ cd /var/l[Tab][Tab] lib/ lock/ local/ log/ hoge@linux-pc:~ $ cd /var/l また,過去に使ったコマンドは[↑][↓]キーでたどることができます(試してみましょ う) ©︎ 2022 tomkimra 11
よく使うコマンド(2): ファイル操作関連のコマンド ©︎ 2022 tomkimra 12
リダイレクト コマンドの後に > を記載しファイル名を入力することで,標準出力(端末上)に出力され る代わりにファイルに記載されます. echo はその後の文字を標準出力するコマンドで すが,下記では Hello, Linux と書かれたhelloファイルが作成されます. hoge@linux-pc:~ $ echo Hello, Linux > hello ※テキストファイルだからと言って .txt をつける必要は特にありません ※vi や nano といった CLI 上のテキストエディタを使うことでテキストファイルを作成す ることもできます(後述) ©︎ 2022 tomkimra 13
cat ファイルの中身を表示することができます hoge@linux-pc:~ $ cat Hello Hello, Linux mkdir ディレクトリ(フォルダ)を作成できます hoge@linux-pc:~ $ mkdir myfolder ©︎ 2022 tomkimra 14
cp cp 元ファイル コピー先 と記述し,ファイルをコピーします.コピー先がフォルダの場合 はフォルダの中に元ファイルと同じ名前のファイルを,コピー先がファイルの場合は 既存でも上書きされます. hoge@linux-pc:~ $ cp hello hello2 hoge@linux-pc:~ $ ls hello hello2 mv mv 移動元(旧ファイル名) 移動先(新ファイル名) と記述し,ファイルを移動する,または名前 を変更します. hoge@linux-pc:~ $ mv hello2 myfolder/hola hoge@linux-pc:~ $ ls myfolder hola ©︎ 2022 tomkimra 15
rm rm ファイル名 でファイルを削除します. rm -r ディレクトリ名 でディレクトリごと削除し ます.最も注意が必要なコマンドの一つで,ディレクトリ名を指定するときはケアレス ミスを防ぐため / から始めないことをお勧めします. ©︎ 2022 tomkimra 16
パーミッション ©︎ 2022 tomkimra 17
パーミッションとは ファイル・ディレクトリについて,どういうユーザがアクセスできるかの設定をパ ーミッションと言います. パーミッションには「所有者」「グループ」「一般ユーザ」の3種類について,そ れぞれ「読み出し r 」「書き込み w 」「実行 x 」の3つの権限が設定できます. 例えば「グループ」に rw の権限を設定すると,そのグループに属するユーザは 読み出し・書き込みが可能になります. ©︎ 2022 tomkimra 18
ls -l というコマンドを実行すると,パーミッションに関する情報が表示されます. hoge@linux-pc:~ $ ls -l -rw-r--r-1 hoge hoge drwxr-xr-x 1 hoge hoge 13 May 13 2022 hello 4096 May 13 2022 myfolder コマンドの後にハイフン - で繋げたものをオプションと言います.コマンドにどういう オプションがあるかは,一般的なコマンドの場合 man コマンド で詳細. コマンド --help で簡易的に表示されます. ©︎ 2022 tomkimra 19
読み方 ┌-- d = ディレクトリという意味 | -rw-r--r-drwxr-xr-x └-┘└-┘└-┘ (1)(2)(3) 1 hoge hoge 1 hoge hoge ↑ 13 May 13 2022 hello 4096 May 13 2022 myfolder ↑ 所有者 グループ 所有者のパーミッション (2): グループのパーミッション (3): 一般ユーザのパーミッション (1): ©︎ 2022 tomkimra 20
パーミッションの数値表現 例 パーミッションを示すのに,3文字ずつ区切って二進数(許可=1,不許可=0)とみな した時の数値で示すことで簡潔に示すことができます. 例えば, rw- であれば 110 とみなして6, r-x であれば5というようにです. 所有者のみ書き換えられるファイル rwxrwxr-x = 755 : 所有者とグループが書き換えられる実行ファイル rw-r--r-- = 644 : ©︎ 2022 tomkimra 21
なお,フォルダの「実行」パーミッションとは, ls コマンドや cd コマンドでの移 動が許可されるかどうかに関わります. 大体の場合,一般的なファイルは644,実行ファイル(バイナリ)やディレクトリは 755 と覚えておくとよいです.セキュリティ的に重要なファイルの場合 600 , 700 を 使うことがあります. ©︎ 2022 tomkimra 22
root 権限 ユーザ(特権ユーザ)は設定にかかわらず全てのパーミッションが与えられていま す. ユーザとして実行したい場合は sudo の後に行いたいコマンドを入力します. root root hoge@linux-pc:~ $ sudo mkdir rootfolder hoge@linux-pc:~ $ ls -l ( ) drwxr-xr-x 1 root root 4096 May 13 2022 rootfolder 前略 上記の場合, sudo で実行したので,rootが所有者のディレクトリが作成されていま す. ©︎ 2022 tomkimra 23
パーミッションに関するコマンド パーミッションの変更には chmod ,所有者(グループ)の変更には chown を使います. chmod パーミッションの変更. chmod パーミッション ファイルもしくはフォルダ と指定します.パー ミッションの指定には3つの数字か, a+w のような形式でも記述できますが割愛しま す. hoge@linux-pc:~ $ cp hello rootfolder/ (Permission Denied: write ) hoge@linux-pc:~ $ sudo chmod 777 rootfolder hoge@linux-pc:~ $ cp hello rootfolder/ ( ) 権限がない 書き込める ©︎ 2022 tomkimra 24
chown ( 所有者 グループ)を変更します. chown 所有者.グループ ファイルもしくはフォルダ と指定しま す. hoge@linux-pc:~ $ sudo chown hoge.hoge rootfolder なお,グループ名などでスペースがある場合, \ でエスケープする必要があります. 実行する必要はありません ( ) hoge@linux-pc:~ $ sudo chown hoge.domain\ users fuga ©︎ 2022 tomkimra 25
apt: ©︎ 2022 tomkimra パッケージ管理 26
パッケージ管理とは のパッケージ(要はソフトウェア)は,パッケージAを使うにはパッケージBのバー ジョン1.15以上が必要,というようなパッケージ間の依存性があります.これを踏まえ て自動的に導入してくれるのがパッケージ管理ソフトです. Linux ©︎ 2022 tomkimra 27
apt ではパッケージのインストールや管理には apt コマンドを使います.昔のバー ジョンでは apt-get が使われることが多かったですが,今は全て apt で使えます. パッケージを新たにインストールするには apt install の後にインストールしたいパッ ケージを記載します. apt の実行にはroot権限が必要なため,実質次のようなコマンド を実行することになります. Ubuntu $ sudo apt install sl ( ) ? [Y/n] y[Enter] 中略 続行しますか ※以降$ より前の表記は省略しています. ※上記では sl というジョークコマンドをインストールしています. ©︎ 2022 tomkimra 28
更新と注意点 はダウンロード先などのパッケージの最新情報を引っ張ってくるコマン ドで,今入っているパッケージの内容には影響しません. apt update $ sudo apt update ダウンロード先などの情報は期間が空くとパッケージが見つからずErrorとなること があります.そのため apt update を実行してから apt install されています. 一方で apt upgrade はインストールされたパッケージをアップデートしてしまうた め,バージョン互換性や挙動の変化などの影響でこれまで動いていたものが動かな くなることがあり得ます. 立ち上げ最初は問題ないですが,運用中のサーバでは使 わないのが無難です. ©︎ 2022 tomkimra 29
エディタ デスクトップ版ではGUIのgeditというエディタが使えますが,CLIではマウスも使えず 難儀する箇所の一つかと思います. 以降ではCLIで使うエディタについて簡単に説明します. ©︎ 2022 tomkimra 30
nano 直感的に使え,かつUbuntu標準搭載のエディタ nano ファイル名 でファイルを開き, Ctrl+x で終了,もし編集していたら "Save modified buffer?" というように保存するか聞かれるので,保存する場合は y ,しない 場合はnを押す 保存する場合,さらにファイル名を入力させられるので,そのままの場合は[Enter] で完了 編集したら [Ctrl+x]→[y]→[Enter] と覚えておくと良いです. ( 無いファイル名にした場合新規ファイルとして編集を開始します ) $ nano hello ( ) [Ctrl+w] Save modified buffer? [y] File Name to write: hello[Enter] 編集開始 ©︎ 2022 tomkimra 31
vi 説明によってはviやvim(ほぼvi)で編集するように記載されていてもnanoが使えれば nano で問題ありません.環境によっては vi しか使えない場合もありえるので,基本的 な操作だけでも押さえておくと良いです. vi では通常の状態はキーを押しても入力されません [i] キーで入力モードにし,矢印キーや通常の入力を受け付けるようになります [Esc] で通常モードに戻ります [:qw] で上書き終了, [:q!] で保存せず終了 ©︎ 2022 tomkimra 32
プロセス ©︎ 2022 tomkimra 33
動いているプログラム一つ一つのことをプロセスといいます.今どういうプロセスのリ ソースが食っているかは top コマンドで知ることができます. $ top [q] で終わる キーで終わるコマンドは man などしばしばあるため,[Esc]押しても終わらないなと 思った場合[q]を試してみるといいかもしれません. ※[q] ©︎ 2022 tomkimra 34
端末上で動かしているプログラムがハングして[Enter]を押してもプロンプトが表示さ れないような場合,[Ctrl+c]と入力することで今のプログラムを強制終了することがで きます. 例えば y が延々と出力される yes コマンドを実行して止めてみましょう. $ yes (y [Ctrl+C] が延々と出力される) で終わる ©︎ 2022 tomkimra 35
バックグラウンドプロセス 端末で実行したプログラムは端末を占有する,つまり前のプログラムが終了・停止し てからでないと他のプログラムが実行できません.デスクトップアプリケーションや 複数のプログラムを並行して動作させるなどの場合には & を用いることで 「バックグ ラウンド実行」 ができます. ps 実行中のプロセス一覧は ps で見ることができます.オプションが無いと今の端末 ( ユーザ ) で走っているプロセスしか返しません.全て表示したいときは ps -e を実行 します. jobs でも今の端末で実行中のプロセスを表示できます. ©︎ 2022 tomkimra 36
バックグラウンド実行のプロセスは[Ctrl+C]では終了できないため,プロセスを強 制終了させるコマンド kill を用います.「どのプロセスか」を特定するのには PID(Process ID) を用います. これは top や ps でPID列に表示される値で, & で実行した際にも表示されます. jobs コマンドを実行すると, [1],[2].. に表示されるプロセスの PID が,それぞれ 変数 %1,%2.. に保存されます. ©︎ 2022 tomkimra 37
試しに yes コマンドをバックグラウンド実行し,そのプロセスを強制終了させてみま す. $ yes > /dev/null & [1] 111 $ top ( ) PID USER PR ... %CPU %MEM TIME+ COMMAND 111 hoge 20 ... 100.0 0.0 0:04.68 yes [q] $ ps PID TTY TIME CMD .. 111 tty1 00:00:13 yes 略 ( で終了) PID 111 のプロセス yes が1コア占有していることがわかります. ©︎ 2022 tomkimra 38
$ jobs [1]+ Running yes > /dev/null $ kill %1 ← kill 111 [1]+ Terminated yes > /dev/null $ ps (PID 111 yes もしくは が の プロセスは表示されない) 無事バックグラウンドプロセスを強制終了できました. ※ /dev/null は特殊ファイルで,ここにリダイレクトされたものはどこにも出力されま せん. ©︎ 2022 tomkimra 39
変数 端末でも変数を利用できます. 変数は $ で始まる文字列で読み取る一方,設定は $ なしで指定します. $ HOGE=hoge.txt $ echo $HOGE hoge.txt $ echo hogehoge > $HOGE $ ls hoge.txt ← $HOGE で指定した名前のファイルができている ©︎ 2022 tomkimra 40
文字列の境界など 文字列は "" で囲まなくても認識されますが,スペースがある場合はそこでコマンド が区切られていると認識されるため, "" で囲む必要があります $ HOGE=hoge hoge hoge: command not found $ HOGE="hoge hoge" ← HOGE=hoge という代入文と hoge というコマンドの2つに解釈されている 変数の後に文字列が続く場合も,どこまでが変数名なのか区別するために {} で囲む 必要があります $ echo $HOGEaaa ← HOGEaaa $ echo ${HOGE}aaa hoge hogeaaa という変数は無い(空) ©︎ 2022 tomkimra 41
シェルスクリプト 複数のコマンドを毎回入力するのは手間→「シェルスクリプト」でひとまとめ nano で次のようなスクリプトを作ってみます ( ファイル名を test.sh とします ) #!/bin/bash NAME="ping$(date +%H%M%S).txt" ping localhost -c 4 > $NAME 行目は「実行」した場合にどのプログラムで動作させるかを記述しています 2 行目のように変数を定義できます.シェルスクリプトでは = 前後にスペースを入れ られない点に注意 $() の記法でコマンド実行結果を使うことができます.ここでは今の時分秒を取得 し, ping120533.txt のようなファイルを作っています 1 ©︎ 2022 tomkimra 42
スクリプトに実行権限を与え,実行します.プログラムを実行する際は,同じディ レクトリにあっても ./ から記述する必要があります. $ chmod a+x test.sh $ ./test.sh $ ls ping120533.txt 条件分岐やループ,実行時の引数も設定できるので色々調べてみるとできることが広が るでしょう. ©︎ 2022 tomkimra 43
よく使うコマンド(3): 逆引き ファイルの末尾だけ表示 例えば20行だけ表示する場合 $ tail /var/log/messages -n 20 長いファイルをスクロールしながら表示 $ less /var/log/messages 上下キーで一行ずつ送ることができる. [h] で操作説明を表示, [f][b] で 1 画面ずつ進む / 戻る, [/] で検索する,など色々便利な 機能がある. ©︎ 2022 tomkimra 44
の中から特定の文字列を探して表示 パイプ | で前の出力を後のコマンドの引数として実行する. grep で正規表現の検索. よく使う組み合わせ. ○○ $ sudo apt list | grep opencv $ cat /var/log/auth.log | grep "May 27 10:" 出力を保存もしたいし表示もしたい そんなときは tee コマンド(T字路のように分岐させる) $ date | tee date.txt Fri 27 May 22:54:29 JST 2022 ©︎ 2022 tomkimra 45
おわりに 本資料でLinuxコマンドの「雰囲気」が大体伝わったのではないかと思います.あと は新しいコマンドが出てもその使い方を調べれば分かるようになるのではないかと 期待します. Linux を使ったシステム構築で最重要の systemctl コマンドは, WSL で扱えないため 残念ながら割愛しました シェルスクリプトや sed find などまだまだ使えると非常に便利な機能はたくさんあ ります.少しずつ使えるオプションなどを増やしていくといいかと思います. ©︎ 2022 tomkimra 46