web-dev-qa-db-ja.com

sudo:source:コマンドが見つかりません

私はbashのデフォルトプロファイルの一部を更新しており、次のチュートリアルから、次を使用して新しい環境設定で新しいプロファイルをリロードできることを確認しました。

source /etc/bash.bashrc

唯一のことは-新しい環境変数は現在のユーザーのみが利用可能であり、Sudoを使用した場合は無視されたということです。ターミナルセッションを閉じて再参加したときにのみ、Sudoで使用できるようになりました。

私が使用しようとすると:

Sudo source /etc/bash.bashrc

エラーが表示されます:

Sudo: source: command not found

ターミナルを閉じて再起動することなく、Sudoの新しいbashプロファイル設定をロードする簡単な方法はありますか?

-最初は、変数を参照するインストーラスクリプトを使用していました。スクリプトを直接呼び出したときに変数にアクセスできましたが(ルートになる必要があるため、これによりディレクトリを作成するときに問題が発生します)、Sudoを使用してインストールスクリプトを呼び出すことはできませんでした。

これらの簡単なコマンドでテストすることでこれを証明しました。

echo $ENV_VARIABLE
Sudo echo $ENV_VARIABLE

最初のものは変数の値を出力しますが、2番目のものは何も出力しません。

52
HorusKol

問題は、sourceがbashビルトインコマンド(lsgrepなどのプログラムではない)であることです。 1つのアプローチは、rootとしてログインしてからsourceコマンドを実行することだと思います。

Sudo -s
source /etc/bash.bashrc
69

問題は、sourceがシェル組み込みコマンドであることではありません。 それが事実であるは、実際にcommand not foundエラーをスローしているものですが、それが機能していても機能するとは限りません。

実際の問題は、環境変数の仕組みです。そして、これらは次のように機能します。新しいプロセスが開始されるたびに、何も起こらない場合は、親の環境を継承します。このため、サブシェルを使用して(たとえば、bashインスタンス内でbashと入力)、envの出力を確認すると、その親と同様の結果が得られます。

ただし、Sudoの動作方法(マンページに記載されている)により、Sudoはユーザーの環境を削除し、代替ユーザーの「デフォルト」環境を作成しようとするため、コマンドの実行が実行されますあたかもそれを呼び出したユーザーは呼び出しユーザー(これは予想される動作)であったため、Sudo nautilusとしてnautilusを実行すると、/rootではなく、/home/yourusernameフォルダーにフォルダーが開かれます。

そう:

Sudo source script.shのようなことをしてからSudo commandを実行すると、たとえそれが機能したとしても、後のSudo commandに変数を設定することに成功しません。

環境変数を渡すには、Sudoに環境を保存するように指示し(-Eスイッチを使用し、sudoersファイルに適切な権限を付与する)、コマンドにSudo VAR1=VALUE1 VAR2=VALUE2 commandとして設定します。

13
ssice

Marcosによる のように、ここでの主な問題は、sourceが実行されるシェルプロセスのみに影響するシェル組み込みコマンドであることです。

簡単な解決策は、ルートとして新しいシェルを起動するだけで、bashは起動時に自動的に/etc/bash.bashrcを読み取ります。それは言うだけで簡単です

Sudo bash
3
poolie

ターミナルを閉じて再度開いても、状況は変わりません。デフォルトでは、Sudoは環境を削除します。それを無効にするには、-EをSudoに追加します。

2
psusi

Bash プロセス置換 を使用すると、次のことができます。

source <(Sudo cat /etc/bash.bashrc)
2
TomDotTom

このエラーは、コマンドラインから呼び出そうとしているバイナリが現在のユーザーのPATH変数の一部であり、ルートユーザーのPATHの一部ではないために発生します。

これを確認するには、アクセスしようとしているバイナリのパスを見つけます。私の場合、「bettercap-ng」と呼ぼうとしていました。だから私は走った、

$ which bettercap-ng
/home/user/work/bin/bettercap`

この場所がルートユーザーのPATHの一部であるかどうかを確認しました。

$ Sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

そのため、コマンドラインから呼び出そうとしているバイナリをSudoが見つけることができません。したがって、見つからないエラーコマンドを返します。

以下のようなバイナリを呼び出すときに、現在のユーザーのPATHを使用するようにSudoに指示できます。

Sudo -E env "PATH=$PATH" [command] [arguments]

実際、エイリアスを作成できます:

alias mysudo='Sudo -E env "PATH=$PATH"'

エイリアス自体にSudoという名前を付けて、元のSudoを置き換えることもできます。

1