Mac ターミナルの基本的な使い方・操作方法(4)プロセスの管理、シグナル、ユーザー管理、ソフトウェアのインストール、ネットワークの基本コマンド
ターミナルを使ったジョブやプロセスの管理やシグナル、ユーザー管理、ソフトウェアのインストール、ネットワークの基本コマンドなどのごく基礎的なことについての覚書です。
作成日:2020年01月27日
関連ページ
- Mac ターミナルの基本的な使い方(1)ターミナルの設定や基本的なコマンド等
- Mac ターミナルの基本的な使い方(2)エディタ: nano と vim
- Mac ターミナルの基本的な使い方(3)シェルスクリプト
- Mac ターミナル zsh の設定・カスタマイズ(シェルオプション)
- Mac ターミナル defaults コマンドの使い方
ジョブとプロセス
ジョブとはシェルが管理している「作業のまとまり(単位)」のことで、シェルから見た実行中のコマンド(一連の処理)のことです。
1つのジョブで実行されるのは 1つのコマンドとは限らず、例えば ls | less のようにパイプを使って実行すると、ls と less の2つのコマンドが実行されますが、これも1つのジョブ(一連の処理)です。
プロセスはシステムから見たプログラムの最小の実行単位で、1つ1つの処理のことです。
ジョブは、プロセスの(1つもしくは複数の)集まりと言えます。
ジョブ
ターミナルから実行されるコマンドは、シェルが「ジョブ」として管理しています。また、それぞれのジョブにはシェルによって「ジョブ番号」が割り当てられます。
フォアグラウンドジョブとバックグラウンドジョブ
ターミナルでコマンドを実行すると、通常はその現在実行しているコマンドの処理(ジョブ)が終了するまで次のプロンプトが表示されず、次のコマンドを実行することはできません。
この現在(前面 = フォアグラウンドで)実行しているジョブを「フォアグラウンドジョブ」と呼び、背後で実行されるジョブを「バックグラウンドジョブ」と呼びます。
1つのターミナルのウィンドウ(またはタブ)で同時に実行できるフォアグラウンドジョブは1つだけですが、バックグラウンドジョブは複数実行することができます。
例えば、sleep というコマンドは指定した秒数だけプログラムの実行を中断するので、以下のように実行すると sleep コマンドがフォアグラウンドジョブとなり 30 秒間プロンプトは表示されません。
sleep 30 return
コマンドの最後に「&」を付けてバックグラウンドジョブとして実行
コマンドを「バックグラウンド」で実行させるには、コマンドの最後に「&」を付けて実行します。すると、そのコマンドの終了を待たずに、すぐにプロンプトが戻り、すぐに次のコマンドを実行できるようになります。
$ sleep 30 & return #バックグラウンドジョブとして実行 [1] 64425 # [ジョブ番号] とプロセス ID $ # すぐにプロンプトが表示されて、コマンドを入力できる状態になる
2行目に表示されている [ ] で囲まれた番号はシェルがジョブを識別する「ジョブ番号」で、その右側の番号は「プロセス ID」です。
処理に時間がかかるコマンドは、バックグラウンドジョブとして実行すれば、その処理の終了を待たずに別のコマンドを実行することができます。
以下は find の結果を csv.txt に保存するコマンドをバックグラウンドで実行する例です。但し、実行する場所によってはアクセス権のないディレクトリを検索しようとするとエラーメッセージが表示されるのでエラーメッセージはヌルデバイスにリダイレクトしています。
$ find . -name "*.csv" 1> csv.txt 2> /dev/null & return [1] 68107 $ # すぐにプロンプトが表示される
複数のバックグラウンドジョブ
以下は3つ(複数)のバックグラウンドジョブを同時に実行した例です。
実行した順にジョブ番号が増加します。また、jobs コマンドを使うと現在実行中のジョブを確認することができます。
$ sleep 30 & return #バックグラウンドジョブとして実行 [1] 64567 $ sleep 20 & return #バックグラウンドジョブとして実行 [2] 64574 $ sleep 10 & return #バックグラウンドジョブとして実行 [3] 64581 $ jobs return #現在実行中のジョブを確認(実行中 Running) [1] Running sleep 30 & [2]- Running sleep 20 & [3]+ Running sleep 10 & $ jobs return #30秒後に現在実行中のジョブを確認 # 以下は return キーを押すことによりジョブが完了している旨の「Done」が表示されたもの # jobs コマンドにより表示されたものではありません [1] Done sleep 30 [2]- Done sleep 20 [3]+ Done sleep 10
バックグラウンドジョブが終了した場合、コマンドラインで return を押すタイミングで完了のメッセージ(Done)が表示されます
複数のバックグラウンドジョブを実行する場合、いかのようにまとめて実行することもできます。
sleep 30 & sleep 20 & sleep 10 & return [1] 64977 [2] 64978 [3] 64979
同様にバックグラウンドジョブとフォアグラウンドジョブをまとめて実行することもできます。
sleep 10 & ls / return [1] 65194 Applications etc # ls / の実行結果がすぐに表示される Library home Network installer.failurerequests Quarantine net System private Users sbin Volumes tmp bin usr cores var dev
フォアグラウンドとバックグラウンドの切り替え
bg コマンドや fg コマンドを使って、フォアグラウンドジョブとして実行中のコマンドをバックグラウンドジョブに切り替えたり、逆にバックグラウンドジョブをフォアグラウンドジョブに切り替えることができます。
出力のあるプロセスのバックグラウンド実行
ping コマンドなどのターミナルに実行結果が出力されるプロセスの場合、バックグラウンドで実行しても結果が出力されてしまいます。コマンドは入力することはできますが、見にくいため操作しずらいです。
ping -c 10 192.168.11.1 & return # バックグラウンドで ping を10回実行 [1] 10835 PING 192.168.11.1 (192.168.11.1): 56 data bytes # 実行結果が出力されてしまう 64 bytes from 192.168.11.1: icmp_seq=0 ttl=64 time=0.539 ms 64 bytes from 192.168.11.1: icmp_seq=1 ttl=64 time=0.567 ms ・・・中略・・・ 64 bytes from 192.168.11.1: icmp_seq=9 ttl=64 time=0.565 ms --- 192.168.11.1 ping statistics --- 10 packets transmitted, 10 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.435/0.571/0.670/0.062 ms
上記の例は -c オプションを指定して10回で終了するようにしていますが、このオプションを指定しないとこのコマンドは継続されます。
また、バックグラウンドで実行しているジョブは control + c で終了することができまん。
そのため、もし以下のように ping コマンドをバックグラウンドで実行した場合、終了するには一度 fg コマンドで ping コマンドをフォアグラウンドにして control + c を押すか、kill コマンドでプロセスを終了させる必要があります。(但し、1秒毎に実行結果が表示されるのでやりにくいですが)
ping 192.168.11.1 & return # バックグラウンドで ping を実行 [1] 11066 ~ $ PING 192.168.11.1 (192.168.11.1): 56 data bytes 64 bytes from 192.168.11.1: icmp_seq=0 ttl=64 time=0.591 ms ・・・中略・・・ fg64 bytes from 192.168.11.1: icmp_seq=4 ttl=64 time=0.680 ms 1 # fg 1 を実行(表示は実行結果と混ざってしまうので見ずらい) ping 192.168.11.1 #ping がフォアグラウンドになる 64 bytes from 192.168.11.1: icmp_seq=5 ttl=64 time=0.685 ms ・・・中略・・・ 64 bytes from 192.168.11.1: icmp_seq=9 ttl=64 time=0.632 ms ^C control + c # 終了 ping 192.168.11.1 & return # バックグラウンドで ping を実行 [1] 11275 ~ $ PING 192.168.11.1 (192.168.11.1): 56 data bytes 64 bytes from 192.168.11.1: icmp_seq=0 ttl=64 time=0.371 ms 64 bytes from 192.168.11.1: icmp_seq=1 ttl=64 time=0.626 ms kill %164 bytes from 192.168.11.1: icmp_seq=2 ttl=64 time=0.592 ms # kill %1 を実行して終了(表示は実行結果と混ざってしまうので見ずらい) [1]+ Terminated: 15 ping 192.168.11.1
出力をリダイレクト
バックグラウンドで実行しているコマンドにより出力される実行結果などが邪魔な場合は、それらをリダイレクトすることができます。
エラーなどで不要な出力は「/dev/null」にリダイレクトし、必要な出力はファイルにリダイレクトします。
以下は ping コマンドを1000回バックグラウンドで実行して、その結果を「ping.txt」というファイルに出力する例です。
ping -c 1000 192.168.11.1 > ping.txt & [1] 11589 # ping コマンドはバックグラウンドで実行されるのでプロンプトが表示され、別のコマンドを実行できる
jobs コマンド
現在実行中または一時停止中のジョブを確認するには jobs コマンドを使います。jobs コマンドはシェルの内部コマンド(組み込みコマンド)です。以下が書式です。
jobs [オプション]
以下のようなオプションがあります。
オプション | 意味 |
---|---|
-l | プロセス ID も表示 |
-n | ステータスが変わったジョブのみを表示 |
-p | プロセス ID のみを表示 |
-r | 実行中(Running)のジョブのみを表示 |
-s | 停止中(Stopped)のジョブのみを表示 |
以下は3つのジョブ(sleep コマンド)をバックグラウンドで実行して jobs で確認する例です。
sleep 3 & sleep 10 & sleep 30 & return [1] 69436 [2] 69437 [3] 69438 jobs return #3秒後に実行 [1] Done sleep 3 [2]- Running sleep 10 & [3]+ Running sleep 30 & jobs -l return # -l オプションを付けて10秒後に実行 [2]- 69498 Done sleep 10 [3]+ 69499 Running sleep 30 & jobs -n return # -n オプションを付けて30秒後に実行 [3]+ Done sleep 30
ジョブ番号の右側の「+」はカレントジョブを、「-」はプリビアスジョブ(一つ前のカレントジョブ)を表します。
ほとんどの場合は、最後に実行したジョブがカレントジョブになりますが、一時停止中のフォアグラウンドジョブがある場合はそのジョブがカレントジョブになります。
Done や Running はコマンドの状態(ステータス)を表し、以下のようなものがあります。
状態(ステータス) | 意味 |
---|---|
Running | 実行中 |
Done | 終了 |
Stopped | 一時停止中 |
Terminated | 強制終了 |
bg コマンド
フォアグラウンドジョブとして実行中のコマンドをバックグラウンドジョブに切り替えるには bg コマンドを使用します。
現在実行中のフォアグラウンドジョブを control + z を押して一時停止させてから bg コマンドを実行します。
以下が bg コマンドの書式です。
bg [%ジョブ番号]
引数(%ジョブ番号)を指定しない場合、カレントジョブが対象になります。
sleep 30 return ^Z control + z #フォアグラウンドジョブを一時停止 [1]+ Stopped sleep 30 bg %1 return #バックグラウンドジョブに切り替え [1]+ sleep 30 & jobs return #プロンプトが表示されるので jobs コマンドを実行 [1]+ Running sleep 30 &
fg コマンド
バックグラウンドジョブをフォアグラウンドジョブに切り替えたり、一時停止されているジョブをフォアグラウンドジョブにするには fg コマンドを使用します。
以下が fg コマンドの書式です。
fg [%ジョブ番号]
bg コマンド同様、引数(%ジョブ番号)を指定しない場合はカレントジョブが対象になります。また、引数に「%-」を指定するとプリビアスジョブ(1つ前のカレントジョブ)が対象になります。
sleep 3 & sleep 10 & sleep 30 & return #3つのジョブをバックグラウンドで実行 [1] 71658 [2] 71659 [3] 71660 jobs return [1] Running sleep 3 & [2]- Running sleep 10 & [3]+ Running sleep 30 & fg %2 return #ジョブ番号2のジョブをフォアグラウンドへ sleep 10 #指定したジョブがフォアグラウンドにくる [1] Done sleep 3
less test.txt & sleep 30 & return # less と sleep をバックグラウンドで実行 [1] 71583 [2] 71584 jobs return # jobs でジョブを確認(less は一時停止状態) [1]+ Stopped less test.txt [2]- Running sleep 30 & fg %1 return #ジョブ番号1のジョブをフォアグラウンドへ less test.txt #指定したジョブがフォアグラウンドにくる
sleep 100 return # sleep を実行 ^Z control + z #sleep を一時停止 [1]+ Stopped sleep 100 fg return # sleep を再開 sleep 100
プロセス
システムから見た実行中のプログラムの最小単位を「プロセス」と呼びます。
プロセスには自動的に起動しているものやシェルからコマンドで実行されるものもあります。また、一つのプログラムから複数のプロセスが生成されることもよくあります。
それぞれのプロセスには「プロセス ID」というシステム全体で重複のない一意の ID 番号(PID)が割り振られます。
プロセスの一覧を表示するには ps コマンドを使います。
ps コマンド
以下が書式です。
ps [オプション]
以下のようなオプションがあります。
オプション | 意味 |
---|---|
-a | 端末を持たないプロセス以外の全てのプロセスを表示 |
-A | 全てのプロセスを表示 |
-c | コマンド全体ではなくコマンド名のみを表示 |
-d | セッションリーダ以外のプロセスを全て表示(※セッションリーダーは「セッション ID ==プロセス ID」のプロセス。セッション ID は子プロセスに継承される。) |
-e | -A と同じ |
-E | environment も表示 |
-f | 表示項目を変更(UID, PID, PPID, C, STIME, TTY, TIME, CMD) |
-j | 表示項目を変更(USER, PID, PPID, PGID, SESS, JOBC, STAT, TT, TIME, COMMAND) |
-l | プロセス詳細情報を表示 |
-m | メモリ使用量によりソートして表示 |
-o | スペースまたはカンマ区切りで指定されたキーワードの情報を表示 (例 ps -o pid, -o %cpu, -o %mem) |
-p | プロセス番号(PID)を指定してそのプロセスを表示 |
-r | CPU 使用量によりソートして表示 |
-u | ユーザー名やユーザーIDを指定してそのユーザーに属するプロセスを表示 |
u | CPU の使用率(%cpu)やメモリの使用率(%mem)なども表示 |
-w | 表示する幅を広げて表示 |
-x | デーモンなど制御端末を持たないプロセスも表示 |
項目 | 意味 |
---|---|
PID | プロセス ID |
TTY | プロセス起動端末(ターミナル名) |
TIME | コマンド実行時間 |
CMD | 実行コマンド名 |
UID | 起動ユーザID |
PPID | 親プロセスID |
C | CPU利用率 |
USER | ユーザー名 |
PGID | プロセスグループID |
PRI | プロセスの優先度 |
SZ | プロセスが確保しているメモリ容量 |
RSS | そのプロセスの実メモリ容量(resident set size) |
S | プロセスの状態 |
以下は ps コマンドの実行例です。
PID はプロセス ID、TTY はターミナル名、TIME はコマンド実行時間、CMD はコマンド名です。
ps return #オプション無しで実行 PID TTY TIME CMD 73582 ttys000 0:00.02 -bash 73619 ttys000 0:00.01 man ps 73620 ttys000 0:00.00 sh -c (cd '/usr/share/man' && /usr/bin/tbl '/usr/share ' 73621 ttys000 0:00.00 sh -c (cd '/usr/share/man' && /usr/bin/tbl '/usr/share' 73624 ttys000 0:00.00 sh -c (cd '/usr/share/man' && /usr/bin/tbl '/usr/share' 73625 ttys000 0:00.00 /usr/bin/less -is 73633 ttys001 0:00.01 -bash ps -ax return # -a と -x オプションを指定して実行 PID TTY TIME CMD 1 ?? 19:09.31 /sbin/launchd 44 ?? 0:06.95 /usr/sbin/syslogd 45 ?? 0:06.75 /usr/libexec/UserEventAgent (System) 48 ?? 0:06.83 /System/Library/PrivateFrameworks/Uninstall.framework/ 49 ?? 0:11.82 /usr/libexec/kextd 50 ?? 2:06.69 /System/Library/Frameworks/CoreServices.framework/Vers 52 ?? 0:00.20 /System/Library/PrivateFrameworks/MediaRemote.framewor 55 ?? 0:01.30 /System/Library/CoreServices/appleeventsd --server 56 ?? 1:29.92 /usr/sbin/systemstats --daemon 58 ?? 0:12.11 /usr/libexec/configd ・・・中略・・・ 73581 ttys000 0:00.02 login -pf xxxxxx 73582 ttys000 0:00.02 -bash 73619 ttys000 0:00.01 man ps 73620 ttys000 0:00.00 sh -c (cd '/usr/share/man' && /usr/bin/tbl '/usr/share' 73621 ttys000 0:00.00 sh -c (cd '/usr/share/man' && /usr/bin/tbl '/usr/share' 73624 ttys000 0:00.00 sh -c (cd '/usr/share/man' && /usr/bin/tbl '/usr/share' 73625 ttys000 0:00.00 /usr/bin/less -is 73680 ttys000 0:00.00 ps -ax 73632 ttys001 0:00.01 login -pf xxxxxx 73633 ttys001 0:00.01 -bash
TTY が「??」になっているものはデーモンなど制御端末を持たないプロセスです。
以下は u オプションと -axm オプションを指定して全てのプロセス(-ax)の CPU の使用率やメモリの使用率の情報も含めてメモリ使用量によりソートして表示(-m)する例です。
ps u -axm return #以下の情報が表示されます USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND #実際の内容は省略
-o オプションを指定して特定の情報のみを表示することもできます。
ps -o pid, -o %cpu, -o %mem return PID %CPU %MEM 74096 0.0 0.0 76022 0.0 0.0 76023 0.0 0.0 ・・・以下省略・・・
-o オプションを指定する際のキーワードは man ps で確認することができます。
KEYWORDS The following is a complete list of the available keywords and their meanings. Several of them have aliases (keywords which are synonyms). %cpu percentage CPU usage (alias pcpu) %mem percentage memory usage (alias pmem) comm command command command and arguments cpu short-term CPU usage factor (for scheduling) etime elapsed running time flags the process flags, in hexadecimal (alias f) gid processes group id (alias group) jobc job control count lim memoryuse limit logname login name of user who started the session lstart time started nice nice value (alias ni) p_ru resource usage (valid only for zombie) pgid process group number pid process ID ppid parent process ID pri scheduling priority rss resident set size ruid real user ID ruser user name (from ruid) sess session ID sl sleep time (in seconds; 127 = infinity) start time started state symbolic process state (alias stat) time accumulated CPU time, user + system (alias cputime) tt control terminal name (two letter abbreviation) tty full name of control terminal uid effective user ID user user name (from UID) utime user CPU time (alias putime) wchan wait channel (as a symbolic name)
親プロセスと子プロセス
プロセスには「親と子」の関係があります。プロセスは処理の過程において別のプロセスを作ることがあり、作られたプロセスが「子プロセス」で元の(作った方の)プロセスが「親プロセス」です。
例えば、ターミナルでシェル(bash)の ps コマンドを実行した場合、シェルのプロセスが「親プロセス」で ps コマンドのプロセスが「子プロセス」になります。
それぞれの子プロセスは、親プロセスの ID(PPID)も保持しています。
ps -a -o pid, -o ppid, -o comm return #PID, PPID, Command を表示 PID PPID COMM 77372 77369 login # ログイン(親の PID は 77369) 77373 77372 -bash # シェル(親の PID は 77372 = ログイン) 77405 77373 ps # ps コマンド(親の PID は 77373 = シェル) ps -p 77369 -o pid, -o ppid, -o comm return # PID 77369 のプロセスを表示 PID PPID COMM 77369 1 /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal #77369 はターミナルのプロセスでその親の PID は 1
全てのプロセスの親プロセス(init)
全てのプロセスの親は「init プロセス」と呼ばれているプロセスで、そのプロセス ID は 1 で Mac OSX の場合は「launchd」が該当します。
ps ax PID TT STAT TIME COMMAND 1 ?? Ss 21:32.31 /sbin/launchd # PID が 1 のプロセス「launchd」 44 ?? Ss 0:07.84 /usr/sbin/syslogd 45 ?? Ss 0:07.69 /usr/libexec/UserEventAgent (System) ・・・以下省略・・・
launchd
伝統的な UNIX 系の OS ではシステムの起動時に「init」と呼ばれるプロセスが起動してシステムの初期化を行っていましたが、MacOS では launchd というプログラム(プロセス)がシステムの初期化や定期的なプログラムの実行、ネットワーク・サーバなどのサービスの管理を行います。
launchd は init に代わって、最初に起動する PID が 1 のプロセスです。
Daemon と Agent
launchd が起動(管理)するサービスは大きく分けて Daemon(デーモン)と Agent(エージェント)に分類されます。
Daemon(デーモン)は、メモリ上に常駐して様々なサービスを提供するプロセス(プログラム)のことで、各種サーバーの管理などシステム全体で実行されるサービスです(root 権限での動作を前提)。
対して、Agent(エージェント)は現在ログインしているユーザーごとに起動されるサービスで、ユーザーごとに実行されるバックエンドサービスを起動する等に使用できます。
launchd の管理する Daemon と Agent のための設定ファイルは、サービスごとに用意され、以下のようなディレクトリに保存されています。
ディレクトリ | 概要 |
---|---|
/System/Library/LaunchDaemons/ | MacOS 標準の Daemon(デーモン) |
/Library/LaunchDaemons/ | 標準以外の Daemon(デーモン) |
/System/Library/LaunchAgents/ | MacOS 標準の Agent(エージェント) |
/Library/LaunchAgents/ | 標準以外の Agent(エージェント) |
/Users/ユーザ名/Library/LaunchAgents/ | ユーザー別に用意された Agent(エージェント) |
MacOS 標準の Daemon の設定ファイルは、デーモンごとに plist ファイルとして保存されています。
ls /System/Library/LaunchDaemons/ return bootps.plist com.apple.AirPlayXPCHelper.plist com.apple.AppleFileServer.plist com.apple.AppleQEMUGuestAgent.plist com.apple.AssetCache.builtin.plist com.apple.AssetCacheLocatorService.plist com.apple.AssetCacheManagerService.plist com.apple.AssetCacheTetheratorService.plist com.apple.CSCSupportd.plist com.apple.CommCenterRootHelper.plist com.apple.CoreAuthentication.daemon.plist com.apple.CoreRAID.plist ・・・中略・・・ com.apple.periodic-daily.plist # 定期的に処理を行うサービスの設定ファイル(毎日) com.apple.periodic-monthly.plist # 定期的に処理を行うサービスの設定ファイル(毎月) com.apple.periodic-weekly.plist # 定期的に処理を行うサービスの設定ファイル(毎週) ・・・中略・・・ org.apache.httpd.plist # Apache の設定ファイル org.cups.cups-lpd.plist org.cups.cupsd.plist org.net-snmp.snmpd.plist org.openldap.slapd.plist ssh.plist tftp.plist # tftpサーバの設定ファイル
MacOS 標準の Agent の設定ファイルも plist ファイルとして保存されています。
ls /System/Library/LaunchAgents/ return com.apple.AOSHeartbeat.plist com.apple.AOSPushRelay.plist com.apple.AccessibilityVisualsAgent.plist com.apple.AddressBook.AssistantService.plist com.apple.AddressBook.ContactsAccountsService.plist com.apple.AddressBook.SourceSync.plist com.apple.AddressBook.abd.plist com.apple.AirPlayUIAgent.plist ・・・中略・・・ com.apple.wifi.WiFiAgent.plist com.apple.xpc.loginitemregisterd.plist com.apple.xpc.otherbsd.plist com.openssh.ssh-agent.plist
top コマンド
top コマンドを使うとプロセスの状態やメモリや CPU の使用状況をリアルタイムで監視できます。
top コマンドを終了するには、q を押します。
以下が書式です。
top [オプション]
以下のようなオプションがあります。
オプション | 意味 |
---|---|
-o キー | 「キー」で指定した項目でソートして表示。キーの前に「+」または「-」を指定して降順、昇順を切り替えることが可能。デフォルトは降順(大きい順) 例:top -o mem (メモリの項目で降順に表示) |
-pid プロセスID | 指定したプロセス ID のプロセスのみを表示 例:top -pid 1 (プロセス ID が1のプロセスのみを表示) |
-user ユーザー | 指定したユーザーのプロセスのみを表示 例:top -user root (ユーザーが root のプロセスのみを表示) |
以下は -o オプションを指定して CPU の項目で降順(値の大きい順)に表示する例です。
top -o cpu return #CPU の項目でソートして表示
上記コマンドを実行すると以下のように表示されます。画面幅や高さを広げればその他の項目も見ることができます。終了するには、q を押します。
アクティビティモニタ
macOS の「アクティビティモニタ」というアプリを使ってもプロセスの一覧や CPU、メモリなどの使用状況を確認することができます。
アプリケーション → ユーティリティ → アクティビティモニタ
表示する項目などはメニューの「表示」から設定(変更)することができます。
プロセスを選択して、左上の「X」印のボタンをクリックするとウィンドウが開くのでそこからプロセスを終了されることができます。
また、プロセスを選択して、左上の「i」印のボタンをクリックするとそのプロセスの詳細を確認でき、このウィンドウからもプロセスを終了されることができます。
シグナル
シグナルはプロセスとプロセスの間で通信(プロセス間通信)を行うための仕組みで、実行中のプロセスの処理を一時停止して別のプロセスを処理する場合などに用いられます。
シグナルはそれぞれシグナル受信時の動作が設定(定義)されていて、この設定によりシグナルが送出された際にプロセスがどのような動作をするかが決まります。
シグナルの種類
プロセスを終了するためのシグナルである SIGTERM や SIGKILL など以外にも多くのシグナルがあります。
システムがサポートしているシグナルの一覧は kill コマンドに -l オプションを指定して実行することで参照することができます。
kill -l return 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGEMT 8) SIGFPE 9) SIGKILL 10) SIGBUS 11) SIGSEGV 12) SIGSYS 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGURG 17) SIGSTOP 18) SIGTSTP 19) SIGCONT 20) SIGCHLD 21) SIGTTIN 22) SIGTTOU 23) SIGIO 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGINFO 30) SIGUSR1 31) SIGUSR2
シグナルはそれぞれ名前と数値による値(番号)が決まっています。番号はシステムによって異なるようです。
番号 | シグナル | デフォルト動作 | 意味 |
---|---|---|---|
1 | SIGHUP | terminate process | 制御端末のハングアップ(切断)、仮想端末の終了 |
2 | SIGINT | terminate process | キーボードからの割り込みシグナル control + c |
3 | SIGQUIT | create core image | キーボードからの中止シグナル |
9 | SIGKILL | terminate process | 強制終了シグナル |
14 | SIGALRM | terminate process | アラームタイマーによる終了 |
15 | SIGTERM | terminate process | 終了シグナル(kill コマンドのデフォルトシグナル) |
18 | SIGTSTP | stop process | 端末(キーボード)からの一時停止シグナル control + z |
ターミナルで man signal と入力して表示される man ページに以下が掲載されています。
No Name Default Action Description 1 SIGHUP terminate process terminal line hangup 2 SIGINT terminate process interrupt program 3 SIGQUIT create core image quit program 4 SIGILL create core image illegal instruction 5 SIGTRAP create core image trace trap 6 SIGABRT create core image abort program (formerly SIGIOT) 7 SIGEMT create core image emulate instruction executed 8 SIGFPE create core image floating-point exception 9 SIGKILL terminate process kill program 10 SIGBUS create core image bus error 11 SIGSEGV create core image segmentation violation 12 SIGSYS create core image non-existent system call invoked 13 SIGPIPE terminate process write on a pipe with no reader 14 SIGALRM terminate process real-time timer expired 15 SIGTERM terminate process software termination signal 16 SIGURG discard signal urgent condition present on socket 17 SIGSTOP stop process stop (cannot be caught or ignored) 18 SIGTSTP stop process stop signal generated from keyboard 19 SIGCONT discard signal continue after stop 20 SIGCHLD discard signal child status has changed 21 SIGTTIN stop process background read attempted from control terminal 22 SIGTTOU stop process background write attempted to control terminal 23 SIGIO discard signal I/O is possible on a descriptor (see fcntl(2)) 24 SIGXCPU terminate process cpu time limit exceeded (see setrlimit(2)) 25 SIGXFSZ terminate process file size limit exceeded (see setrlimit(2)) 26 SIGVTALRM terminate process virtual time alarm (see setitimer(2)) 27 SIGPROF terminate process profiling timer alarm (see setitimer(2)) 28 SIGWINCH discard signal Window size change 29 SIGINFO discard signal status request from keyboard 30 SIGUSR1 terminate process User defined signal 1 31 SIGUSR2 terminate process User defined signal 2
シグナルを送出
シグナルを発生させるには、キー操作や kill コマンドを使用します。
例えば、control + c は「SIGINT」というシグナルを、control + z は「SIGTSTP」というシグナルを送出するキー操作です。
※シグナルとは働きが異なりますが、同じように使用できるキー操作に、入力の終了(EOF)を表す control + d や表示の一時停止と再開を行う control + s と control + q などがあります。
kill コマンド
フォアグラウンドジョブとして実行中のジョブは control + c で終了することができますが、キー操作はバックグラウンドジョブに対しては機能しません。
バックグラウンドジョブを終了させるには kill コマンドを使用します。
以下が kill コマンドの書式です。「シグナル名」の代わりに「シグナル番号」を指定することもできます。
kill [-シグナル名] プロセスID
kill [-シグナル名] %ジョブ番号
シグナル名を省略するとデフォルトの「TERM」シグナルと呼ばれる「プロセスまたはジョブを終了させる」シグナルが送られます。
以下はよく使われるシグナル番号とシグナル名です。
シグナル番号 | シグナル名 | 意味 |
---|---|---|
1 | HUP | hang up(ハングアップ) |
2 | INT | interrupt(割り込み) |
3 | QUIT | quit(終了) |
6 | ABRT | abort(異常終了時に使用) |
9 | KILL | non-catchable, non-ignorable kill(強制終了) |
14 | ALRM | alarm clock(アラームクロック) |
15 | TERM | software termination signal(プロセス終了。デフォルト) |
以下はバックグラウンドジョブとして実行した sleep コマンドを kill コマンドを使って終了する例です。オプションの指定方法が異なりますが、全て同じ内容です。
sleep 100 & return #sleep コマンドをバックグラウンドで実行 [1] 7927 kill %1 return #ジョブ番号を指定(シグナル名を省略→デフォルトの TERM シグナルが送出) [1]+ Terminated: 15 sleep 100 sleep 100 & return #sleep コマンドをバックグラウンドで実行 [1] 7937 kill -TERM 7937 return #PID を指定(シグナル名を指定) [1]+ Terminated: 15 sleep 100 sleep 100 & return #sleep コマンドをバックグラウンドで実行 [1] 7960 kill -15 %1 return #シグナル名の代わりにシグナル番号を指定 [1]+ Terminated: 15 sleep 100
ジョブやプロセスを強制終了(KILL)
暴走しているジョブやプロセスは TERM シグナルを受け付けない場合があります。
そのような場合は KILL シグナル(番号: 9)を使って強制終了することができることがあります。
以下はバックグラウンドジョブとして実行した sleep コマンドを kill コマンドに KILL シグナル(番号: 9)を指定して実行し強制終了する例です。
sleep 100 & sleep 200 & return #2つの sleep コマンドをバックグラウンドで実行 [1] 8274 [2] 8275 kill -KILL %1 return #ジョブ番号とシグナル名(KILL)を指定して強制終了 [1]- Killed: 9 sleep 100 kill -9 8275 return #PID とシグナル番号(KILL の9番)を指定して強制終了 [2]+ Killed: 9 sleep 200
killall コマンド
kill コマンドはプロセス ID やジョブ番号で対象のプロセスを指定するのに対し、killall は「プロセスの名前」を指定することができます。この場合、該当する名前の全てのプロセスにシグナルが送られます。
以下が書式です。
killall [-シグナル名] プロセス名
kill コマンド同様、シグナル名を省略するとデフォルトの「TERM」シグナルが送られます。
以下はバックグラウンドジョブとして実行した3つの sleep コマンドを killall コマンドを使って3つ全てを終了する例です。
sleep 100 & sleep 200 & sleep 300 & return #3つの sleep コマンドをバックグラウンドで実行 [1] 8744 [2] 8745 [3] 8746 killall sleep return #sleep という名前のプロセスを全て終了 # killall -TERM sleep でも同じ [1] Terminated: 15 sleep 100 [2]- Terminated: 15 sleep 200 [3]+ Terminated: 15 sleep 300
sleep 100 & sleep 200 & sleep 300 & return [1] 8891 [2] 8892 [3] 8893 killall -KILL sleep return #-KILL を指定して強制終了 # killall -9 sleep でも同じ [1] Killed: 9 sleep 100 [2]- Killed: 9 sleep 200 [3]+ Killed: 9 sleep 300
ユーザとグループ
Unix 系の OS では1台のコンピュータを複数のユーザで使用できるように設計されています(マルチユーザシステム)。そして複数のユーザをまとめて管理する「グループ」という単位があり、各ユーザは少なくとも1つのグループに属します。
また、ファイルやディレクトリには「所有者」「所有者グループ」「その他」という単位でアクセス権を設定でき、「所有者グループ」に属するユーザには、「所有者グループ」のアクセス権が有効になります。
ユーザやグループの管理(追加や削除など)は macOS の場合、「システム環境設定」の「ユーザとグループ」で行います。
自分や特定のユーザが属しているグループは groups コマンドや id コマンドで確認することができます。
関連項目:ファイルのアクセス権限
groups コマンド
groups コマンドはユーザの属するグループを表示します。ユーザを指定しない場合は、自分の属するグループが表示されます。以下が書式です。
groups [ユーザ]
groups return # 自分の属するグループを表示 staff everyone localaccounts _appserverusr admin _appserveradm _lpadmin com.apple.sharepoint.group.1 com.apple.sharepoint.group.4 com.apple.sharepoint.group.2 _appstore _lpoperator _developer _analyticsusers com.apple.access_ftp com.apple.access_screensharing com.apple.access_ssh com.apple.sharepoint.group.3 groups bar return # ユーザ bar の属するグループを表示(通常ユーザ:管理者権限なし) staff everyone localaccounts com.apple.sharepoint.group.1 com.apple.sharepoint.group.4 com.apple.sharepoint.group.2 _lpoperator com.apple.sharepoint.group.3 groups root return # root の属するグループを表示 wheel daemon kmem sys tty operator procview procmod everyone staff certusers localaccounts admin com.apple.sharepoint.group.1 com.apple.sharepoint.group.4 com.apple.sharepoint.group.2 _appstore _lpadmin _lpoperator _developer _analyticsusers com.apple.access_ftp com.apple.access_screensharing com.apple.access_ssh com.apple.sharepoint.group.3
但し、man groups を見ると「The groups utility has been obsoleted by the id(1) utility ...」とあり id コマンドに -Gn オプションを指定しても同じ結果が得られます。
id -Gn return #id コマンドで属するグループを表示 staff everyone localaccounts _appserverusr admin _appserveradm _lpadmin com.apple.sharepoint.group.1 com.apple.sharepoint.group.4 com.apple.sharepoint.group.2 _appstore _lpoperator _developer _analyticsusers com.apple.access_ftp com.apple.access_screensharing com.apple.access_ssh com.apple.sharepoint.group.3
管理者の場合、「admin」というシステム管理用のグループに属しています。
プライマリグループ
groups コマンドや id -Gn で最初に表示されるグループがそのユーザのデフォルトのグループで「プライマリグループ」と呼びます。
管理者を含む一般ユーザのプライマリグループは「staff」になります。
また、スーパーユーザ(root)のプライマリグループは「wheel」です。
ユーザ ID とグループ ID
システムの内部ではユーザ名とグループ名は「ユーザ ID」(uid)、「グループ ID」(gid)という ID 番号で管理されています。
ユーザ ID(uid)やグループ ID(gid)は id コマンドで確認することができます。
id コマンド
id コマンドはユーザー名とグループ名、および ID を表示します。ユーザを指定しない場合は、自分のユーザー名と属するグループ名、および ID が表示されます。以下が書式です。
id [オプション] [ユーザ]
以下のようなオプションがあります。
オプション | 意味 |
---|---|
-A | プロセス監査用(?)の値を表示 |
-F | フルネームを表示 |
-G | グループ ID のみをスペース区切りで表示。-n オプションを同時に指定するとグループ名で表示 |
-P | ID をパスワードファイルエントリとして表示 |
-g | 実効グループ ID を数字で表示 |
-n | -G,-g,-u オプションと併用して番号の代わりに名前で表示 |
-p | 出力を人間が読みやすいよう(human-readable)に表示。ID 番号は表示されない。 |
-u | 実効ユーザ ID を数字で表示 |
id return uid=501(xxxxx) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),701(com.apple.sharepoint.group.1),704(com.apple.sharepoint.group.4),702(com.apple.sharepoint.group.2),33(_appstore),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh),703(com.apple.sharepoint.group.3) id bar return # ユーザ bar を指定 uid=503(bar) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),701(com.apple.sharepoint.group.1),704(com.apple.sharepoint.group.4),702(com.apple.sharepoint.group.2),100(_lpoperator),703(com.apple.sharepoint.group.3) id root return # ユーザ root を指定 uid=0(root) gid=0(wheel) groups=0(wheel),1(daemon),2(kmem),3(sys),4(tty),5(operator),8(procview),9(procmod),12(everyone),20(staff),29(certusers),61(localaccounts),80(admin),701(com.apple.sharepoint.group.1),704(com.apple.sharepoint.group.4),702(com.apple.sharepoint.group.2),33(_appstore),98(_lpadmin),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh),703(com.apple.sharepoint.group.3) id -Gn return # -Gn オプションを指定して所属グループを表示 staff everyone localaccounts _appserverusr admin _appserveradm _lpadmin com.apple.sharepoint.group.1 com.apple.sharepoint.group.4 com.apple.sharepoint.group.2 _appstore _lpoperator _developer _analyticsusers com.apple.access_ftp com.apple.access_screensharing com.apple.access_ssh com.apple.sharepoint.group.3 id -p return # -p オプションを指定してユーザ名とグループ名を表示 uid xxxxx groups staff everyone localaccounts _appserverusr admin _appserveradm _lpadmin com.apple.sharepoint.group.1 com.apple.sharepoint.group.4 com.apple.sharepoint.group.2 _appstore _lpoperator _developer _analyticsusers com.apple.access_ftp com.apple.access_screensharing com.apple.access_ssh com.apple.sharepoint.group.3
「uid=」で表示されているのがユーザ ID(ユーザ名)で、「gid」で表示されているのがプライマリグループのグループ ID(グループ名)です。
「groups=」にはユーザの属する全てのグループ ID(グループ名)が表示されています。
ユーザ ID は macOS の場合、登録した順に「501」から番号が割り振られます。
スーパーユーザ(root)のユーザ ID は「0」で、「wheel」グループのグループ ID も「0」です。
ファイルの所有者と所有グループの変更
新規にファイルを作成すると、ファイルの所有者は作成したユーザ、所有グループはファイルを作成したユーザのプライマリーグループになっています。
これらは chown コマンド、chgrp コマンドを使って変更することができます。
chown コマンド
chown コマンドではファイルの所有者や所有グループを変更することができます。
以下が書式です。
chown [オプション] ユーザ名 ファイルのパス (所有者を変更)
chown [オプション] ユーザ名:グループ名 ファイルのパス (所有者と所有グループを変更)
chown [オプション] :グループ名 ファイルのパス (所有グループを変更)
以下のようなオプションがあります。
オプション | 意味 |
---|---|
-R | ファイルとディレクトリを再帰的に変更 |
-v | 処理した内容を出力 |
所有者や所有グループを変更するにはスーパーユーザの権限が必要なので sudo コマンドを使って実行します。
ls -l sample01.txt return # 所有者を確認 -rw-r--r-- 1 bar staff 0 1 24 11:42 sample01.txt sudo chown foo sample01.txt return # 所有者を bar から foo に変更 Password: ****** return # パスワードを入力して return ls -l sample01.txt return # 所有者を確認 -rw-r--r-- 1 foo staff 0 1 24 11:42 sample01.txt sudo chown bar:everyone sample01.txt return # 所有者を foo から bar に、所有グループを staff から everyone に変更 ls -l sample01.txt return # 所有者を確認 -rw-r--r-- 1 bar everyone 0 1 24 11:42 sample01.txt sudo chown :staff sample01.txt return # 所有グループを everyone から staff に変更 ls -l sample01.txt return # 所有グループを確認 -rw-r--r-- 1 bar staff 0 1 24 11:42 sample01.txt
ディレクトリ配下の全てのファイルやディレクトリを変更するには -R オプションを指定します。
以下は test ディレクトリ以下のファイル及びディレクトリの所有者を全て foo に変更する例です。
sudo chown -R foo test return #test ディレクトリ以下の全ての所有者を foo に変更 Password: ****** return # パスワードを入力して return sudo chown -vR foo test return # -v オプションを指定すると変更されたファイルやディレクトリが表示されます test/01.txt test/.DS_Store test/sample01.txt ・・・
chgrp コマンド
所有グループを変更するには chgrp コマンドを使います。所有グループを変更できるのは、ファイルの所有者かスーパーユーザだけで、ファイルの所有者が変更する場合は、その所有者が変更後のグループに属している必要があります。
以下が書式です。
chgrp [オプション] ユーザ名 ファイルのパス
以下のようなオプションがあります。
オプション | 意味 |
---|---|
-R | ファイルとディレクトリを再帰的に変更 |
-v | 処理した内容を出力 |
以下は sample02.txt の所有グループを staff から everyone に変更する例です。必要に応じて sudo コマンドを使って実行します。
ls -l sample02.txt return #所有グループを確認 -rw-r--r-- 1 foo staff 0 1 24 11:43 sample02.txt chgrp everyone sample02.txt return# 所有グループを staff から everyone に変更 ls -l sample02.txt -rw-r--r-- 1 foo everyone 0 1 24 11:43 sample02.txt
chown コマンド同様、-R オプションを指定すると配下の全てのファイルとディレクトリの所有グループを変更することができます。
ファイルの圧縮と展開
コマンドラインで圧縮ファイルを作成・解凍(展開)することができます。MacOS では zip 形式が標準ですが、ファイルの圧縮形式(フォーマット)は色々あります。
拡張子 | 圧縮形式 | 説明 |
---|---|---|
.zip | zip | zip 形式の圧縮アーカイブ |
.gz | gzip | gzip 形式で圧縮されたファイル |
.bz2 | bzip2 | bzip2 形式で圧縮されたファイル |
.tar | tar | tar 形式のアーカイブ |
.tar.gz | tar + gzip | tar 形式のアーカイブを gzip 形式で圧縮されたファイル |
.tgz | tar + gzip | .tar.gz の短縮形(別名) |
.tar.Z | tar + compress | tar 形式のアーカイブを compress 形式で圧縮されたファイル |
.tar.bz2 | tar + bzip2 | tar 形式のアーカイブを bzip2 形式で圧縮されたファイル |
アーカイブは複数のファイルやフォルダを1つにまとめることで、アーカイブファイルは「複数のファイルやフォルダを1つにまとめた」ファイルです。
また、アーカイブする際に圧縮されることもあり、それを「圧縮アーカイブ」と呼びます(例:zip)。
.tar.gz(または .tgz)は「tar ボール」と呼ばれることもあります。この形式は Finder でも展開(解凍)することができますが、圧縮はコマンドラインで行う必要があります。
圧縮ファイルの作成・展開
以下はファイルを圧縮・展開するコマンドです。
これらのコマンドで圧縮できるのは個々のファイルのみで、複数のファイルをまとめるアーカイブ機能はありません。
gzip / gunzip コマンド
gzip はファイルを圧縮するコマンドで、gunzip は圧縮ファイルを展開する(元に戻す)コマンドです。
gzip と gunzip は実際は同じコマンドで、gzip というコマンド名で実行されたら圧縮を行い、-d を指定するか gunzip というコマンド名で実行したら展開(解凍)を行います。
以下が書式です。
gzip [オプション] ファイルのパス
gunzip [オプション] ファイルのパス
以下のようなオプションがあります。
オプション | 意味 |
---|---|
-1~-9 | 圧縮レベル。-1:低圧縮率(高速)、-9:高圧縮率(低速)、デフォルトは -6 |
-c | 結果をファイルではなく標準出力へ出力(主にパイプで別コマンドに渡す際に使用) |
-d | 展開(解凍)を行う(gunzip) |
-k | 圧縮前(展開前)のファイル(元のファイル)を残す |
-l | 圧縮率と圧縮前及び圧縮後のファイルサイズを表示。-v オプションと併用すると圧縮メソッドや CRC も表示。但し、圧縮時に指定すると「not in gzip format」というエラーになります。 |
-r | ディレクトリを再帰的に処理(指定したディレクトリ下の全てのファイルを1つずつ圧縮) |
-v | 処理内容(圧縮率)を表示 |
以下は sample.txt というファイルを圧縮する例です。-v オプションで処理内容(圧縮率)を表示し、-k オプションで元のファイルを削除せずに残しています。
圧縮されたファイルには「.gz」という拡張子が付きます。
ls -lh sample.txt return # ファイルを確認 -rw-r--r-- 1 foo staff 61K 9 5 17:11 sample.txt gzip -vk sample.txt return # -vk オプションを指定して圧縮 sample.txt: 91.5% -- replaced with sample.txt.gz ls -lh sample.txt.gz return # 圧縮されたファイルを確認 -rw-r--r-- 1 foo staff 5.1K 9 5 17:11 sample.txt.gz
以下は gunzip コマンドに -l オプションを指定して圧縮率と圧縮前及び圧縮後のファイルサイズを表示する例です。-l オプションを指定した場合、情報が表示されるだけで展開はされないようです。
gunzip -l sample.txt.gz return #圧縮率と圧縮前及び圧縮後のファイルサイズを表示 compressed uncompressed ratio uncompressed_name 5237 62297 91.5% sample.txt gunzip -vl sample.txt.gz return #-v オプションも指定して CRC なども表示 method crc date time compressed uncompressed ratio uncompressed_name defla bf8dcc06 Sep 5 17:11 5237 62297 91.5% sample.txt
以下は gunzip コマンドに -k オプションを指定して gzip 形式のファイルを展開(解凍)する例です。-k オプションを指定しない場合は、元のファイルは削除されます。
gunzip -k sample.txt.gz return #ファイルを展開(解凍) #以下のように gzip コマンドに -d オプションを指定しても同じことです gzip -dk cs_sample.txt.gz
ディレクトリ内のファイルをまとめて圧縮・展開
-r オプションを使うと、指定したディレクトリ内の全てのファイルを1つずつ圧縮(展開)することができます。
ls -l foo return #foo ディレクトリ内の一覧表示 total 384 -rw-r--r-- 1 foo staff 62297 9 5 17:11 sample1.txt -rw-r--r-- 1 foo staff 62297 9 5 17:11 sample2.txt -rw-r--r-- 1 foo staff 62297 9 5 17:11 sample3.txt gzip -r foo/ return # -r オプションを指定してfoo ディレクトリ内のファイルを全て圧縮 ls -l foo return #全て gzip 形式で圧縮されている total 48 -rw-r--r-- 1 foo staff 5235 9 5 17:11 sample1.txt.gz -rw-r--r-- 1 foo staff 5235 9 5 17:11 sample2.txt.gz -rw-r--r-- 1 foo staff 5235 9 5 17:11 sample3.txt.gz gunzip -r foo/ return # -r オプションを指定してfoo ディレクトリ内のファイルを全て展開 ls -l foo return #全て解凍されている total 384 -rw-r--r-- 1 foo staff 62297 9 5 17:11 sample1.txt -rw-r--r-- 1 foo staff 62297 9 5 17:11 sample2.txt -rw-r--r-- 1 foo staff 62297 9 5 17:11 sample3.txt
bzip2 / bunzip2 コマンド
bzip2 / bunzip2 コマンドは gzip / gunzip よりも新しいコマンドで、ファイルの圧縮率も高いとされています。
gzip / gunzip とほぼ同じようなオプションを指定することができますが、再帰的に圧縮する「-r」オプションがない等全く同じではありません。
bzip2 はファイルを圧縮するコマンドで、bunzip2 は圧縮ファイルを展開する(元に戻す)コマンドです。
bzip2 と bunzip2 は実際は同じコマンドで、bzip2 というコマンド名で実行されたら圧縮を行い、-d を指定するか bunzip2 というコマンド名で実行したら展開(解凍)を行います。
圧縮したファイルの拡張子は、gzip の「.gz」に対し、bzip2 では「.bz2」になります。
以下が書式です。
bzip2 [オプション] ファイルのパス
bunzip2 [オプション] ファイルのパス
以下のようなオプションがあります。
オプション | 意味 |
---|---|
-1~-9 | 圧縮レベル。-1:低圧縮率(高速)、-9:高圧縮率(低速)、デフォルトは -6 |
-c | 結果をファイルではなく標準出力へ出力(主にパイプで別コマンドに渡す際に使用) |
-d | 展開(解凍)を行う(bunzip2) |
-k | 圧縮前(展開前)のファイル(元のファイル)を残す |
-v | 処理内容(圧縮率)を表示 |
以下は sample.txt というファイルを圧縮する例です。-vk オプションを指定して処理内容(圧縮率)を表示し、元のファイルを削除せずに残しています。
bzip2 -vk sample1.txt return sample1.txt: 11.275:1, 0.710 bits/byte, 91.13% saved, 62297 in, 5525 out.
以下は bunzip2 コマンドを使って圧縮ファイルを展開(解凍)する例です。
以下の例の場合、sample1.txt.bz2 が解凍され sample1.txt に変換されます(元のファイルは -k オプションを指定していないので削除されます)。
bunzip2 -v sample1.txt.bz2 return sample1.txt.bz2: done #以下のように bzip2 コマンドに -d オプションを指定しても同じです bzip2 -vd sample1.txt.bz2
アーカイブの作成・展開
アーカイブとは複数のファイルやフォルダをひとまとめにする(1つのファイルにまとめて管理する)ことで、アーカイブして(tar コマンドなどを使って)作成したファイルをアーカイブファイルと言います。
アーカイブファイルは1つのファイルに変換されるので、そのまま内容を読み出すことができないため、内容を読み出すにはアーカイブする前の元のファイルの状態に戻す作業(展開)が必要になります。
また、アーカイブしたファイルを gzip コマンドを使って圧縮したり、tar コマンドを使ってアーカイブする際にオプションを指定して圧縮することができます。
以下は tar コマンドを使ってアーカイブを作成・展開する方法についてです。
tar コマンド
以下がおおまかな書式です。
tar [オプション] [アーカイブファイル名] [ファイルやディレクトリのパス]
- [オプション]
- 以下の表を参照
- [アーカイブファイル名]
- -f オプションを指定してアーカイブファイルのファイル名を指定。ファイル名には「.tar」という拡張子を付けます。-z オプションを付けた場合は「.tar.gz」または「.tgz」、-j オプションを付けた場合は「.tar.bz2」という拡張子を付けます。
- [ファイルやディレクトリのパス]
- アーカイブするファイルまたはディレクトリを指定します(絶対パスで指定しない)。複数指定する場合は、ファイル名やディレクトリ名をスペース区切りで指定します。ワイルドカードの指定も可能です。
以下のような機能(操作)を指定するオプションがあります。以下のオプションのいずれか1つを指定する必要があります。
オプション | 意味 |
---|---|
-c | 新しいアーカイブを作成 |
-r | アーカイブの最後にファイルを追加 |
-t | アーカイブの内容を一覧表示 |
-u | アーカイブ内のファイルより新しいファイルのみ追加(指定したファイルの中でアーカイブ内に存在しないファイル、または更新されたファイルを追加) |
-x | アーカイブからファイルを(解凍し)展開 |
以下は共通で指定できるオプションの一部です。
オプション | 意味 |
---|---|
-f file | アーカイブファイル名(file)を指定。-f オプションの直後にファイル名を記述するため、このオプションは全オプションの最後に記述。 |
-C directory | カレントディレクトリを指定したディレクトリ(directory)に変更してから実行。アーカイブの作成や追加(-c や -r)の場合はファイルを追加する前にディレクトリを変更し、アーカイブからファイルを展開(-x)する場合はアーカイブを開いた後、展開する前にディレクトリを変更。 |
-j | アーカイブファイルを bzip2 形式で圧縮・展開 |
-k | 展開する際に既存のファイルを置き換えない(上書きしない) |
-v | 処理内容を詳しく出力 |
-w | 各操作に対して確認を行う |
-z | アーカイブファイルを gzip 形式で圧縮・展開 |
-Z | アーカイブファイルを compress 形式で圧縮・展開 |
--exclude pattern | pattern で指定したファイルを除外 |
圧縮なしのアーカイブの作成
以下は圧縮なしのアーカイブを作成する場合の書式です。
tar -cvf アーカイブファイル名 ファイルやディレクトリのパス
- -c:新しいアーカイブを作成するオプション(機能オプション)
- -v:処理内容を詳しく表示するオプション
- -f:作成するアーカイブファイルの名前を指定するオプション
アーカイブファイル名には .tar という拡張子を付けます。
以下はカレントディレクトリにある foo というディレクトリ内のファイルをアーカイブする例です。
. └── foo ├── sample1.txt ├── sample2.txt └── sample3.txt
ls foo return # foo 内のファイルを確認 sample1.txt sample2.txt sample3.txt tar -cvf foo_arc.tar foo/ return #foo というディレクトリ内のファイルをアーカイブ a foo a foo/.DS_Store # 隠しファイル .DS_Store もアーカイブされる a foo/sample1.txt a foo/sample2.txt a foo/sample3.txt
Mac でフォルダを開くと「.DS_Store」という不可視ファイルが自動的に生成されてしまいます。
「.DS_Store」をアーカイブに含めないように(除外)するには、以下のような方法が考えられます(もっと良い方法があるかも知れません)。
-exclude オプションを使う方法
ls -a foo return # foo 内のファイルを ls -a で確認 . .DS_Store sample2.txt # 自動的に生成される .DS_Store がある .. sample1.txt sample3.txt tar --exclude .DS_Store -cvf foo_arc.tar foo/ return # .DS_Store を除外してアーカイブ a foo a foo/sample1.txt a foo/sample2.txt a foo/sample3.txt
-w オプションを指定してアーカイブに含めるファイルを1つ1つ確認する方法
tar -cvwf foo_arc.tar foo/ return # -w オプションを追加指定してアーカイブ add 'foo' (y/N)? y # foo をアーカイブするかを聞かれるので y と入力し return a foo add 'foo/.DS_Store' (y/N)? n #.DS_Store を追加するかを聞かれるので n と入力してスキップ add 'foo/sample1.txt' (y/N)? y a foo/sample1.txt add 'foo/sample2.txt' (y/N)? y a foo/sample2.txt add 'foo/sample3.txt' (y/N)? y a foo/sample3.txt
アーカイブする前に「.DS_Store」を削除する方法
ls -a foo return . .DS_Store sample2.txt .. sample1.txt sample3.txt rm foo/.DS_Store return # .DS_Store を削除 remove foo/.DS_Store? y ls -a foo return . .. sample1.txt sample2.txt sample3.txt tar -cvf foo_arc.tar foo/ return # アーカイブを作成 a foo a foo/sample1.txt a foo/sample2.txt a foo/sample3.txt
圧縮なしのアーカイブの作成(対象ディレクトリの指定)
例えばカレントディレクトリに「test」というディレクトリがありその中の「foo」というディレクトリの中のファイルをアーカイブする場合の例。
. └── test └── foo ├── sample1.txt ├── sample2.txt └── sample3.txt
対象ファイルを「test/foo/」のように指定すると、アーカイブは以下のように「test」の中に「foo」がある構造になります。このアーカイブを展開すると「test」ディレクトリの中に「foo」ディレクトリがありその中に3つのファイルが展開されます。
tar -cvf foo_arc.tar test/foo/ return # アーカイブを作成 a test/foo a test/foo/sample1.txt a test/foo/sample2.txt a test/foo/sample3.txt test $ tar -tvf foo_arc.tar return # アーカイブの中身を確認 drwxr-xr-x 0 xxxxx staff 0 1 25 17:05 test/foo/ -rw-r--r-- 0 xxxxx staff 6148 1 25 18:03 test/foo/.DS_Store -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 test/foo/sample1.txt -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 test/foo/sample2.txt -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 test/foo/sample3.txt
以下は上記と同じディレクトリで -C オプションを使う例です。この場合、「test」ディレクトリに移動して、そこで「foo」ディレクトリのアーカイブを実行したのと同じ結果になります。
このアーカイブを展開すると「test」はなく、「foo」ディレクトリの中に3つのファイルが展開されます。
tar -C test/ -cvf foo_arc.tar foo/ return # アーカイブを作成 a foo a foo/.DS_Store a foo/sample1.txt a foo/sample2.txt a foo/sample3.txt tar -tvf foo_arc.tar return # アーカイブの中身を確認 drwxr-xr-x 0 xxxxx staff 0 1 25 19:16 foo/ -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 foo/sample1.txt -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 foo/sample2.txt -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 foo/sample3.txt
圧縮なしのアーカイブの作成(ワイルドカードで指定)
アーカイブを作成する際に、複数のファイルを指定する場合はファイル名をスペース区切りで指定します。
また、ワイルドカード(*)を使って指定することもできます。
以下はカレントディレクトリにある画像ファイル(拡張子が .jpg のファイル)を全てアーカイブする例です。
. ├── 1.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg ├── 5.jpg ├── 6.jpg ├── sample1.txt ├── sample2.txt └── sample3.txt
tar -cvf jpg_arc.tar *.jpg return # 拡張子が .jpg のファイルのアーカイブを作成 a 1.jpg a 2.jpg a 3.jpg a 4.jpg a 5.jpg a 6.jpg tar -tvf jpg_arc.tar *.jpg return # アーカイブの中身を確認 -rw-r--r-- 0 xxxxx staff 25471 4 21 2019 1.jpg -rw-r--r-- 0 xxxxx staff 28638 4 21 2019 2.jpg -rw-r--r-- 0 xxxxx staff 22724 4 21 2019 3.jpg -rw-r--r-- 0 xxxxx staff 36783 4 21 2019 4.jpg -rw-r--r-- 0 xxxxx staff 29389 4 21 2019 5.jpg -rw-r--r-- 0 xxxxx staff 27083 4 21 2019 6.jpg
アーカイブの中身を確認
以下はアーカイブの中身を確認する場合の書式の例です。
tar -tvf アーカイブファイル名
- -t:アーカイブの内容を一覧表示するオプション(機能オプション)
- -v:処理内容を詳しく表示するオプション
- -f:作成するアーカイブファイルの名前を指定するオプション
以下はアーカイブファイル「foo_arc.tar」の内容を一覧表示する例です。
tar -tvf foo_arc.tar return drwxr-xr-x 0 xxxxx staff 0 1 25 16:30 foo/ -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 foo/sample1.txt -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 foo/sample2.txt -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 foo/sample3.txt tar -tf foo_arc.tar return #-v オプションを指定しない場合 foo/ foo/sample1.txt foo/sample2.txt foo/sample3.txt
圧縮なしのアーカイブの展開
以下は圧縮なしのアーカイブを作成する場合の書式の例です。
tar -xvf アーカイブファイル名
- -x:アーカイブからファイルを展開するオプション(機能オプション)
- -v:処理内容を詳しく表示するオプション
- -f:作成するアーカイブファイルの名前を指定するオプション
※デフォルトではカレントディレクトリに展開されます。
以下はアーカイブファイル「foo_arc.tar」を展開する例です。
この例では展開先を指定していないのでカレントディレクトリに展開され、同名のディレクトリやファイルがあれば上書きされます。
tar -xvf foo_arc.tar return x foo/ x foo/sample1.txt x foo/sample2.txt x foo/sample3.txt
上書きしないようにするには -k オプションを指定します。
tar -xvkf foo_arc.tar return x foo/: Already exists # 同名のディレクトリやファイルがある場合は上書きされません。 x foo/sample1.txt: Already exists x foo/sample2.txt: # 同名のファイルがない場合はそのファイルは展開されます x foo/sample3.txt: Already exists tar: Error exit delayed from previous errors.
圧縮なしのアーカイブの展開(展開先の指定)
-C オプションを使って展開先のディレクトリを指定することができます。
以下はカレントディレクトリにある bar というディレクトリに展開する例です。
tar -xvf foo_arc.tar -C bar/ return tree bar return #展開先を tree コマンドで確認 bar └── foo ├── sample1.txt ├── sample2.txt └── sample3.txt
参考:tree コマンド
tree コマンドはディレクトリの階層構造を表示してくれるコマンドです。
但し、tree コマンドは標準でインストールされていないので、別途インストールする必要があります。Homebrew パッケージのインストール
gzip 形式の圧縮アーカイブの作成・展開
最近の tar コマンドにはアーカイブファイルを圧縮する機能が備えられています。
gzip 形式の圧縮ファイルを作成するには -z オプションを追加します。
tar -cvzf アーカイブファイル名 ファイルやディレクトリのパス
- -c:新しいアーカイブを作成するオプション(機能オプション)
- -v:処理内容を詳しく表示するオプション
- -z:アーカイブファイルを gzip 形式で圧縮するオプション
- -f:作成するアーカイブファイルの名前を指定するオプション
圧縮アーカイブの拡張子は .tar.gz または .tgz にします。
以下はカレントディレクトリにある foo というディレクトリ内のファイルをアーカイブして圧縮する(圧縮アーカイブを作成する)例です。
. └── foo ├── sample1.txt ├── sample2.txt └── sample3.txt
tar -cvzf foo_arc.tar.gz foo/ return #圧縮アーカイブを作成 a foo a foo/sample1.txt a foo/sample2.txt a foo/sample3.txt
上記は以下のようにアーカイブを作成して、そのファイルを圧縮するのと同じです。
tar -cvf foo_arc.tar foo/ return #アーカイブを作成 a foo a foo/sample1.txt a foo/sample2.txt a foo/sample3.txt gzip foo_arc.tar return #アーカイブを圧縮(foo_arc.tar.gz が作成される)
アーカイブ内のファイルの一覧を表示するには -tvzf オプションを指定します。
tar -tvzf アーカイブファイル名
tar -tvzf foo_arc.tar.gz return #アーカイブ内のファイルの一覧を表示 drwxr-xr-x 0 xxxxx staff 0 1 25 20:32 foo/ -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 foo/sample1.txt -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 foo/sample2.txt -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 foo/sample3.txt
アーカイブを展開するには -xvzf オプションを指定します。
tar -xvzf アーカイブファイル名
tar -xvzf foo_arc.tar.gz return #アーカイブを展開 x foo/ x foo/.DS_Store x foo/sample1.txt x foo/sample2.txt x foo/sample3.txt
bzip2 形式の圧縮アーカイブの作成・展開
bzip2 形式の圧縮ファイルを作成するには -j オプションを追加します。
tar -cvjf アーカイブファイル名 ファイルやディレクトリのパス
- -c:新しいアーカイブを作成するオプション(機能オプション)
- -v:処理内容を詳しく表示するオプション
- -j:アーカイブファイルを bzip2 形式で圧縮するオプション
- -f:作成するアーカイブファイルの名前を指定するオプション
圧縮アーカイブの拡張子は .tar.bz2 にします。
以下はカレントディレクトリにある foo というディレクトリ内のファイルをアーカイブして圧縮する(圧縮アーカイブを作成する)例です。
tar -cvjf foo_arc.tar.bz2 foo/ return #圧縮アーカイブを作成 a foo a foo/sample1.txt a foo/sample2.txt a foo/sample3.txt tar -tvjf foo_arc.tar.bz2 foo/ return #アーカイブ内のファイルの一覧を表示 drwxr-xr-x 0 xxxxx staff 0 1 26 07:18 foo/ -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 foo/sample1.txt -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 foo/sample2.txt -rw-r--r-- 0 xxxxx staff 62297 9 5 17:11 foo/sample3.txt tar -xvjf foo_arc.tar.bz2 foo/ return #アーカイブを展開 x foo/ x foo/sample1.txt x foo/sample2.txt x foo/sample3.txt
ソフトウェアのインストール
ターミナルを使ってソフトウェア(アプリケーション)をインストールするにはパッケージ管理システムを使うと簡単です。
パッケージ管理システムとはソフトウェアをインストール、アンインストールする際に各種ライブラリなどの依存関係を管理してくれる仕組みで、パッケージ名を指定してインストールコマンドを実行するとソフトウェアをダウンロード、インストールしてくれます。
パッケージ管理システムを使わない場合は、ソフトウェアのソースをダウンロードし、コンパイルしてインストールします。
Homebrew
Homebrew は macOS 用のパッケージ管理システムのひとつで、Git(バージョン管理システム)と Ruby で構築されています。
インストール
現在は Homebrew をインストールする際に「Command Line Tools for Xcode」が入っていない場合は、は自動的にインストールされるので、自分で Xcode や Command Line Tools for Xcode をインストールする必要はありません(インストールの途中で聞かれます)。
Homebrew を使うには Xcode または Command Line Tools for Xcode が必要なので Mac App Store からダウンロード及びインストールしておきます(サイズが大きいので時間がかかります)。
Xcode のインストール(不要)
Xcode をインストールしたら、コマンドラインで使用するための「コマンドライン・デベロッパ・ツール(command line developer tools)」をターミナルを使って xcode-select --install コマンドでインストールします。
以下のようなウィンドウが表示されるので「インストール」をクリックすると「使用許諾契約」が表示されるので問題なければ「同意する」をクリックするとインストールが開始されます。
Homebrew 本体のインストール
Homebrew をインストールするには、 Homebrew のページの「インストール」の下に記載されているスクリプトをコピーしてターミナルで実行します。
スクリプト全文をコピーしてもよいですし、右側のボタンをクリックしてコピーすることもできます。
ターミナルにペーストして return キーを押して実行すると、パスワードを求められるのでログイン時のパスワードを入力します。
続いて return キーを押すと、スクリプトが何をするかの説明が表示されます。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ==> Checking for `sudo` access (which may request your password)... Password: //パスワードを入力して return //インストールされるファイルやディレクトリ、付与される権限などの説明が表示されます ==> This script will install: /usr/local/bin/brew /usr/local/share/doc/homebrew /usr/local/share/man/man1/brew.1 /usr/local/share/zsh/site-functions/_brew /usr/local/etc/bash_completion.d/brew /usr/local/Homebrew ==> The following existing directories will be made group writable: /usr/local/bin ==> The following existing directories will have their owner set to xxxxx(ユーザ名): /usr/local/bin ==> The following existing directories will have their group set to admin: /usr/local/bin ==> The following new directories will be created: /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks // Xcode Command Line Tools もインストールされます ==> The Xcode Command Line Tools will be installed. //続行する場合は return キーを押します(中止するには、それ以外のキーを押します) Press RETURN/ENTER to continue or any other key to abort:
The Xcode Command Line Tools will be installed( Xcode Command Line Tools がインストールされます)。Press RETURN/ENTER to continue or any other key to abort(続行する場合は RETURN/ENTER を押してください)と表示されるので、インストールを続行する場合は return を押すと、再度パスワードを求められるので先ほどと同じパスワードを入力します。
途中で、「Command Line Tools for Xcode」と「Homebrew」のダウンロードやインストールなどが実行されるので、多少時間がかかります。
以下のように「==> Installation successful!」と表示され、「Next steps:」に「Run brew help to get started」と表示されれば完了です。
一応念の為、以下のコマンドを実行して状態を確認します。または、brew help コマンドを実行してヘルプが表示されれば OK です。
brew doctor return # 問題がなければ以下のように表示されます Your system is ready to brew.
※ 最後の「Next steps:」に「Run these xxxx commands in your terminal to add Homebrew to your PATH」のようなパスを通すようにというメッセージが表示される場合は、そこに表示されたコマンドを1つずつコピーしてターミナルで実行してパスを通す必要があります。
使い方(コマンド)
Homebrew を操作するには brew コマンドを使います。以下が書式です。
brew サブコマンド
ヘルプを表示するにはサブコマンド help を使って以下のように実行します。
brew help return # 書式などヘルプの内容が表示されます Example usage: brew search [TEXT|/REGEX/] brew info [FORMULA...] brew install FORMULA... brew update brew upgrade [FORMULA...] brew uninstall FORMULA... brew list [FORMULA...] Troubleshooting: brew config brew doctor brew install --verbose --debug FORMULA Contributing: brew create [URL [--no-fetch]] brew edit [FORMULA...] Further help: brew commands brew help [COMMAND] man brew https://docs.brew.sh
FORMULA(フォーミュラ)
FORMULA(フォーミュラ)はパッケージの情報が記述されたファイル(ビルド方法・インストール手順が記述されたスクリプト)で、通常「フォーミュラ名」は「パッケージ名」と同じになります。
コマンドの一覧はサブコマンド commands で確認できます。
brew commands return ==> Built-in commands --cache commands install readall uninstall --cellar config leaves reinstall unlink --env deps link search unpack --prefix desc list sh unpin --repository diy log shellenv untap --version doctor migrate style update analytics fetch missing switch update-report cask gist-logs options tap update-reset cat help outdated tap-info upgrade cleanup home pin tap-pin uses command info postinstall tap-unpin vendor-install ・・・以下省略・・・
個々のコマンドの詳細(書式やオプション)は brew help [COMMAND] で確認できます。
brew help search # search サブコマンドの例 Usage: brew search [options] [text|/text/] # 書式 ・・・中略・・・ -v, --verbose Make some output more verbose. -d, --debug Display any debugging information. -h, --help Show this message.
パッケージのインストール
パッケージをインストールするには install サブコマンドを使ってフォーミュラ名(パッケージ名)を指定します。以下が書式です。
brew install フォーミュラ名
以下は UNIX コマンドの「tree」をインストールする例です。
brew install tree return
以下のようにファイルがダウンロードされインストールされます。
「tree」コマンドのファイルは /usr/local/Cellar/tree/1.8.0 にインストールされます。
ls /usr/local/Cellar/tree/1.8.0 return CHANGES README share INSTALL_RECEIPT.json TODO LICENSE bin
パッケージのインストール先
インストールされるコマンドのファイルやライブラリは /usr/local/Cellar/ にパッケージ名のディレクトリが作成されその中に格納されます。
インストールした tree コマンドで /usr/local/Cellar/ を確認すると、この例の場合は「tree」のみがインストールされているので以下のようになります。
tree /usr/local/Cellar/ return /usr/local/Cellar/ └── tree └── 1.8.0 ├── CHANGES ├── INSTALL_RECEIPT.json ├── LICENSE ├── README ├── TODO ├── bin │ └── tree └── share └── man └── man1 └── tree.1 6 directories, 7 files
また、/usr/local/bin/tree にシンボリックリンクが張られます。
ls -l /usr/local/bin/tree return lrwxr-xr-x 1 xxxx admin 29 1 20 11:40 /usr/local/bin/tree -> ../Cellar/tree/1.8.0/bin/tree
フォーミュラの情報の表示
フォーミュラの情報を表示するにはサブコマンド info を使用します。
brew info フォーミュラ名
brew info tree return tree: stable 1.8.0 (bottled) Display directories as trees (with optional color/HTML output) http://mama.indstate.edu/users/ice/tree/ /usr/local/Cellar/tree/1.8.0 (8 files, 117KB) * Poured from bottle on 2020-01-20 at 11:40:47 From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/tree.rb ==> Analytics install: 24,804 (30 days), 81,858 (90 days), 346,737 (365 days) install-on-request: 22,892 (30 days), 75,339 (90 days), 313,975 (365 days) build-error: 0 (30 days)
Homebrew ではそれぞれのパッケージの情報(インストール方法など)をフォーミュラと呼ばれる Ruby のスクリプトで記述されたファイルで管理しています。
フォーミュラは「」に保存されています。
ls /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/ return a2ps.rb libopennet.rb a52dec.rb liboping.rb aacgain.rb libopusenc.rb aalib.rb libosinfo.rb aamath.rb libosip.rb aardvark_shell_utils.rb libosmium.rb abcde.rb libotr.rb abcl.rb libowfat.rb ・・・以下省略・・・
パッケージの削除
パッケージを削除するにはサブコマンド uninstall を使用します。
brew uninstall フォーミュラ名
主なサブコマンド
コマンド | 概要 |
---|---|
brew doctor | Homebrew を診断 |
brew config | Homebrew の設定一覧 |
brew help | ヘルプを表示 |
brew commands | コマンドの一覧を表示 |
brew install フォーミュラ名 | (フォーミュラ名で)指定したパッケージをインストール |
brew uninstall フォーミュラ名 | 指定したパッケージを削除 |
brew info フォーミュラ名 | 指定したパッケージ(フォーミュラ)の情報を表示 |
brew upgrade フォーミュラ名 | 指定したパッケージを最新版に更新 |
brew upgrade | インストール済みのパッケージを最新版に更新 |
brew options フォーミュラ名 | 指定したパッケージのインストールする際のプションを表示 |
brew outdated | 最新ではないパッケージの一覧を表示 |
brew list | インストール済みのパッケージの一覧を表示 |
brew update | Homebrew 本体を更新 |
brew search キーワード | キーワードにマッチするパッケージを検索 |
brew home フォーミュラ名 | 指定したパッケージの Web サイトを表示 |
Error: homebrew-core is a shallow clone.
2020 年 12 月以降に Homebrew でパッケージをインストールしたりしようとすると次のようなエラーが表示される場合があります。
以下のエラーにも記述されていますが、これは Homebrew が今まで Git リポジトリの shallow clone を利用していたため更新に負荷がかかりすぎ、GitHub からの要請で shallow ではない clone を使うように変更になったためのようです。
Error: homebrew-core is a shallow clone. To `brew update`, first run: git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow This command may take a few minutes to run due to the large size of the repository. This restriction has been made on GitHub's request because updating shallow clones is an extremely expensive operation due to the tree layout and traffic of Homebrew/homebrew-core and Homebrew/homebrew-cask. We don't do this for you automatically to avoid repeatedly performing an expensive unshallow operation in CI systems (which should instead be fixed to not use shallow clones). Sorry for the inconvenience!
解決策は、エラーで示されたコマンドを実行するだけです(リポジトリのパスは環境によって異なるので、実際に表示された git コマンドの部分をコピーして実行します)。
$ git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow return //完了するには数分かかります。 remote: Enumerating objects: 818446, done. remote: Counting objects: 100% (818398/818398), done. remote: Compressing objects: 100% (276038/276038), done. remote: Total 808453 (delta 545530), reused 792299 (delta 529534), pack-reused Receiving objects: 100% (808453/808453), 298.95 MiB | 13.67 MiB/s, done. Resolving deltas: 100% (545530/545530), completed with 8393 local objects. From https://github.com/Homebrew/homebrew-core ad653ecce91..d85b23ecf5c master -> origin/master
ソースコードを利用
Hombebrew などのパッケージ管理システムを使わずに、ソースコードをダウンロードしてそれをコンパイルしてインストールする方法もあります。
但し、必要なライブラリの依存関係を解決したりするために configure というスクリプトファイルを実行して環境に合わせた Makefile を作成するなど、パッケージ管理システムを使う方法に比べて手間がかかります。
以下は一般的なおおまかな手順です(インストールするソフトウェアにより異なる場合があるので README ファイル等から手順を確認する必要があります)。
- 圧縮されたソースコード(配布パッケージ)をダウンロード
- configure スクリプトを実行して Makefile を作成
- make コマンドでコンパイル
- make install コマンドでインストール
configure
配布パッケージに含まれるスクリプトファイル。実行することで、インストールに必要な環境変数やライブラリなどが正しく設定(設置)されているか等がチェックされ、Makefile が作成されます。
configure を使うことでソフトウェアがインストールされる環境が自動的に調べられ、その環境に合わせた Makefile が自動的に作成されます。
make コマンド
引数なしで実行することで Makefile を参照し、その設定に従ってコンパイルなどの処理を実施します。
make install コマンド
make コマンドの引数に install を指定してソフトウェアをインストールします。
以下は NcFTP Client という FTP クライアントをインストールする例です。
特に理由がなければ Hombebrew を使ったほうが簡単にインストールできますし、削除や管理も簡単だと思います(Hombebrew を使うことをお勧めします)。
※ 試した限りでは、ターミナルで make uninstall コマンドで削除ができませんでしたので注意が必要です。また、マニュアルにも削除方法が記載されていないようです。
$ sudo make uninstall return make: *** No rule to make target `uninstall'. Stop.
圧縮されたソースコード(配布パッケージ)をダウンロード
NcFTP のソースファイルをダウンロードページの「Download NcFTP Client」セクションからダウンロードします。
または wget がインストールされていれば以下のようにターミナルからダウンロードすることもできます。
wget ftp://ftp.ncftp.com/ncftp/ncftp-3.2.6-src.tar.gz return --2020-01-21 09:18:25-- ftp://ftp.ncftp.com/ncftp/ncftp-3.2.6-src.tar.gz => `ncftp-3.2.6-src.tar.gz' ftp.ncftp.com (ftp.ncftp.com) をDNSに問いあわせています... 209.197.102.38 ftp.ncftp.com (ftp.ncftp.com)|209.197.102.38|:21 に接続しています... 接続しました。 ・・・中略・・・ 長さ: 636425 (622K) (確証はありません) ncftp-3.2.6-src.tar 100%[===================>] 621.51K 593KB/s 時間 1.0s 2020-01-21 09:18:29 (593 KB/s) - `ncftp-3.2.6-src.tar.gz' へ保存終了 [636425]
tar コマンドにオプション -xvzf を指定してダウンロードしたソースファイルを解凍します。
tar -xvzf ncftp-3.2.6-src.tar.gz return x ncftp-3.2.6/ x ncftp-3.2.6/autoconf_local/ x ncftp-3.2.6/autoconf_local/acconfig.h x ncftp-3.2.6/autoconf_local/aclocal.m4 x ncftp-3.2.6/config.h.in x ncftp-3.2.6/configure x ncftp-3.2.6/configure.in x ncftp-3.2.6/doc/ x ncftp-3.2.6/doc/CHANGELOG.txt ・・・以下省略・・・
README でインストール手順を確認します。以下は README.txt の抜粋です。
To build NcFTP and the utility programs, you can simply do the following: 1. (Optional) Install ncurses (available from a GNU mirror). 2. Run the "./configure" script in the NcFTP source directory. 3. (Probably not necessary) Inspect the Makefiles in each subdirectory. 4. (Probably not necessary) Browse and edit config.h. 5. "make" 6. "make install"
configure スクリプトを実行
展開した ncftp-3.2.6 ディレクトリに移動して configure スクリプトを実行して Makefile を生成します。
cd ncftp-3.2.6 return ./configure return creating cache ./config.cache checking if you set and exported the environment variable CC... no (configure will try to locate a suitable C compiler) checking for environment variable CFLAGS... no (we will choose a default set for you) checking for environment variable CPPFLAGS... no checking for environment variable LDFLAGS... no checking for environment variable LIBS... no checking for clang C compiler... /usr/bin/clang checking if CC should now be set... /usr/bin/clang checking for gcc... /usr/bin/clang checking whether the C compiler (/usr/bin/clang ) works... yes checking whether the C compiler (/usr/bin/clang ) is a cross-compiler... no checking whether we are using GNU C... yes checking whether /usr/bin/clang accepts -g... yes checking platform... macosx10.14.6 ・・・中略・・・ checking LIBS... updating cache ./config.cache creating ./config.status creating Makefile creating Makefile.bin creating ncftp/Makefile creating libncftp/Makefile creating Strn/Makefile creating sio/Makefile creating sh_util/Makefile creating vis/Makefile creating config.h
念の為、エラーがないかや Makefile が作成されていることを確認します。
make コマンドでコンパイル
Makefile が作成されているディレクトリで make コマンドを引数無しで実行してコンパイルします。
make return Compiling DStrCat.c: [OK] Compiling DStrFree.c: [OK] Compiling Dynscpy.c: [OK] ・・・中略・・・ Compiling version.c: [OK] Compiling ncftpbookmarks: [OK] Done making NcFTP full-screen utilities. total 2408 -rwxr-xr-x 1 xxxxxx staff 295100 1 21 09:45 ncftp -rwxr-xr-x 1 xxxxxx staff 213176 1 21 09:45 ncftpbatch -rwxr-xr-x 1 xxxxxx staff 137400 1 21 09:45 ncftpbookmarks -rwxr-xr-x 1 xxxxxx staff 199032 1 21 09:45 ncftpget -rwxr-xr-x 1 xxxxxx staff 168572 1 21 09:45 ncftpls -rwxr-xr-x 1 xxxxxx staff 203312 1 21 09:45 ncftpput lrwxr-xr-x 1 xxxxxx staff 10 1 21 09:45 ncftpspooler -> ncftpbatch Done. ** Please report any problems to http://www.NcFTP.com/contact/ **
make install コマンドでインストール
make コマンドの引数に install を指定してソフトウェアをインストールします。
/usr/local/bin に書き込む権限が必要なため sudo コマンドで実行します。
sudo make install return Password: #パスワードを入力 Done making NcFTP. Done making NcFTP shell utilities. Done making NcFTP full-screen utilities. mkdir -p "/usr/local" "/usr/local/bin" "/usr/local/etc" "/usr/local/share/man" "/usr/local/share/man/man1" 2>/dev/null ..... Installing the programs ..... ・・・中略・・・ /usr/bin/install -c -m 644 doc/man/ncftpls.1 "/usr/local/share/man/man1/ncftpls.1" ..... Finishing up ..... /usr/local/bin: -rwxr-xr-x 1 root admin 295100 1 21 09:57 ncftp -rwxr-xr-x 2 root admin 213176 1 21 09:57 ncftpbatch -rwxr-xr-x 1 root admin 137400 1 21 09:57 ncftpbookmarks -rwxr-xr-x 1 root admin 199032 1 21 09:57 ncftpget -rwxr-xr-x 1 root admin 168572 1 21 09:57 ncftpls -rwxr-xr-x 1 root admin 203312 1 21 09:57 ncftpput -rwxr-xr-x 2 root admin 213176 1 21 09:57 ncftpspooler Done installing NcFTP.
/usr/local/bin/ に NcFTP 関連のコマンドが複数インストールされます。
ls /usr/local/bin/ brew ncftpbatch ncftpput prl_perf_ctl prlsrvctl idn2 ncftpbookmarks ncftpspooler prlcore2dmp tree kav ncftpget prl_convert prlctl wget ncftp ncftpls prl_disk_tool prlexec
マニュアルもインストールされるので man ncftp で見ることができます。
ネットワークの基本コマンド
ネットワークやネットワークインターフェースの状態の確認やテストに使える基本的なコマンドの例です。
ifconfig コマンド
ifconfig コマンドはネットワークインターフェースの確認/設定をするコマンドです。パラメータのオプションを指定しない場合は、現在の設定の状態を表示してくれます。
以下が書式です。
ifconfig [オプション] [インターフェース] ...
状態を確認する場合などに指定できるオプションには以下のようなものがあります(一部抜粋)。
オプション | 意味 |
---|---|
-a | 全て(all)のインタフェースごとのネットワーク設定を表示(インターフェースを指定しない場合のデフォルト) |
-l | システムに認識されている全てのインターフェース名のみを表示 |
-d | 停止(down)しているインターフェース名のみを表示 |
-u | 起動(up)しているインターフェース名のみを表示 |
-v | 詳細を表示(リンクスピード、品質判定などを表示) |
-m | インタフェースがサポートするメディア一覧も表示 |
以下は ifconfig を使ってネットワーク環境を確認する例です。
ifconfig return lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP> inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 nd6 options=201<PERFORMNUD,DAD> gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 stf0: flags=0<> mtu 1280 XHC0: flags=0<> mtu 0 XHC20: flags=0<> mtu 0 en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 //Ethernet options=10b<RXCSUM,TXCSUM,VLAN_HWTAGGING,AV> ether 80:5a:14:56:19:20 inet6 fe80::1866:24b4:d622:ad01%en0 prefixlen 64 secured scopeid 0x6 inet6 240b:12:6080:d100:93:2037:6de:1f4b prefixlen 64 autoconf secured inet6 240b:12:6080:d100:3939:811:fdf4:d96b prefixlen 64 autoconf temporary inet 192.168.11.3 netmask 0xffffff00 broadcast 192.168.11.255 nd6 options=201<PERFORMNUD,DAD> media: autoselect (1000baseT <full-duplex,flow-control,energy-efficient-ethernet>) status: active en2: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500 options=60<TSO4,TSO6> ether 7a:00:bc:c5:65:00 media: autoselect <full-duplex> status: inactive ・・・中略・・・ en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 //Wi-Fi ether a4:83:e7:4a:5a:30 inet6 fe80::c83:974f:3212:c0bf%en1 prefixlen 64 secured scopeid 0xb inet 192.168.11.4 netmask 0xffffff00 broadcast 192.168.11.255 inet6 240b:12:6080:d100:cd5:44ca:ac35:1815 prefixlen 64 autoconf secured inet6 240b:12:6080:d100:e52b:a15f:522e:8928 prefixlen 64 autoconf temporary nd6 options=201<PERFORMNUD,DAD> media: autoselect status: active ・・・以下省略・・・
en0 や en2 などを「インタフェース名」と呼びます。lo は「ローカルループバック」と呼ばれる特別な仮想インタフェースで、lo の IP アドレスには 必ず 127.0.0.1が割り当てられす。
ifconfig -l return #認識されているインターフェース名のみを表示 lo0 gif0 stf0 XHC0 XHC20 en0 en2 en3 bridge0 ap1 en1 p2p0 awdl0 utun0 ifconfig -d return #停止(down)しているインターフェース名のみを表示 gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 stf0: flags=0<> mtu 1280 XHC0: flags=0<> mtu 0 XHC20: flags=0<> mtu 0 ap1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500 ether a6:84:e7:4a:5a:38 media: autoselect status: inactive ifconfig -v en0 return #インターフェース(en0)を指定して詳細を表示 en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 index 6 eflags=410009c0<ACCEPT_RTADV,TXSTART,RXPOLL,ARPLL,ECN_ENABLE,FASTLN_ON> options=10b<RXCSUM,TXCSUM,VLAN_HWTAGGING,AV> ether 80:4a:15:6d:09:11 inet6 fe80::1866:24b4:d622:ad01%en0 prefixlen 64 secured scopeid 0x6 inet6 240b:12:6080:d100:93:2037:6de:1f4b prefixlen 64 autoconf secured inet6 240b:12:6080:d100:3939:811:fdf4:d96b prefixlen 64 autoconf temporary inet 192.168.11.3 netmask 0xffffff00 broadcast 192.168.11.255 nd6 options=201<PERFORMNUD,DAD> media: autoselect (1000baseT <full-duplex,flow-control,energy-efficient-ethernet>) status: active //以下が詳細(リンクスピード、品質判定など) type: Ethernet //Wi-Fi の場合はここが Wi-Fi になる link quality: 100 (good) state availability: 0 (true) scheduler: FQ_CODEL link rate: 1.00 Gbps qosmarking enabled: yes mode: none low power mode: disabled
ping コマンド
ping コマンドは、指定したネットワーク上のホストが応答するか(疎通可能な状態か)どうかや応答時間を調べるコマンドです。
ping コマンドは、「ICMP ECHO」というパケットを送ってその応答を確認します。
以下が書式です。
ping [オプション] 接続先 IP アドレスまたはホスト名
以下のようなオプションがあります。
オプション | 意味 |
---|---|
-c 回数 | パケットを送る回数 |
-i 秒数 | パケット送信の間隔の秒数を設定(デフォルトは1秒) |
-m TTL値 | パケット寿命(Time To Live)の値(数値)を設定 |
-t 秒数 | 指定された時間(秒)経過後、コマンドを終了 |
-v | 詳細な出力を行う |
-s サイズ | 送出するパケットのサイズを指定(デフォルトは64バイト:ヘッダ 8 + データ 56) |
以下は IP アドレス 192.168.11.1 に対して ping コマンドを実行する例です。
デフォルトでは1秒毎に64(56+8)バイトのパケットを送信して TTL 値 と応答時間が表示されます。
終了するには control + c を押します。
ping 192.168.11.1 return # IP アドレス 192.168.11.1 に対して ping コマンドを実行 # デフォルトでは1秒毎に64バイトのパケットを送信して応答時間が表示される PING 192.168.11.1 (192.168.11.1): 56 data bytes 64 bytes from 192.168.11.1: icmp_seq=0 ttl=64 time=0.579 ms 64 bytes from 192.168.11.1: icmp_seq=1 ttl=64 time=0.617 ms 64 bytes from 192.168.11.1: icmp_seq=2 ttl=64 time=0.478 ms 64 bytes from 192.168.11.1: icmp_seq=3 ttl=64 time=0.472 ms 64 bytes from 192.168.11.1: icmp_seq=4 ttl=64 time=0.469 ms ^C control + c を押して終了 --- 192.168.11.1 ping statistics --- # テスト結果 5 packets transmitted, 5 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.469/0.523/0.617/0.062 ms
テスト結果(ping statistics)には以下のような値が表示されます。
項目 | 意味 | |
---|---|---|
packets transmitted | 送信されたパケット数 | |
packets received | 応答のあった(受信した)パケット数 | |
packet loss | パケット紛失率 | |
round-trip | min | パケットが戻るまでの時間の最小値 |
avg | パケットが戻るまでの時間の平均値 | |
max | パケットが戻るまでの時間の最大値 | |
stddev | パケットが戻るまでの時間の標準偏差 |
以下はホスト名に対して ping コマンドを実行する例です。
ping example.com return # ホスト名に対して ping コマンドを実行 PING example.com (93.184.216.34): 56 data bytes 64 bytes from 93.184.216.34: icmp_seq=0 ttl=54 time=117.648 ms 64 bytes from 93.184.216.34: icmp_seq=1 ttl=54 time=117.536 ms ^C control + c を押して終了 --- example.com ping statistics --- 2 packets transmitted, 2 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 117.536/117.592/117.648/0.056 ms
以下は応答がない(タイムアウトする)場合の例です。
ping コマンドに応答がない場合はホストがダウンしていたりネットワークに問題がある可能性がありますが、ホストによってはセキュリティ上などの理由から ping コマンドに応答しないように設定されている場合もあります。
ping 192.168.2.22 return PING 192.168.2.22 (192.168.2.22): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2 Request timeout for icmp_seq 3 ^C control + c --- 192.168.2.22 ping statistics --- 5 packets transmitted, 0 packets received, 100.0% packet loss
表示の一時停止 control + s
control + s を押すと表示が一時停止されます(バックグラウンドでは実行されています)。表示を再開するには control + q を押します。
パケットを送る回数を指定
-c オプションを使うとパケットを送信する回数を指定することができます。
ping -c 3 192.168.11.1 return #パケットを3回のみ送る PING 192.168.11.1 (192.168.11.1): 56 data bytes 64 bytes from 192.168.11.1: icmp_seq=0 ttl=64 time=0.499 ms 64 bytes from 192.168.11.1: icmp_seq=1 ttl=64 time=0.465 ms 64 bytes from 192.168.11.1: icmp_seq=2 ttl=64 time=0.579 ms --- 192.168.11.1 ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.465/0.514/0.579/0.048 ms
以下は回線の品質を確認するためにパケットを1000回送信する例です。
また、その間に別のコマンドを実行できるようにバックグラウンドで実行させ、実行結果はファイルに保存するようにしています。
ping -c 1000 192.168.11.1 > ping.txt & [1] 11589 # バックグラウンドで実行したのでジョブ番号とプロセスIDが表示される
パケット送信の間隔を指定
パケット送信の間隔はデフォルトは1秒ですが、-i オプションを使って送信の間隔を設定できます。
ping -i 3 192.168.11.1 return #パケットを3秒間隔で送信 PING 192.168.11.1 (192.168.11.1): 56 data bytes 64 bytes from 192.168.11.1: icmp_seq=0 ttl=64 time=0.659 ms 64 bytes from 192.168.11.1: icmp_seq=1 ttl=64 time=0.580 ms 64 bytes from 192.168.11.1: icmp_seq=2 ttl=64 time=0.572 ms 64 bytes from 192.168.11.1: icmp_seq=3 ttl=64 time=0.586 ms ^C control + c --- 192.168.11.1 ping statistics --- 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.572/0.599/0.659/0.035 ms
指定時間経過後にコマンドを終了
-t オプションを使うと指定した時間(秒数)後にコマンドを自動的に終了することができます。
ping -t 5 192.168.11.1 return #5秒後に自動的に終了 PING 192.168.11.1 (192.168.11.1): 56 data bytes 64 bytes from 192.168.11.1: icmp_seq=0 ttl=64 time=0.637 ms 64 bytes from 192.168.11.1: icmp_seq=1 ttl=64 time=0.631 ms 64 bytes from 192.168.11.1: icmp_seq=2 ttl=64 time=0.600 ms 64 bytes from 192.168.11.1: icmp_seq=3 ttl=64 time=0.625 ms 64 bytes from 192.168.11.1: icmp_seq=4 ttl=64 time=0.572 ms --- 192.168.11.1 ping statistics --- 5 packets transmitted, 5 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.572/0.613/0.637/0.024 ms
TTLの値を変更
-m オプションを使用することで、ping コマンド実行時に送信側の TTL 値を指定する事ができます。(参照:TTL)
以下は TTL の値を 10 にして example.com に対して ping コマンドを実行した例です。
実行結果として表示される TTL(ttl=54)は送信先の機器の返す TTL の値です。以下の例の場合、64-54 = 10 から到達先までのネットワークの機器の数は10になります(おそらく)。
ping -m 10 example.com return #TTL の値を 10 にして実行 PING example.com (93.184.216.34): 56 data bytes 64 bytes from 93.184.216.34: icmp_seq=0 ttl=54 time=117.630 ms 64 bytes from 93.184.216.34: icmp_seq=1 ttl=54 time=118.334 ms 64 bytes from 93.184.216.34: icmp_seq=2 ttl=54 time=117.608 ms ^C control + c --- google.com ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss
以下のように TTL の値を 9 にして実行すると、TTL が使い果たされて相手先まで到達できません。
ping -m 9 example.com return #TTL の値を 9 にして実行 PING example.com (93.184.216.34): 56 data bytes 36 bytes from 152.195.85.133: Time to live exceeded # TTL 超過(使い果たされている) Vr HL TOS Len ID Flg off TTL Pro cks Src Dst 4 5 00 5400 fa97 0 0000 01 01 bd8b 192.168.11.3 93.184.216.34 Request timeout for icmp_seq 0 36 bytes from 152.195.85.133: Time to live exceeded # TTL 超過(使い果たされている) Vr HL TOS Len ID Flg off TTL Pro cks Src Dst 4 5 00 5400 ad83 0 0000 01 01 0aa0 192.168.11.3 93.184.216.34 ・・・ ^C control + c --- example.com ping statistics --- 4 packets transmitted, 0 packets received, 100.0% packet loss #上記の応答を返してきた機器(152.195.85.133)へ ping ping -c 3 152.195.85.133 return PING 152.195.85.133 (152.195.85.133): 56 data bytes 64 bytes from 152.195.85.133: icmp_seq=0 ttl=55 time=113.497 ms #TTL は 55 64 bytes from 152.195.85.133: icmp_seq=1 ttl=55 time=112.407 ms 64 bytes from 152.195.85.133: icmp_seq=2 ttl=55 time=112.550 ms --- 152.195.85.133 ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 112.407/112.818/113.497/0.484 ms
TTL (Time To Live)
TTL は「Time To Live」の頭文字から来ていて、パケットの有効な期間(パケットの寿命)を表します。
TTL はループ防止目的のために設定されている値で、レイヤ3スイッチ(ルータなどのネットワーク機器)を1つ経由する毎に値が一つ減っていき、0になるとそのパケットは破棄されるようになっています。
また、TTL 値(設定値)はオペレーティングシステムによって異なるため、TTL 値に基づいてある程度 OS を推測することができます。
ping コマンドの送信元に表示される実行結果の TTL の値は「設定値 – 到達までのネットワーク機器の数」となります。設定値は機器(OS)により異なります。
OS による TTL の値
以下は OS による TTL のデフォルト値です。
- Linux/Mac OS :64
- Windows :128
- ネットワーク機器(UNIX系?) :255
以下はローカル環境(途中にネットワーク機器なし)で試した結果です。
ping -c 3 192.168.11.12 return # Windows へ ping (TTL = 128) PING 192.168.11.12 (192.168.11.12): 56 data bytes 64 bytes from 192.168.11.12: icmp_seq=0 ttl=128 time=1.450 ms 64 bytes from 192.168.11.12: icmp_seq=1 ttl=128 time=1.414 ms 64 bytes from 192.168.11.12: icmp_seq=2 ttl=128 time=1.342 ms ping 192.168.11.8 return # Mac へ ping (TTL = 64) PING 192.168.11.8 (192.168.11.8): 56 data bytes 64 bytes from 192.168.11.8: icmp_seq=0 ttl=64 time=44.700 ms 64 bytes from 192.168.11.8: icmp_seq=1 ttl=64 time=64.487 ms 64 bytes from 192.168.11.8: icmp_seq=2 ttl=64 time=84.078 ms ping 192.168.11.1 return # Wi-Fi Router へ ping (TTL = 64) PING 192.168.11.1 (192.168.11.1): 56 data bytes 64 bytes from 192.168.11.1: icmp_seq=0 ttl=64 time=0.579 ms 64 bytes from 192.168.11.1: icmp_seq=1 ttl=64 time=0.509 ms 64 bytes from 192.168.11.1: icmp_seq=2 ttl=64 time=0.416 ms
以下の場合、到達先の機器が Linux 系の OS だとすれば 64-54=10 から到達先までのネットワークに10個のレイヤ3スイッチ(ネットワーク機器)が存在すると推測できます。
ping example.com return PING example.com (93.184.216.34): 56 data bytes 64 bytes from 93.184.216.34: icmp_seq=0 ttl=54 time=117.599 ms 64 bytes from 93.184.216.34: icmp_seq=1 ttl=54 time=117.916 ms
traceroute コマンド
traceroute コマンドは、操作中のホストから目的のホスト(サーバーなど)までのネットワーク経路を調べるコマンドです。
ping コマンドで正常な応答がなかった場合などに経路上のルータの確認や各ルーターからのレスポンス時間などを調べるのに使います。
以下が書式です。
traceroute [オプション] 対象ホスト(ホスト名または IP アドレス)
以下のようなオプションがあります。
オプション | 意味 |
---|---|
-f | 使用する TTL の初期値(最初の値)を指定 |
-I | (大文字アイ)UDP パケットの代わりに ICMP Echo Request パケットを使う |
-M | 使用する TTL の初期値(最初の値)を指定。デフォルトは1。(-f と同じ?) |
-m | 使用する TTL の最大値を指定。この最大値のホップ数のゲートウェイまでが表示される |
-n | IPアドレスのみを出力(DNS逆引きを行わない) |
-P | 使用するIPプロトコル(UDP, TCP, GRE, ICMP)を指定。機能に制限があったり、最後のパケットがロスするなどのバグあり。 |
-p | 使用するポート番号を指定(デフォルトは 33434) |
-q | 各ゲートウェイに対する試行回数を指定。デフォルトは 3 |
-w | 応答の待ち時間を指定(デフォルトは5秒) |
「traceroute ホスト名」で指定したホストに到達するまでの経路を表示します。ホスト名の代わりに、ホストの IP アドレスを指定することもできます。
以下は example.com までの経路と応答時間を調べる例です。
traceroute example.com return traceroute to example.com (93.184.216.34), 64 hops max, 52 byte packets 1 192.168.11.1 (192.168.11.1) 0.754 ms 0.339 ms 0.416 ms 2 106.187.15.126 (106.187.15.126) 17.396 ms 11.950 ms 12.148 ms 3 106.187.15.125 (106.187.15.125) 11.948 ms 13.072 ms 12.352 ms 4 27.86.45.53 (27.86.45.53) 14.590 ms 12.498 ms 13.378 ms 5 sjegcs001.int-gw.kddi.ne.jp.13.187.106.in-addr.arpa (106.187.13.14) 117.150 ms 117.078 ms 106.187.13.6 (106.187.13.6) 121.837 ms 6 ix-pa10.int-gw.kddi.ne.jp (111.87.3.122) 122.682 ms 111.87.3.234 (111.87.3.234) 114.743 ms ix-pa10.int-gw.kddi.ne.jp (111.87.3.122) 116.912 ms 7 sjo-b21-link.telia.net (62.115.180.213) 118.220 ms 112.505 ms 118.234 ms 8 verizon-ic-325098-sjo-b21.c.telia.net (62.115.155.87) 118.335 ms 118.485 ms 112.337 ms 9 152.195.84.133 (152.195.84.133) 117.700 ms 152.195.85.133 (152.195.85.133) 118.238 ms 111.979 ms 10 93.184.216.34 (93.184.216.34) 117.528 ms 123.498 ms 118.106 ms 11 93.184.216.34 (93.184.216.34) 117.226 ms 117.817 ms 123.626 ms
2行目の「64 hops max」は経由するルータなどの個数(ホップ数)の最大値です(-m オプションで変更可能)。
「経由したホスト名(IP アドレス)」と「応答時間」が順番に表示されます。
経路は「ホスト名または IP アドレス」で表示されますが、ホスト名が不要な場合は -n オプションを使用すれば、名前解決の時間が節約できます。
応答時間はそれぞれにつき3回計測するので3つ表示されています(-q オプションで変更可能)。
以下は -n オプションを使用して名前解決を行わず、-q オプションで試行回数を2回にして実行した例です。
traceroute -n -q 2 example.com return traceroute to example.com (93.184.216.34), 64 hops max, 52 byte packets 1 192.168.11.1 0.826 ms 0.409 ms 2 106.187.15.126 12.975 ms 14.113 ms 3 106.187.15.125 17.104 ms 14.187 ms 4 27.86.45.53 14.438 ms 12.794 ms 5 106.187.13.6 117.522 ms 106.187.13.26 116.903 ms 6 111.87.3.234 114.698 ms 114.536 ms 7 62.115.180.213 112.176 ms 111.566 ms 8 62.115.155.89 113.493 ms 113.017 ms 9 152.195.85.133 118.065 ms 152.195.84.133 111.859 ms 10 93.184.216.34 118.221 ms 118.049 ms 11 93.184.216.34 118.102 ms 118.147 ms
経路の最大数を変更
目的のホストに到達するまでに経由するルータなどの個数(ホップ数)は -m オプションを指定して変更することができます。
traceroute -m 5 example.com return # ホップ数を5にして実行 traceroute to example.com (93.184.216.34), 5 hops max, 52 byte packets 1 192.168.11.1 (192.168.11.1) 0.570 ms 0.492 ms 0.397 ms 2 106.187.15.126 (106.187.15.126) 19.821 ms 12.836 ms 12.636 ms 3 106.187.15.125 (106.187.15.125) 12.360 ms 14.290 ms 12.475 ms 4 27.86.45.53 (27.86.45.53) 14.948 ms 12.419 ms 13.367 ms 5 106.187.13.26 (106.187.13.26) 124.674 ms sjegcs001.int-gw.kddi.ne.jp.13.187.106.in-addr.arpa (106.187.13.14) 116.520 ms 117.002 ms
最後の方だけ分かればよい場合は、何番目から表示するかを -f オプションで指定することができます。
traceroute -f 7 example.com return # 7番目以降を表示 traceroute to example.com (93.184.216.34), 64 hops max, 52 byte packets 7 sjo-b21-link.telia.net (62.115.180.213) 112.385 ms 112.064 ms 117.434 ms 8 verizon-ic-325098-sjo-b21.c.telia.net (62.115.155.87) 113.051 ms 118.288 ms 118.798 ms 9 152.195.84.133 (152.195.84.133) 117.898 ms 112.506 ms 112.142 ms 10 93.184.216.34 (93.184.216.34) 119.096 ms 124.008 ms 117.603 ms 11 93.184.216.34 (93.184.216.34) 117.988 ms 123.771 ms 117.967 ms
使用するプロトコルを指定
traceroute コマンドは UDP(User Datagram Protocol)を使って経路をテストしますが、途中に UDP が使用できない機器がある場合もあります。
以下は12番め以降はアスタリスク(*)が表示されています。これは traceroute の応答の待ち時間(デフォルト5秒)の間、送信した UDP に対して何も返って来なかったことを意味します。3つアスタリスク(*)が表示されているのはデフォルトの試行回数の3回とも応答がなかったことを意味します。
traceroute -n webdesignleaves.com return traceroute to webdesignleaves.com (144.208.79.21), 64 hops max, 52 byte packets 1 192.168.11.1 0.598 ms 0.226 ms 0.280 ms 2 106.187.15.126 13.165 ms 12.542 ms 13.247 ms ・・・中略・・・ 10 198.46.80.61 185.642 ms 184.417 ms 179.049 ms 11 198.46.80.84 182.806 ms 198.46.80.85 179.403 ms 198.46.80.84 182.435 ms 12 * * * # 送信した UDP に対して3回とも何も返らない 13 * * * 14 * * * 15 * * * ・・・中略・・・ 22 * * * 23 * * * ^C
そのような場合は、-I オプションを指定して ICMP Echo Request を使うか、-P オプションを使って別のプロトコルを指定するとうまく行く場合があります。
traceroute -I webdesignleaves.com return #-I オプションを指定 traceroute to webdesignleaves.com (144.208.79.21), 64 hops max, 72 byte packets 1 192.168.11.1 0.792 ms 0.346 ms 0.328 ms 2 106.187.15.126 13.167 ms 12.302 ms 11.759 ms 3 106.187.15.125 12.582 ms 12.459 ms 12.106 ms 4 27.85.136.5 13.793 ms 12.969 ms 13.215 ms 5 106.187.13.18 114.484 ms 114.612 ms 114.506 ms 6 111.87.3.118 140.089 ms 122.735 ms 117.130 ms 7 208.116.132.73 118.323 ms 116.951 ms 117.512 ms 8 213.200.127.114 183.261 ms 185.718 ms 182.251 ms 9 69.31.31.42 185.447 ms 185.362 ms 185.676 ms 10 198.46.80.61 181.865 ms 182.077 ms 182.332 ms 11 198.46.80.84 185.778 ms 185.080 ms 185.391 ms 12 144.208.79.21 186.582 ms 185.165 ms 185.605 ms traceroute -P ICMP webdesignleaves.com return #-P でプロトコルに ICMP を指定 traceroute to webdesignleaves.com (144.208.79.21), 64 hops max, 72 byte packets 1 192.168.11.1 0.730 ms 0.272 ms 0.433 ms 2 106.187.15.126 18.834 ms 13.728 ms 11.863 ms 3 106.187.15.125 12.468 ms 12.021 ms 11.981 ms 4 27.85.136.5 13.799 ms 14.202 ms 12.129 ms 5 106.187.13.18 114.852 ms 113.861 ms 114.238 ms 6 111.87.3.118 116.874 ms 120.669 ms 117.081 ms 7 208.116.132.73 117.291 ms 117.430 ms 118.031 ms 8 213.200.127.114 182.630 ms 182.824 ms 182.553 ms 9 69.31.31.42 185.262 ms 184.549 ms 185.194 ms 10 198.46.80.61 182.289 ms 181.939 ms 182.097 ms 11 198.46.80.84 185.647 ms 184.705 ms 184.712 ms 12 144.208.79.21 185.105 ms 185.391 ms 184.528 ms
host コマンド
host コマンドは、DNS サーバに問い合わせて指定したホストの IP アドレスを調べたり、逆に指定した IP アドレスからホスト名を取得したりすることができます。
以下が書式です。
host [オプション] ホスト名または IP アドレス [DNSサーバー]
以下のようなオプションがあります。
オプション | 意味 |
---|---|
-4 | IPv4 のみ検索 |
-6 | IPv6 のみ検索 |
-a | DNS に登録された全てのレコード情報を表示(-v -t ANY と同じ) |
-d | 詳細な情報を出力(-v と同じ) |
-l | DNS に登録されているホスト一覧を表示 |
-r | 再帰的な問い合わせをしない。他の DNS に問い合わせず、自身の情報だけを使用 |
-t | 検索対象となるタイプを指定(CNAME, NS, SOA, TXT, DNSKEY, AXFR, etc) |
-T | TCP を使用する(デフォルトは UDP) |
-v | 詳細な情報を出力(-d と同じ) |
-w | ホストから反応があるまで待機(タイムアウトしない) |
-W | タイムアウトまでの秒数を指定(デフォルトは5秒) |
以下は、ホスト(google.com)を指定して、サーバー情報(IPアドレスなど)を表示する例です。
host google.co.jp return google.co.jp has address 172.217.175.35 google.co.jp has IPv6 address 2404:6800:4004:81d::2003 google.co.jp mail is handled by 40 alt3.aspmx.l.google.com. google.co.jp mail is handled by 30 alt2.aspmx.l.google.com. google.co.jp mail is handled by 50 alt4.aspmx.l.google.com. google.co.jp mail is handled by 10 aspmx.l.google.com. google.co.jp mail is handled by 20 alt1.aspmx.l.google.com.
以下は、-a オプションを指定して DNS に登録された全てのレコード情報を表示する例です。
host -a google.co.jp return Trying "google.co.jp" ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45512 ;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 0, ADDITIONAL: 1 ;; QUESTION SECTION: ;google.co.jp. IN ANY ;; ANSWER SECTION: google.co.jp. 287 IN AAAA 2404:6800:4004:80b::2003 google.co.jp. 224 IN A 172.217.161.67 google.co.jp. 533 IN MX 40 alt3.aspmx.l.google.com. google.co.jp. 533 IN MX 30 alt2.aspmx.l.google.com. google.co.jp. 533 IN MX 50 alt4.aspmx.l.google.com. google.co.jp. 533 IN MX 10 aspmx.l.google.com. google.co.jp. 533 IN MX 20 alt1.aspmx.l.google.com. ;; ADDITIONAL SECTION: alt3.aspmx.l.google.com. 161 IN A 172.253.112.27 Received 208 bytes from 2404:1a8:7f01:b::3#53 in 13 ms
IP アドレスからホスト名を調べる
IP アドレスを指定してホスト名を調べることができます。
host 8.8.8.8 return 8.8.8.8.in-addr.arpa domain name pointer dns.google.
特定のレコードを指定して問い合わせる
MXレコード(そのドメインのメールサーバー)などの検索対象となるタイプを指定して問い合わせることもできます。
host -t mx google.com return google.com mail is handled by 40 alt3.aspmx.l.google.com. google.com mail is handled by 20 alt1.aspmx.l.google.com. google.com mail is handled by 50 alt4.aspmx.l.google.com. google.com mail is handled by 30 alt2.aspmx.l.google.com. google.com mail is handled by 10 aspmx.l.google.com.
使用する DNS サーバを指定
host コマンドは最も近い DNS サーバに問い合わせを行い、その DNS サーバ上に情報がなければ、他のDNSサーバの情報を参照します(-r オプションを指定しない場合)。
「host ドメイン名 DNSサーバ」で、問い合わせる DNS サーバを指定することができます。
host google.com 8.8.8.8 return #8.8.8.8 に問い合わせ Using domain server: Name: 8.8.8.8 Address: 8.8.8.8#53 Aliases: google.com has address 172.217.31.142 google.com has IPv6 address 2404:6800:4004:818::200e google.com mail is handled by 30 alt2.aspmx.l.google.com. google.com mail is handled by 50 alt4.aspmx.l.google.com. google.com mail is handled by 20 alt1.aspmx.l.google.com. google.com mail is handled by 10 aspmx.l.google.com. google.com mail is handled by 40 alt3.aspmx.l.google.com.
nslookup コマンド
nslookup コマンドは、ドメイン情報を DNS(Domain Name System)サーバに問い合わせるコマンドです。nslookup という名前は「name server lookup(ネームサーバ検索)」を意味します。
nslookup コマンドは、DNS サーバーへ問い合わせて、ホスト名(ドメイン名)から IP アドレスを調べたり(正引き)、IP アドレスからホスト名を調べる(逆引き)ことができます。また、nslookup コマンドには非対話モード(non-interactive mode)と対話モード(interactive mode)があります。
以下が非対話モードの書式です。
nslookup [オプション] IPアドレスまたはホスト名 [DNSサーバー]
以下のようなオプションがあります。
オプション | 意味 |
---|---|
-type=タイプ | 取得する DNS レコードの種類を指定 |
以下は主な DNS レコードの種類(タイプ)です。
レコードのタイプ | 意味 |
---|---|
A | ドメイン名に対応する IPv4 形式の IP アドレス |
AAAA | ドメイン名に対応する IPv6 形式の IP アドレス |
CNAME | ドメイン名に付けた別名、エイリアス(alias)。Canonical NAME の略。 |
HINFO | ホストの追加情報。ホストのハードウェア・ソフトウェア情報。Host Information の略 |
MX | ドメイン宛のメールの配送先メールサーバ。メールサーバが複数ある場合は優先度を設定可能(数値が小さい方が優先)。Mail Exchanger の略 |
NS | ドメインの権威 DNS サーバ(ネームサーバ)。Name Server の略 |
PTR | A レコードとは逆に IP アドレスに対応するドメイン名(IP アドレス部分は特定の書式に変換)。Pointer の略 |
SOA | ゾーン情報(DNSサーバ名、ドメインのシリアル番号、更新間隔、リトライ間隔、レコード有効時間、キャッシュ有効時間など)Start of Authority の略 |
TXT | コメントが書ける行で、SPF レコードや SenderID などに使用。Text の略 |
any | すべて |
以下は非対話モードで、ホスト名から IP アドレスを検索する例です。
nslookup google.com return #ホスト名を指定 Server: 2404:1a8:7f01:b::3 #問い合わせしている DNS サーバー Address: 2404:1a8:7f01:b::3#53 //DNSサーバーのIPアドレス Non-authoritative answer: #問い合わせに対する回答 Name: google.com #問い合わせ内容 Address: 172.217.26.46 #問い合わせ結果
以下は DNS サーバを指定して問い合わせる例です。Google Public DNS(8.8.8.8)へ問い合わせています。
nslookup www.google.com 8.8.8.8 return #8.8.8.8へ問い合わせ Server: 8.8.8.8 #オプションで指定されたサーバ Address: 8.8.8.8#53 Non-authoritative answer: Name: www.google.com Address: 172.217.31.164
以下は IP アドレスからホスト名を検索する例です。
nslookup 17.172.224.47 return Server: 2404:1a8:7f01:b::3 Address: 2404:1a8:7f01:b::3#53 Non-authoritative answer: 47.224.172.17.in-addr.arpa name = carbontest.com. 47.224.172.17.in-addr.arpa name = carbondating.com. 47.224.172.17.in-addr.arpa name = carbonapi.com. 47.224.172.17.in-addr.arpa name = appleiphone.com. 47.224.172.17.in-addr.arpa name = apple.com. 47.224.172.17.in-addr.arpa name = appleid.org. 47.224.172.17.in-addr.arpa name = apple.by. 47.224.172.17.in-addr.arpa name = expertapple.com. 47.224.172.17.in-addr.arpa name = developercentral.com. 47.224.172.17.in-addr.arpa name = darwincode.com. Authoritative answers can be found from:
レコードのタイプを指定して検索
#メールサーバ nslookup -type=mx google.com return # -type=mx Server: 2404:1a8:7f01:b::3 Address: 2404:1a8:7f01:b::3#53 Non-authoritative answer: google.com mail exchanger = 50 alt4.aspmx.l.google.com. google.com mail exchanger = 20 alt1.aspmx.l.google.com. google.com mail exchanger = 30 alt2.aspmx.l.google.com. google.com mail exchanger = 10 aspmx.l.google.com. google.com mail exchanger = 40 alt3.aspmx.l.google.com. Authoritative answers can be found from: alt4.aspmx.l.google.com internet address = 173.194.77.27 #DNS サーバ(ネームサーバ) nslookup -type=ns google.com return # -type=ns Server: 2404:1a8:7f01:b::3 Address: 2404:1a8:7f01:b::3#53 Non-authoritative answer: google.com nameserver = ns4.google.com. google.com nameserver = ns3.google.com. google.com nameserver = ns1.google.com. google.com nameserver = ns2.google.com. Authoritative answers can be found from: ns1.google.com internet address = 216.239.32.10 ns1.google.com has AAAA address 2001:4860:4802:32::a ns2.google.com internet address = 216.239.34.10 ns2.google.com has AAAA address 2001:4860:4802:34::a ns4.google.com internet address = 216.239.38.10 ns4.google.com has AAAA address 2001:4860:4802:38::a ns3.google.com internet address = 216.239.36.10 ns3.google.com has AAAA address 2001:4860:4802:36::a #ゾーン情報 nslookup -type=soa google.com return # -type=soa Server: 2404:1a8:7f01:b::3 Address: 2404:1a8:7f01:b::3#53 Non-authoritative answer: google.com origin = ns1.google.com mail addr = dns-admin.google.com serial = 291593810 refresh = 900 retry = 900 expire = 1800 minimum = 60 Authoritative answers can be found from: #すべて nslookup -type=any google.com return # -type=any Server: 2404:1a8:7f01:b::3 Address: 2404:1a8:7f01:b::3#53 Non-authoritative answer: google.com has AAAA address 2404:6800:4004:80d::200e google.com nameserver = ns1.google.com. google.com nameserver = ns2.google.com. google.com nameserver = ns4.google.com. google.com nameserver = ns3.google.com. google.com origin = ns1.google.com mail addr = dns-admin.google.com serial = 291593810 refresh = 900 retry = 900 expire = 1800 minimum = 60 Name: google.com Address: 172.217.26.46 google.com mail exchanger = 10 aspmx.l.google.com. google.com mail exchanger = 20 alt1.aspmx.l.google.com. google.com mail exchanger = 40 alt3.aspmx.l.google.com. google.com mail exchanger = 30 alt2.aspmx.l.google.com. google.com mail exchanger = 50 alt4.aspmx.l.google.com. Authoritative answers can be found from: ns1.google.com internet address = 216.239.32.10 ns1.google.com has AAAA address 2001:4860:4802:32::a ns2.google.com internet address = 216.239.34.10 ns2.google.com has AAAA address 2001:4860:4802:34::a ns4.google.com internet address = 216.239.38.10 ns4.google.com has AAAA address 2001:4860:4802:38::a ns3.google.com internet address = 216.239.36.10 ns3.google.com has AAAA address 2001:4860:4802:36::a alt2.aspmx.l.google.com internet address = 209.85.145.27 aspmx.l.google.com internet address = 74.125.204.26
対話モード
対話モードで実行する場合は、引数なしで return キーを押すか、 -(ハイフン)と DNS サーバを指定して return キーを押すとプロンプト「>」が表示されるので問い合わせやコマンドを入力します。
nslookup return
nslookup - DNSサーバ return
nslookup return > # 問い合わせやコマンドを入力して return を押す
以下のようなコマンドを指定できます(一部抜粋)。
コマンド | 意味 |
---|---|
server | サーバーを指定 |
exit | 終了 |
set | レコードタイプ(type=)や debug などを指定 |
以下は対話モードでの実行例です。
nslookup return # 対話モードで実行 > google.com return # プロンプト「>」に続けてホスト名 google.com を入力して検索 Server: 2404:1a8:7f01:b::3 # 問い合わせしている DNS サーバー Address: 2404:1a8:7f01:b::3#53 Non-authoritative answer: #問い合わせに対する回答 Name: google.com #問い合わせ内容 Address: 172.217.161.46 #問い合わせ結果 > set type=mx return # レコードタイプを mx に指定 > google.com return # google.com を検索 Server: 2404:1a8:7f01:b::3 Address: 2404:1a8:7f01:b::3#53 Non-authoritative answer: google.com mail exchanger = 10 aspmx.l.google.com. google.com mail exchanger = 30 alt2.aspmx.l.google.com. google.com mail exchanger = 20 alt1.aspmx.l.google.com. google.com mail exchanger = 50 alt4.aspmx.l.google.com. google.com mail exchanger = 40 alt3.aspmx.l.google.com. Authoritative answers can be found from: alt3.aspmx.l.google.com internet address = 172.253.112.26 aspmx.l.google.com internet address = 108.177.125.26 alt1.aspmx.l.google.com internet address = 108.177.10.26 > yahoo.com return # yahoo.com を検索(レコードタイプは mx のまま) Server: 2404:1a8:7f01:b::3 Address: 2404:1a8:7f01:b::3#53 Non-authoritative answer: yahoo.com mail exchanger = 1 mta5.am0.yahoodns.net. yahoo.com mail exchanger = 1 mta6.am0.yahoodns.net. yahoo.com mail exchanger = 1 mta7.am0.yahoodns.net. Authoritative answers can be found from: > set type=a return # レコードタイプを a に指定 > yahoo.com return # yahoo.com を検索 Server: 2404:1a8:7f01:b::3 Address: 2404:1a8:7f01:b::3#53 Non-authoritative answer: Name: yahoo.com Address: 98.138.219.232 Name: yahoo.com Address: 72.30.35.9 Name: yahoo.com Address: 98.137.246.8 Name: yahoo.com Address: 72.30.35.10 Name: yahoo.com Address: 98.138.219.231 Name: yahoo.com Address: 98.137.246.7 > server 8.8.8.8 return # 問い合わせサーバを 8.8.8.8 に変更 Default server: 8.8.8.8 Address: 8.8.8.8#53 > 98.138.219.232 return # IPアドレスを問い合わせ Server: 8.8.8.8 Address: 8.8.8.8#53 Non-authoritative answer: 232.219.138.98.in-addr.arpa name = media-router-fp2.prod1.media.vip.ne1.yahoo.com. Authoritative answers can be found from: > exit return # 終了
set degub でデバッグモードをオンにすると解答に関する詳細情報が出力されます。オフにするには set nodebug を実行します。
nslookup return # 対話モードで実行 > set debug return #バッグモードをオンに > www.webdesignleaves.com return #ホスト名を指定(詳細情報が表示される) Server: 2404:1a8:7f01:b::3 Address: 2404:1a8:7f01:b::3#53 ------------ QUESTIONS: www.webdesignleaves.com, type = A, class = IN ANSWERS: -> www.webdesignleaves.com canonical name = webdesignleaves.com. ttl = 900 -> webdesignleaves.com internet address = 144.208.79.21 ttl = 900 AUTHORITY RECORDS: ADDITIONAL RECORDS: ------------ Non-authoritative answer: www.webdesignleaves.com canonical name = webdesignleaves.com. Name: webdesignleaves.com Address: 144.208.79.21 > example.com return #ホスト名を指定(引き続きバッグモードがオン) Server: 2404:1a8:7f01:b::3 Address: 2404:1a8:7f01:b::3#53 ------------ QUESTIONS: example.com, type = A, class = IN ANSWERS: -> example.com internet address = 93.184.216.34 ttl = 10757 AUTHORITY RECORDS: ADDITIONAL RECORDS: ------------ Non-authoritative answer: Name: example.com Address: 93.184.216.34 > set nodebug return #バッグモードをオフに > www.webdesignleaves.com return #ホスト名を指定 Server: 2404:1a8:7f01:b::3 Address: 2404:1a8:7f01:b::3#53 Non-authoritative answer: www.webdesignleaves.com canonical name = webdesignleaves.com. Name: webdesignleaves.com Address: 144.208.79.21 > exit
SSH
SSH は「Secure Shell」の略で、ネットワークに接続された機器を遠隔操作するためのプロトコルです。
サーバーへ安全に接続するための仕組みとしては「パスワード認証方式」と「公開鍵認証方式」の2つがあり、安全性は「公開鍵認証方式」のほうが高いです。
公開鍵認証方式
公開鍵認証方式では事前に以下を準備します(初回のみ)。
- 鍵を作成(サーバー用の公開鍵とクライアント用の秘密鍵をペアで作成)
- サーバーとクライアントで鍵をそれぞれ保管
鍵の作成 ssh-keygen
ssh-keygen は SSH(Secure SHell)の公開鍵と秘密鍵や、CA鍵(Certificate Authority、認証局による鍵)を使った「証明書」を作成するコマンドです。
生成される鍵の暗号化形式は -t オプションで指定します。以下では rsa 形式の鍵を作成します。
通常、SSH を使用する各ユーザーは、ssh-keygen を1回実行して $HOME/.ssh/id_rsa(rsa の場合)に認証鍵を作成します。
公開鍵は、同じ名前(id_rsa)のあとに「.pub」拡張子が付加されたファイル内に格納されます。
また、ssh-keygen コマンドはパスフレーズの入力も求めます。パスフレーズは、パスフレーズがないことを示すために空にすることも、任意の長さの文字列にすることもできます。
パスフレーズは、長さが 10〜30 文字で大文字と小文字の英字、数字、および英数字以外の文字が含まれていることが望ましいとされています。
鍵の保存先ディレクトリを作成
以下のコマンドで、ホームディレクトリに鍵の保存先ディレクトリ(.ssh)を作成します。-m オプションを指定してパーミッションも設定しています。
% mkdir -m 700 ~/.ssh
return //ホームディレクトリに保存先ディレクトリ(.ssh)を作成rsa 形式の鍵の作成
-t オプションに rsa を指定して ssh-keygen コマンドを実行します。実行すると以下を聞かれます。
- 鍵の保存場所とファイル名
- パスフレーズ ※パスフレーズは、実際に秘密鍵を使用する際にも必要になるので忘れないように
- パスフレーズ(確認用)
ssh-keygen -t rsa return
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xxxx/.ssh/id_rsa): //保存場所とファイル名を確認し、Enterキーを押す
Enter passphrase (empty for no passphrase): //パスフレーズを入力し、Enterキーを押す
Enter same passphrase again: //パスフレーズを入力し、Enterキーを押す
Your identification has been saved in /Users/xxxx/.ssh/id_rsa //作成された秘密鍵ファイル
Your public key has been saved in /Users/xxxx/.ssh/id_rsa.pub //作成された公開鍵ファイル
The key fingerprint is:
SHA256:MecXSiJqol4Avb4UyYkwpbVFsinerBjxOSTO7Wf0fkg xxxx@xxxx.local
The key'
s randomart image is:
+---[RSA 3072]----+
| o.o |
| + * |
|= * . . + o . |
|.=o+ = . B . . |
|..+oO S o . |
|++.= o E . . |
|Bo. = o . |
|.=.+ + o . |
| o+.+ ... |
+----[SHA256]-----+公開鍵の内容は cat コマンドなどで確認できます。
% cat ~/.ssh/id_rsa.pub return ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAA・・・中略・・・NuZU6OZKyzqoNV3WRlMvAXcqkASrALU7VLyp9P1Lls= xxxx@xxxx.local
SSH 公開鍵を登録
作成した公開鍵をサーバーに設置します。
以下は Conoha Wing の場合の例です。(ConoHa ご利用ガイド:SSHアカウントを作成する)
ConoHaの管理画面にログインし、サイドメニュー[サーバー管理]→[SSH]を開きます。
右上の「+ SSH Key」をクリックし、SSH キーを新規作成します。
登録方法で「インポート」を選択して「パブリックキー」に公開鍵の内容をペーストして保存します。
作成したキーの情報はその名前をクリックすると表示されます。これらの情報は SSH 接続する際に使用します。
SSH 接続
ターミナルからssh 接続コマンドでサーバーに接続します。
以下が書式です。
ssh [ユーザー名]@[ホスト名] -p [ポート番号] -i ~/.ssh/[秘密鍵ファイル]
ユーザー名、ホスト名、ポート名、ファイル名は、サーバーの管理画面から確認します。
以下は実行例です。初回の接続では「Are you sure you want to continue connecting ?」と聞かれるので、yes と入力して Enter を押します。その後パスフレーズを聞かれるので入力します。
2回目以降の接続では、パスフレーズだけが聞かれます。
% ssh c9xxxx@xxxx.conoha.ne.jp -p 8022 -i ~/.ssh/id_rsa return
The authenticity of host '[xxxx.conoha.ne.jp]:8022 ([123.456.789.123]:8022)' can't
be established.
ED25519 key fingerprint is SHA256:RQY............eEM.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes //yes と入力して Enter
Warning: Permanently added '[xxxx.conoha.ne.jp]:8022' (ED25519) to the list of known hosts.
Enter passphrase for key '/Users/xxxx/.ssh/id_rsa': //パスフレーズを入力して Enter
[c9xxxx@xxxxx ~]$ //接続完了接続を解除するには exit を実行します。
[c9xxxx@xxxxx ~]$ exit //接続解除 ログアウト Connection to xxxx.conoha.ne.jp closed.
その他のコマンド
curl コマンド
curl コマンドは HTTP リクエストを送って、そのレスポンスをチェックしたり、様々なプロトコルを使用してデータ転送(ファイルのダウンロードやアップロードなど)を行うことができるコマンドです。
以下は curl 関連のページです。
以下が書式です。
curl [options] [URL...]
以下はオプション無しで URL を指定して Web サーバーからメインページを取得する例です。
HTTP メソッドを特定するオプションを使用しない場合は GET メソッドを使った HTTP リクエストを実施します。
$ curl https://example.com/ return // Response のメッセージボディを標準出力する <!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> ・・・中略・・・ </style> </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html>
デフォルトの出力先は「標準出力」です。オプション(-O または -o)を指定するかリダイレクトでファイルに保存(ダウンロード)することができます。
デフォルトではファイルに保存する場合などでは以下のように進捗状況が表示されます。
$ curl https://example.com/ > myfile.html return //リダイレクトでファイルに保存 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1256 100 1256 0 0 1402 0 --:--:-- --:--:-- --:--:-- 1401 $ cat myfile.html return //保存したファイルを表示 <!doctype html> <html> <head> <title>Example Domain</title> ・・・中略・・・ </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html>
関連ページ:PHP HTTP
オプション
どのようなオプションがあるかは -h(または --help)オプションを指定して確認することができます。
オプションは1つのダッシュ(-)から始まるものと、2つのダッシュ(--)から始まるものがあり、オプションによって両方あるものとそうでないものがあります。
また、オプションによってはオプションの後に続けて例えばファイル名など何らかの値を指定する必要があるものがあります。
また、curl の Man Page でオプションの詳細を確認できます。
バージョンの確認
使用している curl のバージョンは -V(または --version)オプションを指定して確認することができます。使用できるプロトコルなども表示されます。
$ curl -V return //V は大文字 curl 7.54.0 (x86_64-apple-darwin18.0) libcurl/7.54.0 LibreSSL/2.6.5 zlib/1.2.11 nghttp2/1.24.1 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz HTTP2 UnixSockets HTTPS-proxy
short | long | 説明 |
---|---|---|
-h | --help | 使用方法(ヘルプ)を表示 |
-V | --version | curl と使用するライブラリのバージョンに関する情報を表示します。サポートしているプロトコルや利用可能な機能が表示されます。 |
-I | --head | HTTP レスポンスヘッダーを取得 |
-i | --include | HTTP レスポンスヘッダーとレスポンスボディを取得 |
-v | --verbose | HTTP 通信の詳細を出力 |
--trace | --trace-ascii | curl の動作についての詳細情報を取得。ログを保存するためのファイル名を指定する必要があります。(--trace-ascii) |
-f | --fail | サーバーエラーの場合、静かに終了します(出力がありません)が、-f オプションを指定するとエラー 22 を返します。 |
-s | --silent | サイレントモード。進捗とエラーのどちらも表示しない。進捗は非表示にしてエラーは表示するようにするには -sS と指定します。 |
-S | --show-error | -s と一緒に -sS と指定して、進捗は表示しないがエラーは表示する |
-L | --location | リダイレクト先にもリクエストを発行 |
-w | --write-out | カスタム出力。%{variable_name} の形式の変数と文字列で出力フォーマットを指定して出力をカスタマイズすることができます。 |
-O | --remote-name | 転送元と同じ名前で保存(ダウンロード) |
-o | --output | ファイル名を指定して保存(ダウンロード) |
-# | --progress-bar | 進捗状況をプログレスバーで表示 |
N/A | --create-dirs | -o、-output オプションと組み合わせて使用すると、必要なローカルディレクトリ階層を動的に作成。 |
標準出力
出力先のファイル名の指定で標準出力を指定する場合は、/dev/stdout の代わりにダッシュ(-)を指定することができます。
HTTP レスポンスヘッダーを取得(-I)
-I(または --head)オプションを指定するとレスポンスヘッダーを取得できます。
$ curl -I http://example.com return // -I オプションを指定 HTTP/1.1 200 OK Content-Encoding: gzip Accept-Ranges: bytes Age: 384924 Cache-Control: max-age=604800 Content-Type: text/html; charset=UTF-8 Date: Sat, 03 Jul 2021 01:57:55 GMT Etag: "3147526947" Expires: Sat, 10 Jul 2021 01:57:55 GMT Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT Server: ECS (nyb/1D20) X-Cache: HIT Content-Length: 648
HTTP レスポンスヘッダーとレスポンスボディを取得(-i)
-i(または --include)オプションを指定するとレスポンスヘッダーを取得できます。
$ curl -i http://example.com return // -i オプションを指定 HTTP/1.1 200 OK Accept-Ranges: bytes Age: 377813 Cache-Control: max-age=604800 Content-Type: text/html; charset=UTF-8 Date: Sat, 03 Jul 2021 02:00:38 GMT Etag: "3147526947" Expires: Sat, 10 Jul 2021 02:00:38 GMT Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT Server: ECS (nyb/1D1E) Vary: Accept-Encoding X-Cache: HIT Content-Length: 1256 <!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> ・・・中略・・・ </style> </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html>
HTTP 通信の詳細を出力(-v)
-v(または --verbose)オプションを指定するとHTTP 通信の詳細(リクエストヘッダ、レスポンスヘッダとボディ)を出力できます。
$ curl -v http://example.com return // -v オプションを指定 * Rebuilt URL to: http://example.com/ * Trying 2606:2800:220:1:248:1893:25c8:1946... * TCP_NODELAY set * Connected to example.com (::1) port 80 (#0) > GET / HTTP/1.1 > Host: example.com > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 200 OK < Age: 125688 < Cache-Control: max-age=604800 < Content-Type: text/html; charset=UTF-8 < Date: Sat, 03 Jul 2021 02:03:31 GMT < Etag: "3147526947+ident" < Expires: Sat, 10 Jul 2021 02:03:31 GMT < Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT < Server: ECS (nyb/1D2E) < Vary: Accept-Encoding < X-Cache: HIT < Content-Length: 1256 < <!doctype html> <html> <head> <title>Example Domain</title> ・・・中略・・・ </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html> * Connection #0 to host example.com left intact
サーバーエラーの場合にエラー22を返す(-f)
-f(または --fail)オプションを指定するとサーバーエラーの場合、エラー 22 を返します。
以下は存在しないファイルを指定した場合の例です。
通常、HTTP サーバーがドキュメントの配信に失敗すると、そのことを示す HTML ドキュメント(404 ページなど)が返されます
$ curl -v http://localhost/nohost/ return // 存在しないファイルを指定 * Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) port 80 (#0) > GET /nohost/ HTTP/1.1 > Host: localhost > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 404 Not Found < Date: Sat, 03 Jul 2021 02:07:10 GMT < Server: Apache/2.2.34 (Unix) mod_wsgi/3.5 Python/2.7.13 PHP/7.4.1 mod_ssl/2.2.34 OpenSSL/1.0.2o DAV/2 mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_perl/2.0.11 Perl/v5.24.0 < Content-Length: 205 < Content-Type: text/html; charset=iso-8859-1 < <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL /nohost/ was not found on this server.</p> </body></html> * Connection #0 to host localhost left intact
以下では -f オプションを指定しているので、HTML ドキュメント(404 ページなど)を出力せずに、エラーコード(22)を返してエラー(404 Not Found)を表示しています。
$ curl -v -f http://localhost/nohost/ return //-f オプションを指定 * Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) port 80 (#0) > GET /nohost/ HTTP/1.1 > Host: localhost > User-Agent: curl/7.54.0 > Accept: */* > * The requested URL returned error: 404 Not Found * stopped the pause stream! * Closing connection 0 curl: (22) The requested URL returned error: 404 Not Found // エラーコード 22
動作の詳細情報を取得(--trace)
以下は --trace オプションを指定して curl の動作についての詳細情報(どんなデータのやり取りがあるか)を取得して標準出力(/dev/stdout)に出力しています。
--trace の後にはファイル名を指定する必要があります。標準出力を指定する場合は /dev/stdout の代わりにダッシュ(-)を指定することもできます。
$ curl --trace /dev/stdout http://example.com return //--trace で詳細情報を表示 == Info: Rebuilt URL to: http://example.com/ == Info: Trying 2606:2800:220:1:248:1893:25c8:1946... == Info: TCP_NODELAY set == Info: Connected to example.com (::1) port 80 (#0) => Send header, 75 bytes (0x4b) 0000: 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a GET / HTTP/1.1.. 0010: 48 6f 73 74 3a 20 65 78 61 6d 70 6c 65 2e 63 6f Host: example.co 0020: 6d 0d 0a 55 73 65 72 2d 41 67 65 6e 74 3a 20 63 m..User-Agent: c 0030: 75 72 6c 2f 37 2e 35 34 2e 30 0d 0a 41 63 63 65 url/7.54.0..Acce 0040: 70 74 3a 20 2a 2f 2a 0d 0a 0d 0a pt: */*.... <= Recv header, 17 bytes (0x11) 0000: 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK. 0010: 0a . <= Recv header, 22 bytes (0x16) 0000: 41 63 63 65 70 74 2d 52 61 6e 67 65 73 3a 20 62 Accept-Ranges: b 0010: 79 74 65 73 0d 0a ytes.. <= Recv header, 13 bytes (0xd) 0000: 41 67 65 3a 20 33 38 30 31 33 36 0d 0a Age: 380136.. <= Recv header, 31 bytes (0x1f) ・・・中略・・・ <= Recv header, 2 bytes (0x2) 0000: 0d 0a .. <= Recv data, 1256 bytes (0x4e8) 0000: 3c 21 64 6f 63 74 79 70 65 20 68 74 6d 6c 3e 0a <!doctype html>. ・・・中略・・・ 04e0: 3c 2f 68 74 6d 6c 3e 0a </html>. <!doctype html> <html> <head> <title>Example Domain</title> ・・・中略・・・ </head> <body> <div> <h1>Example Domain</h1> ・・・中略・・・ </div> </body> </html> == Info: Connection #0 to host example.com left intact
動作の詳細情報を取得(--trace-ascii)
以下は --trace-ascii オプションを指定して curl の動作についての詳細情報を取得して標準出力に出力しています。--trace 同様オプションの後にはファイル名を指定する必要があります。以下の例では /dev/stdout の代わりにダッシュ(-)を指定しています。
$ curl --trace-ascii - http://example.com return //--trace-ascii で詳細情報を表示 == Info: Rebuilt URL to: http://example.com/ == Info: Trying 2606:2800:220:1:248:1893:25c8:1946... == Info: TCP_NODELAY set == Info: Connected to example.com (::1) port 80 (#0) => Send header, 75 bytes (0x4b) 0000: GET / HTTP/1.1 0010: Host: example.com 0023: User-Agent: curl/7.54.0 003c: Accept: */* 0049: <= Recv header, 17 bytes (0x11) 0000: HTTP/1.1 200 OK <= Recv header, 22 bytes (0x16) 0000: Accept-Ranges: bytes <= Recv header, 13 bytes (0xd) ・・・中略・・・ <= Recv header, 2 bytes (0x2) 0000: <= Recv data, 1256 bytes (0x4e8) 0000: <!doctype html>.<html>.<head>. <title>Example Domain</title>. 0040: . <meta charset="utf-8" />. <meta http-equiv="Content-type 0080: " content="text/html; charset=utf-8" />. <meta name="viewport ・・・中略・・・ 0480: <p><a href="https://www.iana.org/domains/example">More inform 04c0: ation...</a></p>.</div>.</body>.</html>. <!doctype html> <html> <head> <title>Example Domain</title> ・・・中略・・・ </head> <body> <div> <h1>Example Domain</h1> ・・・中略・・・ </body> </html> == Info: Connection #0 to host example.com left intact
出力フォーマットを指定(-w)
-w(または --write-out)オプションの後に出力フォーマットを指定して出力をカスタマイズすることができます。
変数は %{variable_name} として指定し、以下のような変数(一部抜粋)が使えます。
変数 | 説明 |
---|---|
content_type | リクエストされたドキュメントの Content-Type |
http_code | HTTP ステータスの応答コード(ステータスコード)。response_code と同じ |
redirect_url | リダイレクト先の URL |
remote_ip | 接続先の IP アドレス |
remote_port | 接続先のポート番号 |
response_code | ステータスコード。http_code と同じ |
size_download | ダウンロードサイズ(バイト) |
size_request | HTTP リクエストのサイズ(バイト) |
speed_download | curl が測定した平均ダウンロード速度(1秒あたりのバイト数)。 |
time_appconnect | 開始からリモートホストへの SSL や SSH などの接続(ハンドシェイク)が完了するまでに要した時間(秒)。 |
time_connect | 開始からリモートホスト(またはプロキシ)への TCP 接続が完了するまでに要した時間(秒)。応答時間を測定 |
time_namelookup | 開始から名前解決が完了するまでに要した時間(秒) |
time_pretransfer | 開始からファイル転送が開始されるまでに要した時間(秒)。 |
time_redirect | 最終的なトランザクションが開始されるまでに、名前解決、接続、事前転送、転送を含むすべてのリダイレクト手順に要した時間。(秒) |
time_starttransfer | 開始から最初のバイトが転送されようとするまでに要した時間(秒)。これには、time_pretransferとサーバーが結果を計算するために必要な時間も含まれます。 |
time_total | 操作が継続した合計時間(秒) |
以下は -w に 「http_code: %{http_code}\n」 を指定してステータスコードを「http_code: ステータスコード(改行)」のフォーマットで出力する例です。
以下では -o /dev/null を指定してレスポンスボディを /dev/null にリダイレクトして出力させないようにしています。
$ curl -w 'http_code: %{http_code}\n' http://example.com -o /dev/null return % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1256 100 1256 0 0 3111 0 --:--:-- --:--:-- --:--:-- 3116 http_code: 200 // -w 'http_code: %{http_code}\n' による出力
エラーは表示するが進捗は表示しない(-sS)
以下は前述の -w オプションの例に -sS オプションを指定して、進捗状況を表示しない例です。
$ curl -w 'Total Time: %{time_total}\n' http://example.com -sS -o /dev/null return Total Time: 0.399203
リダイレクト先の URL を表示
以下は -w オプションを指定して、変数 %{redirect_url} を使ってリダイレクト先の URL を表示する例です(google.com は www ありに正規化されているようです)。
$ curl -w 'URL: %{redirect_url}\n' https://google.com -sS -o /dev/null return URL: https://www.google.com/
応答時間を測定
-w オプションに時間を測定する変数を指定して応答時間を測定する例です。
2行目〜8行目の先頭の「>」は見やすいようにコマンドラインでは \ を使って改行しているために表示されるセカンダリプロンプトです。
$ curl -w "time_appconnect: %{time_appconnect}\n\ > time_connect: %{time_connect}\n\ > time_namelookup: %{time_namelookup}\n\ > time_pretransfer: %{time_pretransfer}\n\ > time_redirect: %{time_redirect}\n\ > time_starttransfer: %{time_starttransfer}\n\ > time_total: %{time_total}\n"\ > https://www.google.com -sS -o /dev/null return time_appconnect: 0.206969 //接続が完了するまでの時間 time_connect: 0.115353 // 接続が完了するまでの時間 time_namelookup: 0.004909 // 名前解決が完了するまでの時間 time_pretransfer: 0.207015 // ファイル転送が開始されるまでの時間 time_redirect: 0.000000 // リダイレクト手順に要した時間 time_starttransfer: 0.357980 // 最初のバイトが転送されようとするまでの時間 time_total: 0.358049 // 操作が継続した合計時間 //以下は改行しないでコマンドを実施する場合の例(上記と同じこと) $ curl -w "time_appconnect: %{time_appconnect}\ntime_connect: %{time_connect}\ntime_namelookup: %{time_namelookup}\ntime_pretransfer: %{time_pretransfer}\ntime_redirect: %{time_redirect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n" https://www.google.com -sS -o /dev/null return
リダイレクト先にもリクエストを発行(-L)
要求されたページがリダイレクト設定されている(Location:ヘッダーと3XX応答コードで示される) URL の場合、デフォルトではリダイレクト先の URL に対してのリクエストを発行しませんが、このオプションを指定するとリダイレクト先の URL に対してリクエストを発行します。
- -i(--include)または -I(--head)と一緒に使用すると、要求されたすべてのページのヘッダーが表示されます。
以下の最初の例は -L を指定していないので指定した URL のヘッダー(ステータスコード:301)のみが表示されていますが、w番目の -L を指定した例ではリダイレクト先のヘッダー(ステータスコード:200 )も表示されています。
$ curl -i https://google.com return // -L 指定なし HTTP/2 301 location: https://www.google.com/ content-type: text/html; charset=UTF-8 date: Sun, 04 Jul 2021 00:12:05 GMT expires: Tue, 03 Aug 2021 00:12:05 GMT cache-control: public, max-age=2592000 server: gws content-length: 220 x-xss-protection: 0 x-frame-options: SAMEORIGIN alt-svc: h3=":443"; ma=2592000 <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="https://www.google.com/">here</A>. </BODY></HTML> $ curl -i -L https://google.com return // -L を指定してリダイレクトを有効に HTTP/2 301 location: https://www.google.com/ content-type: text/html; charset=UTF-8 date: Sun, 04 Jul 2021 00:12:25 GMT expires: Tue, 03 Aug 2021 00:12:25 GMT cache-control: public, max-age=2592000 server: gws content-length: 220 x-xss-protection: 0 x-frame-options: SAMEORIGIN alt-svc: h3=":443"; ma=2592000 HTTP/2 200 date: Sun, 04 Jul 2021 00:12:25 GMT expires: -1 cache-control: private, max-age=0 content-type: text/html; charset=ISO-8859-1 p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info." server: gws x-xss-protection: 0 x-frame-options: SAMEORIGIN set-cookie: 1P_JAR=2021-07-04-00; expires=Tue, 03-Aug-2021 00:12:25 GMT; path=/; domain=.google.com; Secure set-cookie: NID=218=XHgI2vCBmp916TWlFdmxAu8Gw4P-pZbMjExtzqVgUWrq6e2LoeoyNfM2s21MJqel0Dr5i_J0NkqLSldvrOK9Pl0bg-KEvZPUr4UmrysxVB6Da3hJABsmsmP2j7jH5VoXVp5wYarMoIzP2nsKVQst8OH7tft6IZqcUXwOyVJScu0; expires=Mon, 03-Jan-2022 00:12:25 GMT; path=/; domain=.google.com; HttpOnly alt-svc: h3=":443"; ma=2592000 accept-ranges: none vary: Accept-Encoding ・・・中略・・・ <!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head></script> </body></html>
転送元と同じ名前で保存(-O)
以下は -O オプションを指定して転送元と同じ名前でファイルに保存(ダウンロード)する例です。
$ curl -O http://example.com/index.html return % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1256 100 1256 0 0 3194 0 --:--:-- --:--:-- --:--:-- 3195 $ cat index.html //保存したファイルを表示 <!doctype html> <html> <head> <title>Example Domain</title> </head> ・・・中略・・・ <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html>
-O オプションを指定する場合は、転送元のファイル名がないとエラーになります。
$ curl -O http://example.com/ return curl: Remote file name has no length! //転送元のファイル名の長さが0というエラー curl: try 'curl --help' or 'curl --manual' for more information
進捗率を # のプログレスバーで表示
以下は -# を指定してプログレスバーで進捗率を表示する例です。
$ curl -O -# http://example.com/index return ######################################################################## 100.0% ~ $ cat index //保存したファイルを表示 <!doctype html> ・・・中略・・・ <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html>
ファイル名を指定して保存(-o)
以下は -o オプションに続けてファイル名を指定してファイルに保存(ダウンロード)する例です。
$ curl -o myfile.html http://example.com return % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1256 100 1256 0 0 3043 0 --:--:-- --:--:-- --:--:-- 3048
保存時にディレクトリを動的に作成(--create-dirs)
-o(または --output)オプションと組み合わせて使用すると、必要に応じて必要なローカルディレクトリ階層を動的に作成します。 このオプションは、-o オプションで指定された dir を作成します。ファイル名にディレクトリを使用していない場合や、そのディレクトリがすでに存在する場合は作成されません。
以下は -o オプションのファイル名に存在しないディレクトリを指定した場合の例で、エラーになりファイルは保存されません。
//存在しないディレクトリ(curl)を指定(エラーになる) $ curl -o curl/myfile.html http://example.com return % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 Warning: Failed to create the file curl/myfile.html: //エラー Warning: No such file or directory
以下は--create-dirs オプションを指定して、存在しないディレクトリをファイル名に指定する例です。同定にディレクトリが作成され、その中にファイルが保存されます。
//--create-dirs オプションを指定 $ curl -o curl/myfile.html --create-dirs http://example.com return % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1256 100 1256 0 0 4717 0 --:--:-- --:--:-- --:--:-- 4721 //ディレクトリが作成されファイルが保存される $ cat curl/myfile.html <!doctype html> <html> ・・・中略・・・ </html>