Mac PC の管理に使えるターミナルコマンド


研究室のPCやサーバの管理を引き継ぐに当たって、必要になりそうなコマンドの使い方やPCの設定について簡単にまとめておきます。内輪向けに作ったメモでしたが、他所でも役に立てばと思い公開します。

この記事では以下の項目についてまとめました。

- PCの使用状況
- アカウントの管理
- パーミッションの設定
- ソフトウェアのアップデート
- SSH関連
- ネットワークの状態

各項目について簡単な使い方を字引き的に紹介するので、より詳細な内容を知りたい場合は別途調べてください。

使用環境：Mac OSX Mavericks~Sierra です。

---

#現在のPCの状態を見る

自分一人のパソコンでは気になりませんが、共用のコンピュータやサーバでは計算リソース
等をめぐって、他のユーザーの使用状況が気になることがあります。
ここでは、コンピュータの使用状況を調べるときに役立つコマンドを紹介します。

###現在Login しているユーザ−を見る

ログインしているユーザーを表示するコマンドは`who`や`users`、 `finger`などがあります。

`who` と`users`は、/var/run/utmpx （バイナリファイル）に書かれているログイン情報を表示します。
このファイルを更新しないプログラムを用いていると、ログインしていても表示されません。

```Bash
% who
```
###ログイン履歴を見る
オプションで数字nをつけると、最近のn件を表示できます。

```Bash
% last -10
```

###PC の使用状態を見る
```Bash
% top
```
表示順は、デフォルトではPIDの順番に表示されますが、oを押した後にkeyを入力してreturn を押せば、指定した項目でソートできます。
また、オプション-oでソートする項目を選択することもできます。例えば、cpu使用率でソートしたければ、

```Bash
% top -o cpu
```

###ストレージの仕様状況を見る
パーティションごとのサイズや使用量、空容量を集計して表示します。

```Bash
% df -h
```

###ディレクトリやファイルのサイズを表示する

ディレクトリやファイルを指定すると、そのディレクトリの下にあるファイルやサブディレクトリについてサイズを集計します。
何も指定しなければ、カレントディレクトリについてサイズが計算されます。

```Bash
% du -H directory_name
```
オプション
`-h`　bibyte（1024単位）で表示
`-H`　Byte（1000単位）で表示

---

#アカウントの管理

コンピュータの管理者の大きな仕事の一つとして、ユーザーのアカウント管理があります。
ここでは、ターミナルからアカウント設定を確認・変更する方法を紹介します。

###ユーザー情報を見る

```Bash
% id user_name
```

###パスワードを変更する

```Bash
% passwd user_name
```
自分のパスワードを変えるときは、ユーザー名は不要です。
パスワードの再発行など、他のユーザーのパスワードを変更するときは`sudo`が必要です。


## dscl
Mac ではユーザーやグループなどの情報はディレクトリ構造のデータベースになっており、そのディレクトリ参照・編集のためのツールとして、Directory Service command line utility; dscl コマンドが用意されています。

dsclコマンドの基本的なオプション：
`-list`　　ディレクトリ下のサブディレクトリをリストアップする
`-read`　　ディレクトリ内を表示する
`-create`　新しいグループ、ユーザー、属性などを作成する
`-append`　属性に値を追加する
`-change`　値を変更する
`-delete`　ディレクトリや属性、値を削除する

###ユーザーやグループをリストアップする

```Bash
% dscl . -list /Users
% dscl . -list /Groups
```
さらに、`PrimaryGroupID`などのキーを指定すると、その情報も表示されます。

```Bash
% dscl . -list /Users PrimaryGroupID
```
###個々のユーザーやグループの情報を表示する

ユーザーやグループ個々の情報を調べるときは、`-read`オプションを使います。

```Bash
% dscl . -read /Users/user_name
```

`UniqueID`など複数のキーを指定して表示することもできます。

```Bash
% dscl . -read /Users/user_name UniqueID
```

###アカウントの設定変更

####ユーザーIDを変更する
`-change`オプションで値を変更できます。
以下は101 から102に変更するときの例です。

```Bash
% sudo dscl . -change /Users/user_name UniqueID 101 102
```

####ユーザーをグループに所属させる

```Bash
% sudo dscl . -append /Groups/new_group GroupMembership user_name
```

####ユーザーをグループから削除する

```Bash
% sudo dscl . -delete /Groups/new_group GroupMembership user_name
```


###グループを作る
`-create`オプションで新しいグループを作り、
`-append`オプションで`PrimaryGroupID`を指定します。
以下はIDを101に設定する例です。

```Bash
% sudo dscl . -create /Groups/new_group
% sudo dscl . -append /Groups/new_group PrimaryGroupID 101
```



#Permissionの設定

ファイルやディレクトリにはそれぞれ、権限が設定されています。
ユーザーは権限のないファイルやディレクトリにはアクセスできません。
ここでは権限の確認や変更の方法について紹介します。

