Mac ターミナルの基本的な使い方・操作方法(4)プロセスの管理、シグナル、ユーザー管理、ソフトウェアのインストール、ネットワークの基本コマンド

ターミナルを使ったジョブやプロセスの管理やシグナル、ユーザー管理、ソフトウェアのインストール、ネットワークの基本コマンドなどのごく基礎的なことについての覚書です。

作成日:2020年01月27日

関連ページ

ジョブとプロセス

ジョブとはシェルが管理している「作業のまとまり(単位)」のことで、シェルから見た実行中のコマンド(一連の処理)のことです。

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 [オプション]

以下のようなオプションがあります。

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 デーモンなど制御端末を持たないプロセスも表示
ps コマンドの主な表示項目
項目 意味
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 で確認することができます。

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 [オプション]

以下のようなオプションがあります。

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 + scontrol + 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 [オプション] [ユーザ]

以下のようなオプションがあります。

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 オフィシャルサイト

インストール

現在は 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 フォーミュラ名

主なサブコマンド

Homebrew の主なコマンド
コマンド 概要
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 ファイル等から手順を確認する必要があります)。

  1. 圧縮されたソースコード(配布パッケージ)をダウンロード
  2. configure スクリプトを実行して Makefile を作成
  3. make コマンドでコンパイル
  4. 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 アドレス)

以下のようなオプションがあります。

traceroute コマンドの主なオプション
オプション 意味
-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} として指定し、以下のような変数(一部抜粋)が使えます。

-w で使える変数(一部抜粋)
変数 説明
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>