Upload
sho-akagi
View
1.002
Download
3
Embed Size (px)
Citation preview
2
本スライドについて
• 目的:
– Unix の概念や、一般ユーザとして利用するうえで最低限身につけておくべき知識について解説する
–各コマンドの網羅的な紹介はしない
• 対象者:
– Unix / Linux 初心者
3
本スライド中の各表記について
• プロンプト
– root で実行するコマンドのプロンプトは # で示す
–一般ユーザの場合は $ で示す
• 省略可能な引数は [] で囲う
# command
$ command
$ command arg1 [arg2]
4
本スライドの注意点
• 紹介する方法がすべての環境で通用するとは限らない
– OS やシェルによっては使用できない場合がある
5
UNIX OS
6
OS (Operating System)
• ハードウェアとソフトウェアのやりとりを管理するアプリケーション
– メモリ、CPU、入出力
• 例:
– BSD, Linux, Windows, Mac OS X, Android, etc.
7
Unix
• OS の一つ
• 1969年、AT&T (アメリカの最大手の電話会社) のベル研究所で開発を開始
• マルチタスク
–複数のプログラムがあたかも同時に動いているかのように見える
• マルチユーザ
– 1台のコンピュータを複数のユーザが利用できる
8
ディストリビューション
• OS が流通する形態
• OS = カーネル + ソフトウェア
• BSD
– FreeBSD, OpenBSD, NetBSD, …
• Linux
– Ubuntu, Redhat, CentOS, …
9
スーパーユーザと一般ユーザ
• スーパーユーザ (root)
–システムの管理者
• 一般ユーザ
– root 以外のユーザ
10
グループ
• ユーザの集合
• 全てのユーザは、
– 1つのプライマリグループに必ず所属する
– 0以上のセカンダリグループに所属できる
• 所属するグループは、id コマンドで確認できる
id [user]
11
マニュアル
12
マニュアル
• UNIX には膨大なマニュアルが用意されている
第 1 章 汎用コマンド
第 2 章 システムコール
第 3 章 ライブラリ関数
第 4 章 デバイスとドライバ
第 5 章 ファイル形式
第 6 章 ゲーム
第 7 章 その他
第 8 章 システム管理コマンド
第 9 章 カーネル
13
マニュアル
• man で表示
–例:
man [section] name
$ man manman(1) man(1)
NAMEman - format and display the on-line manual pages
SYNOPSISman [-acdfFhkKtwW] [--path] [-m system] [-p string] [-C config_file][-M pathlist] [-P pager] [-B browser] [-H htmlpager] [-S section_list][section] name ...
14
カーネルとシェル
15
カーネル
• UNIX OS の核となるプログラム
• アプリケーションのための機能を提供する
–プロセス間通信、システムコールなど
アプリケーション
OSカーネル
CPU メモリ デバイス
16
シェル
• カーネルとユーザとの橋渡しをするアプリケーション
–ユーザと対話し、入力を解釈してカーネルに渡し、コマンドを実行する
• 2つの機能:
–ユーザインタフェース機能
–シェルプログラミング機能
17
いろいろなシェル
sh(Bourneシェル)
どの UNIX にも必ず入っている。対話機能は弱い。
bash shの機能を強化したもの。ヒストリ機能など。Linux の標準シェル。
csh BSD 用に開発されたシェル。プログラミング機能が C言語に似ている。
tcsh cshの機能を強化したもの。コマンド補完機能など。
zsh 新しく登場したシェル。様々な独自機能が追加されている。
18
シェルの環境設定
• ログインシェルの設定ファイル
–ログイン時に次の順序で設定ファイルが実行される(Bourne シェルの場合)
1. /etc/profile
2. ~/.profile
• 一時的なシェルの設定ファイル
–一時的にシェルを起動 (コマンドラインで sh と実行) したときは、次のファイルが実行される
• ~/.shrc
• これらのファイルに設定を書けば良い
19
シェルの変更
• ログインシェルの変更
– chshコマンドを使う
• 一時的にシェルを変更
–シェル名をコマンドとして実行する
• 例:
chsh –s newshell [user]
$ bash
20
シェルスクリプト
• UNIXコマンドを羅列したスクリプト
–バッチ処理などで使われる
• ファイル1行目の #! からはじまる記述をシェバン(shebang) という
–スクリプトを読み込むインタプリタを指定する
–例:
#!/bin/sh
21
環境変数
• システムの属性を格納している変数
• 例:
• 値を取得するときは先頭に $ を付ける
PWD カレントディレクトリ
TERM 端末の種類
HOME ホームディレクトリ
LANG 言語設定
PATH コマンドサーチパス
SHELL 使用中のシェル
22
コマンドサーチパス ($PATH)
• シェルがコマンドを探索するディレクトリのリスト
– コロン (:) 区切りで記述
–例:
– これらのディレクトリ内にあるプログラムなら、絶対パスで指定しなくても、プログラム名だけで実行できる
$ echo $PATH/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/sho/bin
23
POSIX (Portable Operating System Interface)
• UNIX の標準的なインターフェースを定めた規格
–移植性の高いソフトウェアの開発を目的として、IEEE が策定した
–各 OS やシェルの独自拡張により、スクリプトなどを別環境に移動すると動作しないことがある
–各環境間での最低限の互換性を確保する
–内容は多岐に渡る
• システムコール、標準ライブラリ、OS コマンド、正規表現など
24
端末
25
端末 (Terminal)
• キーボードとディスプレイが1セットになった装置
–かつては、1台のホストコンピュータに端末を接続して共用するのが主流だった
Host Computer
Terminal
Keyboard
Display
Terminal
Keyboard
Display
Terminal
Keyboard
Display
Terminal
Keyboard
Display
Program
Program
26
端末 (Terminal)
• 端末エミュレータ
–端末をエミューレートするソフトウェア
–エミュレートされた端末を仮想端末という
• telnet や SSH もその一種Server
TerminalEmulator
Client
Virtual Terminal
Keyboard
Display
27
端末 (Terminal)
• 現在使用している端末名を確認するには ttyコマンドを使う
• すべての端末を表示するにはw コマンドを使う
tty
w
28
ファイルとディレクトリ
29
ファイルシステム
• OS の機能の一つ
• 主に補助記憶装置 (HDD など) に格納されたデータを管理する
30
ファイル
• データを格納するための論理的な単位
• 1人のユーザに所有され、1つのグループに属する
–そのグループに、所有者が必ずしも属しているとは限らない
31
ディレクトリ
• ファイルを整理、管理するための木構造
• 木の根をルートディレクトリと言う
• 特別な意味を持つ記号:
–階層はスラッシュ (/) で区切って表記する
–先頭のスラッシュはルートディレクトリを表す
–先頭のチルダ (~) はホームディレクトリを表す
– ドット (.) のみはカレントディレクトリを表す
– 2つのドット (..) のみは1つ上のディレクトリを表す
32
ディレクトリ
• mv, cpには注意
– source, target 名末尾のスラッシュ (/) の有無で動作が変わる場合がある
• ディレクトリ自体か、中身だけか
– target ディレクトリが存在するか否かでも動作が変わる
cp –R source/ target/mv source/ target/
33
inode (あいのーど)
• ファイルシステムで使われているデータ構造
• ファイル、ディレクトリなどのオブジェクトに関する各種情報が格納される
inode番号 ファイルの長さ デバイス ID 所有者のユーザ ID グループ ID パーミッション
各種タイムスタンプ• 更新時刻 (mtime)• 属性変更時刻 (ctime)• 参照時刻 (atime)
参照カウント (その inodeを指すハードリンクの数)
34
inodeとファイル名
• ディレクトリには以下の情報のみを格納
1. そのディレクトリにあるファイルのリスト
2. 対応する inode番号
• inode番号は lsの –iオプションで確認できる
ディレクトリ
File_A.txt
inode番号
ファイル実体
inode番号ファイル実体
inode番号
ファイル実体
inode番号
File_A.txt
inode番号
File_A.txt
inode番号
35
リンク
• ファイルやディレクトリに別名を付けること
–例:
ln [–s] source_file target_file
$ touch hoge$ ln –s hoge fuga$ ls -l | tail +2lrwxr-xr-x 1 sho staff 4 12 20 15:41 fuga -> hoge-rw-r--r-- 1 sho staff 0 12 20 15:41 hoge
36
シンボリックリンクとハードリンク
• シンボリックリンク
– ファイル名へのポインタ
• ハードリンク
– inode番号へのポインタ
ファイル実体
inode番号File_A.txt
File_B.txt
ファイル実体
inode番号File_A.txt
File_B.txt
inode番号inode番号
inode番号
37
パーミッション
38
パーミッション (属性)
• ファイル、ディレクトリごとに定義されるアクセス許可情報
• 所有者 (User)、グループのメンバ (Group)、その他のユーザ (Other) ごとに権限を設定する
– o は other。owner ではないので注意。
r (Read) 読出し権
w (Write) 書込み権
x (eXecute) 実行権
39
パーミッション (属性)
• 各権限ごとに 1bit、計 9bit で表す
• 3bit ごとに区切り、8進数で表現されることがある
–例) rw-r--r-- = 110 100 100 = 644
• 所有者は読み書きができる
• グループのメンバは読み込みができる
• その他のユーザは読み込みができる
r w xr w x r w x
所有者 (u) グループ (g) その他 (o)
40
パーミッションの変更
• chmodを使う
–例:
• 上3つは相対的な指定
• 下2つは絶対的な指定
chmod mode file
$ chmod g+w file1 # group に書込み権を付与$ chmod go-rwx file1 # group と other の全権限を解除$ chmod +x file1 # 全ユーザに実行権を付与$ chmod o=r file1 # other の権限を r-- に変更$ chmod 755 file1 # 755 (rwxr-xr-x) に変更
41
ディレクトリのパーミッション
• ファイルのパーミッションとは意味が異なる
–変更方法は同じく chmod
r (Read) ディレクトリ内のファイルリストを表示できる。
w (Write) ディレクトリ内で・ファイル、サブディレクトリの新規作成・ファイル、サブディレクトリの削除ができる。
x (eXecute) cd でそのディレクトリに移動できる。
42
SUID (Set User ID) bit
• この bit がセットされた実行ファイルは、(実行者ではなく) 所有者の権限で動作する
• 一般ユーザが root 権限でプログラムを実行したりできる
–例:
• SGID というのもある
$ ls -l /usr/bin/passwd-rwsr-xr-x 1 root root 30768 Feb 22 2012 /usr/bin/passwd
43
Sticky bit
• この bit がセットされたディレクトリ配下では、ファイルやディレクトリの所有者 (と root) だけが、リネームや削除を行える
–例:
$ ls -ld /tmpdrwxrwxrwt 2 root root 4096 Feb 27 10:05 /tmp
44
コマンドラインの操作
45
コマンド置換
• コマンドの実行結果を別のコマンドの一部として使える機能
–例:
$ echo "It's" `date +'%Y-%m-%d'`.It's 2013-12-20.$ echo "It's" $(date +'%Y-%m-%d').It's 2013-12-20.
`command`$(command) # こっちだと入れ子にできる
46
入力補完機能
• コマンドやファイル名の入力をシェルが補完 (自動入力) してくれる機能
–入力途中で [Tab] キーを押す
–例:
–複数候補がある場合、リストが表示される
$ ifc
$ ifconfig
47
ワイルドカード
• 複数のファイル名やディレクトリ名を指定する際に使う特殊記号 (メタ文字)
* 任意の文字列
? 任意の1文字
[〜] [ ] 内の任意の1文字
[!〜] [ ] 内にない任意の1文字
{〜,〜,…} { } 内の任意の文字列(カンマで区切る)
48
ワイルドカード
• 例:
$ lscar cart cat com court dog
$ ls c*tcart cat court
$ ls c[ao]?car cat com
$ ls c{art,at}cart cat
49
メタ文字の無効化
• 直前にバックスラッシュ (¥) を付けてエスケープする
–例:
※環境によっては円マークに見える場合がある
• シングルクオートで囲う
–例:
$ touch hoge¥*fuga$ lshoge*fuga
$ touch 'hoge$fuga'
50
シングルクオートとダブルクオート
• スペースなどを含む文字列はクオートで囲う
–ダブルクオートだと、変数やコマンド置換が展開される
–シングルクオートでは展開されない
$ echo "hoge `date`"hoge Tue Jan 21 18:21:55 JST 2014
$ echo 'hoge `date`'hoge `date`
51
ヒストリ
• 以前入力したコマンドを参照する機能
• 使用方法:
– カーソルキー (↑, ↓)
– history コマンド
– Ctrl+R <検索するキーワード>
• 例:
$ Ctrl+Rbck-i-search: ping
52
エイリアス
• コマンドに別名を付けられる機能
–引数も含められる
–例:
$ alias ll='ls –l'$ alias llll='ls -l'$ ll # ls –l と等価(略)
alias name # 現在の設定を表示alias name='value'
53
エイリアス
• 解除は unaliasコマンドを使う
• 既にあるコマンドの上書きもできる
• 元のコマンドを実行するには、コマンドの前にバックスラッシュ (¥) を付ける
unalias name
¥name
54
標準入力と標準出力、標準エラー出力
• 通常、プログラムは端末 (キーボードとディスプレイ) からデータを入出力する
• リダイレクションを使うと、入出力先をファイルなどに切り替えられる
標準入力 (stdin) キーボードからの入力
標準出力 (stdout) ディスプレイへの出力
標準エラー出力 (stderr) ディスプレイへの出力
55
リダイレクト
コマンド < ファイル ファイルから標準入力に入力
コマンド > ファイル 標準出力をファイルに書出し (上書き)
コマンド >> ファイル 標準出力をファイルに書出し (追記)
コマンド >& ファイル標準出力と標準エラー出力をファイルに書出し (上書き)
コマンド >>& ファイル 〃 (追記)
コマンド 2> ファイル 標準エラー出力をファイルに書出し
56
リダイレクト
• 例:
$ echo Hello > hoge.txt # 書出し$ cat hoge.txtHello$ echo World >> hoge.txt # 追記$ cat hoge.txtHelloWorld
$ echo Hello &> /dev/null$
57
/dev/null
• 何もしないデバイス
–書き込まれたデータは捨てられる
–読み込むと常に EOF (End Of File) が返される
• ここにリダイレクトすることで出力を破棄できる
–例:
$ program > /dev/null
$ program 2> /dev/null
$ program &> /dev/null
58
パイプ (|)
• プログラム間で入出力をつなぐ仕組み
–あるプログラムの標準出力を、あるプログラムの標準入力に接続する
–例:
cmd1 | cmd2
$ find . -type f | wc -l6
59
何でもかんでもつながない
• なるべく少ないプロセス数で済ませる
–例:
×
○
×
○
$ cat hoge.txt | grep fuga
$ grep fuga hoge.txt
$ grep fuga hoge.txt | wc -l
$ grep –c hoge.txt fuga
60
連続実行
• セミコロン (;) で区切ることで、複数のコマンドを連続実行できる
–例:
cmd1 ; cmd2
$ echo hello ; datehelloFri Dec 20 20:06:52 JST 2013
61
条件付きで連続実行
• cmd1 が正常終了したら cmd2 を実行する
• cmd1 が異常終了したら cmd2 を実行する
• “正常終了” って?
– コマンドの exit status が 0 だったとき
cmd1 && cmd2
cmd1 || cmd2
62
終了ステータス (exit status, return code)
• コマンドの実行が成功したかどうかを表す数値
–正常終了なら 0
–異常終了なら 1 以上
• 自分でスクリプトを書くときも意識しよう
–例
if (system("which git") != 0) {print STDERR "command not found¥n";exit 1;
}
63
終了ステータス (exit status, return code)
• 直前に実行したコマンドの終了ステータスは、特殊な変数 $? に格納される
–例:
$ mkdir hoge$ echo $?0 # 直前の mkdir は成功
$ mkdir hogemkdir: hoge: File exists$ echo $?1 # 直前の mkdir は失敗
64
アーカイブと圧縮
65
アーカイブ
• 多数のファイルを一つのファイルにまとめること
• tar (Tape ARchives)
–アーカイブのフォーマット
–所有者、グループ、パーミッション、最終更新日時、ディレクトリ構造なども含められる
–同時に gzipなどで圧縮を行なうことが多い
66
圧縮
• データの内容を保ったまま容量を減らすこと
• 可逆圧縮:
–情報が失われない
– bitmap, ZIP, etc.
• 非可逆圧縮:
–圧縮、展開したデータが、元のデータと完全には一致しない
– JPEG, MPEG, etc.
67
ジョブとプロセス
68
ジョブ
• シェルが管理するプログラムの実行単位
–端末ごとに管理される
–それを実行したシェル以外からは参照できない
• 実行中のジョブは jobs コマンドで確認できる
jobs
69
ジョブの中断と再開
• SIGTSTP シグナルを送る (Ctrl-Z) と、フォアグラウンド (現在実行中) のジョブが中断される
• fgコマンドで再開する
–例:
$ less hoge^Z # Ctrl-Z を入力zsh: suspended less hoge # 中断$ jobs[1] + suspended less hoge$ fg # 再開
70
バックグラウンドジョブ
• 裏で実行されているジョブ (次のジョブを実行可)
• 起動方法:
– コマンドのうしろに & を付けて起動する
–中断したジョブを bgコマンドで再開する
• ログアウト時には破棄 (SIGHUP) される
– これを防ぐには nohup コマンドを使う
command &
nohup command &
71
プロセス
• プロセス
– OS が管理するプログラムの実行単位
–実行中のプロセスは psコマンドで確認できる
–例:
ps
$ psPID TT STAT TIME COMMAND
77869 0 Ss 0:00.02 bash79178 0 R+ 0:00.00 ps
72
ジョブとプロセス
• 1ジョブ = 1プロセスとは限らず、1つのジョブに複数のプロセスが属する場合がある
–例:
$ ps auxww | grep root | wc -l
ジョブ
プロセス プロセス プロセス
73
ジョブとプロセス
• 1コマンドで複数のプロセスが起動することもある
–例: man コマンドを中断したときの様子
$ psPID TTY TIME CMD
12609 ttys003 0:00.21 /bin/zsh12965 ttys003 0:00.00 man man12966 ttys003 0:00.00 sh -c (cd '/usr/share/man'… 12967 ttys003 0:00.00 sh -c (cd '/usr/share/man'…12971 ttys003 0:00.00 sh -c (cd '/usr/share/man'… 12973 ttys003 0:00.00 /usr/bin/less -is
74
シグナル
• プロセスに非同期イベントの発生を伝える仕組み
• 発生させるには:
–端末で Ctrl-C (SIGINT)や Ctrl-Z (SIGTSTP) などを押下
– kill コマンドを使用
• 受け取ったシグナルをどう処理するかは、プロセス (プログラム) 側の任意
–ただし SIGKILL など、一部受け取れないものもある
75
その他
76
cron
• コマンドを自動的に定時実行する仕組み
• crontabコマンドで管理する
• 設定ファイルの書式:
–例:月〜金曜、2時間おきに program1 を実行
分 時 日 月 曜日 実行するコマンド
0 */2 * 1-5 /path/to/program1
77
SSH (Secure SHell)
• 安全に遠隔ホストのシェルを利用する仕組み
• 鍵認証を使えばパスワードの入力を省略できる
– クライアントで鍵のペア (秘密鍵、公開鍵) を生成
• ssh-keygenコマンド
–公開鍵をホストに配置
• ~/.ssh/authorized_keys
78
練習問題
79
練習問題
1. 現在のユーザ名を表示せよ。
2. man で id コマンドの –g オプションの意味を調べよ。
3. コマンドサーチパスの先頭にカレントディレクトリ(.) を追加すると、どのようなことが起きるか説明
せよ。また、それを設定するとどのような危険が考えられるか。
4. ルートディレクトリ自身 (中のファイルではなく) のinode番号を確認せよ。
80
練習問題
5. 適当なファイルを用意してシンボリックリンクとハードリンクを設定し、主に以下の点に着目して、2つのリンクの違いを検証せよ。
– コピーしたとき
– 削除したとき
6. パーミッション rwx---r-x を8進数で表わせ。
7. group のパーミッションが other より小さいとき(604 や 705 など) の動作を説明せよ。
81
練習問題
8. 中身が空 (0byte) のファイル empty.txtを作成する方法を、できるだけたくさん挙げよ。
9. シェル変数 NOW に現在の時刻を格納せよ。時刻のフォーマットは次のようにすること。
10.次の名前で空のファイルを作成せよ。
11.ルートディレクトリにあるディレクトリの数を表示せよ。
hoge$fuga
2013-12-24T12:43:52
82
練習問題
12.以下の記述について、コマンドが成功したときに"OK!" と表示するように変更せよ。成功時と失敗時の動作の違いを確認すること。
13.top コマンドを実行して中断し、そのときのジョブ
の状態を確認せよ。また、そのジョブを再開せずに破棄せよ。
$ mkdir test1
83
練習問題
14.shebang 行の記述に関して、以下の2つの違いを
説明せよ。また、後者はどのような利用シーンが考えられるか。
15.適当なファイルを作成し、タイムスタンプを「2013年12月25日19時00分」に変更せよ。さらにそのファイルのmtime と ctimeを確認せよ。
#!/usr/bin/perl#!/usr/bin/env perl
84
参考書籍
• 新Linux/UNIX入門第3版, 林晴比古著
– http://www.amazon.co.jp/dp/4797369841
85
おわり