sudo -i COMMAND
COMMAND
ルートディレクトリで実行します$HOME
。
現在のディレクトリでスクリプトを実行しようとするとエラーが発生します。
$ sudo -i ./myscript.sh
-bash: ./myscript.sh: No such file or directory
私の場合、sudo -iコマンドは現在のディレクトリを/ rootに移動したため、/home/user/myscript.shを見つけることができません。
sudo -i
コマンドに現在のディレクトリを保持させるにはどうすればよいですか?
sudo
さまざまな環境とsudo -i
それに必要な環境があります。sudo -i
答え1
ディレクトリを変更することはその一部ですsudo -i
。ただし、前の位置に戻って次のコマンドを実行できます。
sudo -i sh -c "cd '$PWD'; ./myscript.sh"
$PWD
一重引用符が含まれると失敗します。(一方で、知る $PWD
スペースやシェルに特別な内容を含めないでください。一重引用符も削除できます。 )
より安全な方法は次のとおりです。
sudo -i sh -c 'cd "${1}"; ./myscript.sh' sh "$PWD"
(ユーザーのログインシェルが途中で実行され、別の拡張ラウンドが発生するため、通常のコマンドは期待"$1"
どおりに機能しません。これらの拡張を防ぐためにコマンドをエスケープしようとしますが、失敗します(など)。sudo -i
$1
$foo
「sudo --login」で「sh -c」を実行すると、位置パラメータは拡張されません。解決策はありますか?血まみれの詳細を取得します。 )
とにかく、スクリプトが通常ルートによって実行されるツールである場合は、ルートがあるディレクトリにスクリプトを配置するのがPATH
妥当です。そしてでのみ書くことができますroot
。通常、root以外のユーザーが実行を台無しにする可能性を避けるのが最善ですが、通常のアカウントのroot
ホームディレクトリにある場合、問題の可能性はおそらく最小限に抑えられます。
答え2
sudo -i
ホームディレクトリの変更を防ぐために、この-i
フラグを使用しないでください。
sudo ./myscript.sh
sudo
(参照man sudo
)フラグステータスに関する文書-i
(強調)
-i
、--login
ターゲットユーザーのパスワードデータベースエントリで指定されたシェルをログインシェルとして実行します。これは、シェルが.profile
、またはなどのログイン固有のリソースファイルを読み取ることを意味します.bash_profile
。.login
[...]sudo
シェルを実行する前に、そのユーザーのホームディレクトリに変更してみてください。このコマンドは、ユーザーがログインしたときに受信するのと同様の環境で実行されます。
あなたの質問は、スクリプトを実行するにはルートプロファイルが必要であるという内容で編集されました。どんな環境が必要なのかわからず、私が提供できる最も近いのはこれだ。
sudo -i "${PWD:-$(pwd)}/myscript.sh"
実際の場所myscript.sh
(ホームディレクトリなど)がわかっている場合は、その場所を直接提供することをお勧めします。
sudo -i "$HOME/myscript.sh"
より良いオプションがあるかもしれませんが、設定する必要がある環境に関する詳細を提供する必要があります。