web-dev-qa-db-ja.com

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

しかし、その後、警告が表示されました:

ディレクトリ「/ Users/petertao/Library/Caches/pip/http」またはその親ディレクトリが現在のユーザーによって所有されておらず、キャッシュが無効になっています。そのディレクトリの権限と所有者を確認してください。 Sudoでpipを実行する場合、Sudoの-Hフラグが必要な場合があります。

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

Sudoの-Hフラグは何をしますか?

38
Peter Tao

一般的に

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の設定値は変更しませんが、Sudo -Hは変数を "my"ホームディレクトリからルートのホームディレクトリに変更します。

あなたの場合

pipは、ユーザーrootとして実行され、$ HOMEの内容を変更したいことを警告しています。$ HOMEは、root(ほとんどの場合 "petertao"ユーザー)が所有していない '/ Users/petertao'に設定されています。警告は、pipがファイルをキャッシュするために$ HOMEを使用しているが、フォルダーの所有権の不一致のために独自のキャッシュを無効にしていることを示しています。

もちろん、ルートpipはルートとして(ほぼ)全能であるため、root pipとして実行中に「/ Users/petertao/Library/Caches/pip」を変更できます。これは、rootなしで実行されているプログラムがこれらのファイルを上書きまたは変更できなくなったため、後で面倒になる可能性があります。代わりに、pipは別のユーザーが所有するディレクトリへの書き込みを拒否します。

62
user3141593