Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Unix 基礎

4,137 views

Published on

Published in: Technology

Unix 基礎

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

×