通常のユーザーはこのスクリプトを実行できますが、rootはそれを見つけることができません。
~/bin
に保存した簡単なスクリプトがあります。 .profile
ファイルを更新して、このフォルダーをPATHに含めました。ターミナルに移動して、任意のディレクトリで作業し、スクリプトの名前を入力すると、問題なく実行できます。しかし、その端末でルートに切り替えると、スクリプトが見つかりません。新しい$ PATH更新が必要なファイルがどこかにあると思いますが、どのファイルかはわかりません。
おそらくSudo
を使用している場合は、おそらく$ PATH環境変数をsecure path(ファイルで定義されている/etc/sudoers)。 〜/ binディレクトリは、デフォルトには含まれていませんsecure_pathsudoersファイルに設定されているため、Sudo script
は機能しませんが、Sudo ~/bin/script
します。
sudoers構成ファイル(つまり/ usr/local/bin)で定義されているフォルダーの1つにスクリプトを配置して、直接アクセスできるようにすることができます。 secure_pathも設定ファイルで変更できますが、推奨されません。
グローバル設定を変更せずに、1つのコマンドでSudo
がsecure_path
へのパスをリセットするのを一時的に防ぐには、次のようにします。
Sudo env PATH=$PATH command
command
は、PATH
にある実行する実行可能ファイルの名前です。
これのエイリアスを作成して、(ルートではなく)独自の~/.bashrc
...に追加できます。
alias Sudo2='Sudo env PATH=$PATH'
次に、Sudo2 command
を使用して、独自のPATHを使用してSudo
で実行可能ファイルを実行できます。
rootで実行したときにスクリプトが失敗する理由
有効なユーザーのパスを確認する必要があります...この場合はroot
。
これを実行します:
(最初の2行はプロンプトとコマンドです。最後の行はコマンドの出力です。)
$ Sudo su -
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
他者が実行するスクリプトを配置する場所に関する推奨事項:
プロジェクトの/opt
の下にサブディレクトリを作成し、プロジェクトのexecスクリプトをそこに配置します。これは、同じパーティションへのOSのフレッシュインストール(もちろん、マイナスフォーマット)を生き残った場所です。
スクリプトのルート領域は次の場所にあります。
/opt/myprojectname/myscriptfiles/
これで、スクリプト/usr/local/bin/
をリンクできます
$ Sudo ln -s /opt/myprojectname/myscriptfile/myscript.sh /usr/local/bin/myscript.sh`
上記のテストからわかるように、root
$ PATH変数を変更する必要はありません。既に存在しているためです。
そのため、ルートパスを変更するのではなく、/opt/myprojectname/myscriptname
を検索するようにパスを変更できます
または、~/bin/myscript.sh
を/usr/local/bin/myscript.sh
にリンクすることもできます。
他の人が言ったように、特権環境はユーザーの環境と同じではなく、正当な理由があります。主に2つの解決策があります。(i)スクリプトをパスで呼び出すか、(ii)スクリプトをルートに移動してファイル階層内で上に移動し(たとえば、/ usr/custom/binでも動作します)、更新します反対のことをしようとするのではなく、ユーザーのパス。