`ls`コマンドで見ると、例えば次のように表示されます。
先頭の`-rw-r--r--@`などと書いてる列はアクセス権限を表しています。この意味は後で説明します。
`user1`と書いてある列は所有ユーザー名を、 `staff`と書いてある列は所有グループ名を表示しています。

```
% ls -l

-rw-r--r--@   1 user1  staff    43B 12  5  2017 alpha.txt
-rw-r--r--@   1 user1  staff    59B 12  5  2017 detect.log
drwxr-xr-x  123 user1  staff   4.1K  8 24  2019 data
drwx------    4 user1  staff   136B 12 24  2018 himitsu
drwxrwxrwx+   8 user1  staff   272B 10 30  2018 Public
lrwxr-xr-x@   1 user1  staff    34B  3  6 06:42 test -> /Users/user1/work/script/test
drwx------+ 348 user1  staff    12K  4 11 12:41 work
```

では、`-rw-r--r--`の部分の読み方を説明します。

先頭の文字はファイル種別を表し、
`d`　ディレクトリ
`-`　ファイル
`l`　シンボリックリンク

`rwx`は左から、所有者、所有グループ、その他のユーザーに与えられた権限を表している。`-`となっているところは、該当する権限が与えられていません。
それぞれの文字の意味は以下のとおりです。
`r`　読み取り
`w`　書き込み
`x`　実行

したがって、`-rw-r--r--`は所有者は読み書き可能、所有グループに含まれるユーザーは読み取り可能、その他のユーザーは読み取り可能です。


###ファイルやディレクトリのpermissionを変更する

```Bash
% chmod ooo file_name
```
`ooo`には左から順に、所有者、所有グループ、その他のユーザ権限を表す数字が入ります。
数字は0から7までで、2進数にしたときの`rwx`のON/OFFを表現します。

| 数値 | モード | | 数値 | モード |
|:---:|:---:|:-:|:---:|:---:|
| 0 | --- | | 4 | r-- |
| 1 | --x | | 5 | r-x |
| 2 | -w- | | 6 | rw- |
| 3 | -wx | | 7 | rwx |


例えば、全てのユーザーが自由に使えるようにしたい場合

```Bash
% chmod 777 file_name
```
自分以外のユーザーには見られないようにする場合

```Bash
% chmod 700 file_name
```


###ファイルやディレクトリの所有者を変更する

```Bash
% chown user_name file_name
```
オプション
`-R`　ディレクトリの中身も再帰的に変更します

###ファイルやディレクトリのグループを変更する

```Bash
% chgrp group_name file_name
```
オプション
`-R`　ディレクトリの中身も再帰的に変更します


ファイルやディレクトリを変更した後は、思ったように変更されているか確認します。

```Bash
% ls -l
```


---

###管理者権限での編集

root の`/bin`などのファイルやディレクトリは安全のために書き込みが制限されているところが多いです。ソフトウェアのインストールやコンピュータの設定などのために、アクセスが制限されているディレクトリやファイルを編集する必要があるときは、コンピュータの管理者が`sudo`を使って行います。

個々のユーザーのホームディレクトリ以下のファイルやディレクトリでは、他のユーザーに見られたくない、いじられたくないものの権限の範囲を`rwx --- ---`のように絞ります。管理者は`sudo`を使えば見ることが可能ですが、信用に関わる問題なので、無断で覗いたりしない方がいいでしょう。

---

#コンピュータやソフトウェアについて

ここから、コンピュータのハードウェアやOS、ソフトウェアについて情報を調べたり、アップデートしたりする方法を紹介します。

##Software の情報を見る

デスクトップからは、画面左上のリンゴ（アップルメニュー）をクリックして、「このMacについて」を選択すればOSのバージョンやハードウェアの仕様などを確認できます。
それぞれのアプリについては、メニューバーのアプリの名前をクリックし、「\<App名>について」を選択すればバージョンなどを見られます。

ターミナルからソフトウェアのバージョンを確認する場合は、オプションに`-v`や`-version`などをつけると表示されるものもあります。

###Mac OS のバージョンを確認する

```Bash
% sw_vers

ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G1815
```

`system_profiler`を使うと、もう少し詳しい情報を見られます。

```
% system_profiler SPSoftwareDataType
Software:

    System Software Overview:

      System Version: macOS 10.12.6 (16G1815)
      Kernel Version: Darwin 16.7.0
      Boot Volume: Macintosh HD
      Boot Mode: Normal
      Computer Name: ccc
      User Name: uuu (uuu)
      Secure Virtual Memory: Enabled
      System Integrity Protection: Disabled
      Time since boot: 7 days 17:17
```

`system_profiler`で表示できるデータタイプを知りたいときは、

```
% system_profiler -listDataTypes
```

`uname`でもOSやCPU情報を表示できます。

