sudo
と環境変数
sudo
コマンドを使う時、sudo
コマンドを使うユーザーの環境変数を引き継ぎたい時とかがあったりします。
プロキシとか、プロキシとか、プロキシとか。
例えば、ちょっと強引ですが、プロキシを設定後wget
をsudo
越しに実行しようとすると…プロキシ前提でインターネットアクセスする環境だと、うまくいきません。
$ export https_proxy=http://your-proxy.host:your-proxy.port
$ sudo wget https://github.com/kubernetes/minikube/releases/download/v0.30.0/minikube-linux-amd64
--2018-11-29 12:47:02-- https://github.com/kubernetes/minikube/releases/download/v0.30.0/minikube-linux-amd64
github.com (github.com) をDNSに問いあわせています... 失敗しました: 名前またはサービスが不明です.
wget: ホストアドレス `github.com' を解決できませんでした。
こういう時は、sudo
に-E
オプションを付けると、実行ユーザーの環境変数を引き継いでくれます。
$ sudo -E wget https://github.com/kubernetes/minikube/releases/download/v0.30.0/minikube-linux-amd64
現在の環境変数をそのまま保持するのがユーザの意向だと、セキュリティポリシーに指示する。 ユーザが環境を保持する許可を持っていない場合は、 セキュリティポリシーがエラーを返すことになるだろう。
とはいえ、そもそも環境変数を引き継ぐことは余計な問題を持ち込んでしまう可能性があることは意識しておく必要があるでしょう。
sudo
とリダイレクト
sudo
コマンドを実行した結果を、たまにファイルなどにリダイレクトしたいことがあります。
例えば、このように。
$ sudo -E wget https://github.com/kubernetes/minikube/releases/download/v0.30.0/minikube-linux-amd64 > /usr/local/bin/minikube
bash: /usr/local/bin/minikube: 許可がありません
ですが、これだとリダイレクト時に書き込み先の権限がない場合は、エラーになってしまいます。
1度、ファイルを別の場所に移動してmv
したり、wget
の例だと-O
オプションで解決してもいいのですが、こういう場合はsudo
とsh -c
を組み合わせることでも解決できます。
$ sudo -E sh -c 'wget https://github.com/kubernetes/minikube/releases/download/v0.30.0/minikube-linux-amd64 > /usr/local/bin/minikube'
sh
コマンドに-c
で、コマンドを渡して実行する方法で回避。
小ネタとして。