Unix 基礎

1,522
-1

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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×