春といえば入学・進級の季節。このタイミングで念願のMacを手に入れ嬉しくて仕方ない、という"Mac新入生"も多いのではないだろうか。当コラムでは、そんな読者に知っておいて損のない「Macのシステム管理コマンド入門」をお届けする。シリーズ第1回は「sudo」だ。

macOSにおいて「管理者とは」

Finderでホームフォルダ以外の領域へファイルを保存しようとしたり、システム環境設定で鍵ボタンをクリックしたり、なにかの拍子に「管理者の名前とパスワード」を求められることがある。これは管理者としての権限が与えられたユーザ以外にはシステム上重大な変更を許さない、だから管理者であることの証として管理者のユーザ名とそのパスワードを入力すべし、というMac/macOSのシステム管理上一貫しているポリシーだ。

macOSでは、最初に登録したユーザに管理者権限を与えている。だからMacを購入して最初に登録したユーザが、1人1台で使うことが多いMacなだけに"自分"が管理者となる。管理者は増やすこともできるが、1台のMacを複数人で共有するならともかく、セキュリティが緩くなるなどデメリットのほうが多い。

Terminal(シェル)にも、同じ仕組みが存在する。ハードウェアになんらかの影響を与えるコマンド、パーティションの変更などストレージに重大な変更をくわえるコマンド、ネットワーク設定を変更するコマンドなど、システム管理上重要な機能/役割を持つコマンドは軽々しく実行されては困るため、なんらかのハードルを設ける必要がある。

その役割を果たすコマンドが「sudo」だ。ひとたび実行されると、設定ファイル(/etc/sudoers)の内容を見て実行したユーザの権限をチェック、管理者権限が与えられている場合は管理者として振る舞える。macOSの場合、パスワードが設定済の管理者アカウントのみが実行を許可されているため、最初に登録したユーザでログインしていなければ「Sorry , user ○○○ may not run sudo on コンピュータ名」と表示され実行を拒否される。

ところで、sudoが採用される以前のUNIX系OSでは、「su」コマンドを利用してシステム上最大の権限を持つ特別なユーザ「root」に昇格するのが一般的だった。しかし、この方法はパスワードの二重管理が必要になるなどセキュリティ上問題が多いうえ、rootのパスワードが漏えいすると一大事になることから、現在ではあまり利用されていない。詳しい経緯については、当コラム第203回を参照してほしい。

  • macOSでは特別な処理/操作を行うとき「管理者」の認証を求める

  • 最初に登録したユーザでログインしていなければ「sudo」は実行できない

sudoの使いかた

具体的な利用事例を紹介する前に、sudoの基本的な書式について説明しておこう。ルールは単純で、管理者権限で実行したいコマンドラインの前に「sudo」を挿入すればOK。そのあと行末でEnterキーを押すと、パスワードの入力を促され、認証されれば管理者(rootと同等)としてコマンドライン全体を実行できる。なお、入力したパスワードは5分間キャッシュされ(初期値)、その間は再びsudoを実行してもパスワードを訊ねられることはない。

sudo [オプション] [コマンドライン ...]

たとえば、/etcディレクトリ上の書類を「vi」で開くと(ex. vi /etc/hosts)、一般ユーザには書類の保存・上書きが許されないためリードオンリーで開かれることになるが、以下の要領でsudoと組み合わせて実行すれば、上書き保存が可能になる。システムフォルダ(/System/Library以下)など一般ユーザの書き込みが禁止されている領域へのファイルコピー/上書き/削除についても、この要領で実行可能だ。

$ sudo vi /etc/hosts
  • システムフォルダへのファイルコピーなど、一般ユーザのアクセスが制限されている領域への書き込みも可能になる

sudoコマンドのおもなオプション
b 引数のコマンドラインをバックグランドで実行
h ヘルプを表示
l カレントユーザが許可/禁止されているコマンドを表示
S 標準入力からパスワードを読み込む
u ユーザー名 コマンドを実行するユーザを指定する

sudoの書式に難しいところはないが、"実行結果をリダイレクトできない"ことで悩むユーザは多いようだ。たとえば、コマンドの実行結果を「hogege」として書き出すつもりで以下のコマンドラインを実行すると、エラーになってしまう。

$ sudo "echo 'test' > hogege"
  • リダイレクトを含む処理をsudoで実行するには……

この問題を解決するには、クォーテーションで括った範囲をサブシェルで実行する。具体的には、sudoとクォーテーションで括った範囲の間に「sh -c」を挿入すればいい。先ほどの例でいえば、以下のとおりになるだろう。

$ sudo sh -c "echo 'test' > hogege"

なお、「sudo」の読みかただが、公式サイトでは「スードゥー(soo-doo)」とされている。コマンドの由来が「su "do"」だから当然だが、筆者をはじめ少なくない層が「スドー」と呼んでいる。知人の須藤さんを連想するから……というわけでもないが、こちらのほうが親しみやすいのではないだろうか?