sudo -Hは何をするのですか?

pipでvirtualenvをインストールしようとした結果

$ pip install virtualenv

パーミッションデッドエラーが発生しました

IOError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/virtualenv.py'

そこで、sudo を使って virtualenv をインストールしました。

$ sudo pip install virtualenv

と思ったら、警告が表示された。

The directory '/Users/petertao/Library/Caches/pip/http' or its parent ディレクトリは、現在のユーザーによって所有されておらず、キャッシュが無効になっています。 を無効にしています。そのディレクトリのパーミッションと所有者を確認してください。もし sudoでpipを実行する場合、sudoの-Hフラグが必要です。

ディレクトリ '/Users/petertao/Library/Caches/pip' またはその親ディレクトリの所有者がいません。 ディレクトリは、現在のユーザーによって所有されておらず、キャッシングホイールも無効になっています。 そのディレクトリのパーミッションと所有者を確認してください。もし sudoでpipを実行する場合、sudoの-Hフラグが必要です。

**sudo's -Hフラグは何をするのでしょうか?

ソリューション

一般的に

man sudo (正確なテキストは異なるかもしれませんが、似たようなものでしょう)。

-H

-H (HOME) オプションは、セキュリティポリシーが HOME 環境変数を、パスワードデータベースで指定された対象ユーザー (デフォルトでは root) のホームディレクトリに設定するよう要求します。ポリシーによっては、これがデフォルトの動作となる場合もあります。

では、なぜこのようなオプションがあるのでしょうか? 通常、"sudo" を使用しても $HOME 環境変数は変更されません

例えば

 echo $HOME $USER
/home/testuser testuser

 sudo bash -c 'echo $HOME $USER'
/home/testuser root

 sudo -H bash -c 'echo $HOME $USER'
/home/root root

通常の sudo は、私がどのユーザであるかを "testuser" から "root" に変更しますが、$HOME の設定値には変更しません。

あなたの場合

pip はユーザ root として実行され、$HOME を '/Users/petertao' に設定し、root (おそらく "petertao" ユーザ) が所有しないものを変更しようとしたと警告を出しています。 この警告は、pip がファイルをキャッシュするために $HOME を使用しているが、フォルダの所有権の不一致のため、自身のキャッシュを無効にしていることを示します。

もちろん、rootで実行中のpipは '/Users/petertao/Library/Caches/pip' を変更することができます。rootは(ほとんど)全能なので。 これは後で面倒なことになります。なぜなら、root 以外で実行されているプログラムは、これらのファイルを上書きしたり変更したりできなくなるからです。 その代わり、pip は他のユーザが所有するディレクトリに書き込むことを拒否します。

解説 (3)