```Bash
% uname -a
```
オプション
`-a`　全てのシステム情報
`-m`　マシンタイプ
`-n`　ノード名
`-p`　CPU
`-r`　OSのリリース
`-s`　OS名
`-v`　OSのバージョン

---
###XCODEのバージョンを見る

```Bash
% xcodebuild -version

Xcode 9.2
Build version 9C40b
```

---

##Softwareをアップデートする
ふつうApple のApp Store でアプリをインストールしたり、更新したりしますが、 CUIからでもソフトウェアをアップデートできます。

アップデートを確認する場合

```Bash
% softwareupdate --list
```
全てのアップデートをインストールする場合

```Bash
% softwareupdate -ia
```
個別にインストールする場合

```Bash
% softwareupdate -i app_name
```

---

##Hardware の情報を見る

```Bash
% system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: Mac Pro
      Model Identifier: MacPro6,1
      Processor Name: 8-Core Intel Xeon E5
      Processor Speed: 3 GHz
      Number of Processors: 1
      Total Number of Cores: 8
      L2 Cache (per Core): 256 KB
      L3 Cache: 25 MB
      Memory: 64 GB
      Boot ROM Version: www
      SMC Version (system): xxx
      Serial Number (system): yyy
      Hardware UUID: zzz
```

#外付けディスクの取り外し

ターミナルから外付けディスクをunmountするには、

```Bash
% diskutil unmount /Volumes/XXX
```

---

#SSH

ここでは、`SSH`でログインしてサーバーを使用する方法を紹介します。

###Macにリモートでログインする

```Bash
% ssh user_name@host
```

オプションに大文字の`-X`または`-Y`をつけると、X11の転送が使えます。

```Bash
% ssh -X user_name@host
```

ただし、sshd_config で`X11Forwarding`（X11の転送）が`yes`に設定されていないと、オプションに`-XY`をつけても転送されません。
Mac のデフォルトではOFFになっているので、サーバー管理者は最初に設定が必要です。
特にOSのヴァージョンアップをした後などは設定がデフォルトに戻っている場合があるので要注意。


###ファイルを転送する

ローカルからリモートへ送る場合

```Bash
% scp 送り元path user_name@host:送り先path
```

リモートからローカルへ送る場合

```Bash
% scp user_name@host:送り元path 送り先path
```
オプション
`-r`　ディレクトリを転送
`-p`　タイムスタンプやパーミッションを保持
`-C`　通信を圧縮

---

###ディレクトリの中身を転送・同期する

`rsync`はリモートに限らず、ローカルでの転送・同期にも使えます。
リモートの場合はpathの前に「user_name@host:」をつけます。

```Bash
% rsync 送り元path 送り先path
```
オプション
`-a`　パーミッションなどを保持して転送（-rlptgoDと同じ）
`-u`　追加、更新されたファイルのみコピーする
`-v`　転送状況を表示
`-z`　通信を圧縮

###SSHの再起動
sshd_config を編集して設定変更した場合、SSHを再起動すると変更が反映されます。

```Bash
% sudo launchctl stop com.openssh.sshd
```


#ネットワークの状態を見る

ここでは、ネットワークの状態、IPアドレスなどを調べる方法について紹介します。

###ドメイン名からIPアドレスを探す

```Bash
% nslookup domain
```

###ドメイン情報を検索する

ドメイン名やIPアドレスから、ドメイン情報を検索します。

```Bash
% whois ip_address
```
---

###ポートスキャン

ncコマンドはいろいろな使い方ができるが、ここではポートスキャンの方法を紹介します。
IPアドレスのポートが開いているか確認します。
ポート番号は`1-100`のようにして、範囲を指定して一気に実行することもできます。

```Bash
% nc -z ip_address port_No
```
オプション
`-z`　ハンドシェイクだけする。
`-u`　UDPを使って通信する（デフォルトではTCP）。
`-v`　冗長表示（Verbose）

###接続確認

リモートへの接続を確認します。
ICMパケットを送信して、送り先がエコーを返し、パケットが帰って来れば導通しています。

```Bash
% ping ip_addreess
```
オプション
`-c`　試行回数を指定する

試行回数を指定しなかった場合は、`control`+`c`で終了します。

---

###接続状況の確認

ネットワークの接続状態を表示します。

```Bash
% netstat 
```
オプション
`-t`　TCP通信のみ表示
`-u`　UDP通信のみ表示


###ネットワークインターフェイスの状態を表示

自分のネットワークインターフェイスの設定状況を表示します。自分のIPアドレスもわかります。
設定の変更も`ifconfig`コマンドで可能です。

```Bash
% ifconfig
```

---

#コマンドについて調べる

ターミナルで使えるコマンドについて、使い方や引数などを知りたいときにネット検索してもいいですが、ターミナルで調べる方法もあるので最後に紹介しておきます。

`man`コマンドを使うと、各コマンドのマニュアルを読むことができます。
マニュアルから抜けるときは`q`を入力します。

```Bash
% man command_name
```