Edited at

sudoと環境変数とリダイレクトと


sudoと環境変数

sudoコマンドを使う時、sudoコマンドを使うユーザーの環境変数を引き継ぎたい時とかがあったりします。

プロキシとか、プロキシとか、プロキシとか。

例えば、ちょっと強引ですが、プロキシを設定後wgetsudo越しに実行しようとすると…プロキシ前提でインターネットアクセスする環境だと、うまくいきません。

$ 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

Man page of SUDO - JM Project


現在の環境変数をそのまま保持するのがユーザの意向だと、セキュリティポリシーに指示する。 ユーザが環境を保持する許可を持っていない場合は、 セキュリティポリシーがエラーを返すことになるだろう。


とはいえ、そもそも環境変数を引き継ぐことは余計な問題を持ち込んでしまう可能性があることは意識しておく必要があるでしょう。


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オプションで解決してもいいのですが、こういう場合はsudosh -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で、コマンドを渡して実行する方法で回避。

小ネタとして。