sudo script.sh
またはとして実行できるスクリプトがありますpkexec script.sh
スクリプトが名前で実行するときにユーザーにパスワードを要求した場合、ユーザーの観点からははるかに良いでしょうscript.sh
。
ルート特権でスクリプト全体にリクエストを「埋め込む」、pkexec
またはsudo
実行するにはどうすればよいですか?
sudo sh -c
スクリプトに関数があるため、すべてを実行することは最良の解決策ではないことに注意してください。
sudo script.sh
またはとして実行できるスクリプトがありますpkexec script.sh
スクリプトが名前で実行するときにユーザーにパスワードを要求した場合、ユーザーの観点からははるかに良いでしょうscript.sh
。
ルート特権でスクリプト全体にリクエストを「埋め込む」、pkexec
またはsudo
実行するにはどうすればよいですか?
sudo sh -c
スクリプトに関数があるため、すべてを実行することは最良の解決策ではないことに注意してください。
回答:
これは動作します:
echo "$(whoami)"
[ "$UID" -eq 0 ] || exec sudo "$0" "$@"
例:
./test.sh
blade
[sudo] password for blade:
root
"$@"
パラメータごとに1つずつ、複数の単語に展開されます。
きれいなダイアログが必要な場合は、このようなものを試してください。私が書いた他の何かからこれをまっすぐに抜き取ったので、あなたが必要としないかもしれない余分なものがありますが、それは一般的なアイデアを示しています:
brand="My Software"
# Check that the script is running as root. If not, then prompt for the sudo
# password and re-execute this script with sudo.
if [ "$(id -nu)" != "root" ]; then
sudo -k
pass=$(whiptail --backtitle "$brand Installer" --title "Authentication required" --passwordbox "Installing $brand requires administrative privilege. Please authenticate to begin the installation.\n\n[sudo] Password for user $USER:" 12 50 3>&2 2>&1 1>&3-)
exec sudo -S -p '' "$0" "$@" <<< "$pass"
exit 1
fi
これは、まだ持っていない場合にインストールできるホイップテールを使用します。
sudo apt-get install whiptail
exec echo [PASSWORD]
!すべてのユーザーが表示できるコマンドラインでパスワードを使用してプロセスを生成します。組み込みコマンドecho
(組み込みバージョンをで強制するbuiltin echo
)またはbashism <<<
(次のようにsudo ... <<< "$pass"
)を使用します。Shおよびその他のシェルには、これらのケースのヒアドキュメントがあります。また、特殊文字が含まれている場合はパスワードを引用してください。
whiptail
コマンドを別のスクリプトに入れて、カスタムパスワードプロンプトSUDO_ASKPASS=/path/to/askpass-with-whiptail.sh sudo -A -p "My password prompt" -- "$0" "$@"
をsudo
処理するなどの方法を使用します。
blade19899の答えは確かに進むべき道ですがsudo bash
、シバンを呼ぶこともできます。
#!/usr/bin/sudo bash
# ...
明らかな注意点は、これはスクリプトが呼び出された場合にのみ機能し、スクリプトが呼び出さ./script
れた直後に失敗することbash script
です。
bash script
、スクリプトを呼び出すためにコマンドラインに入力するべきではない理由の1つです。スクリプトbash
が#!
行内以外を指定している場合、withを呼び出すとbash script
失敗します。また、bash script.py
それを使用してpythonスクリプトを呼び出そうとしても失敗します。
perl script
ただし、で実行できます。Perlは、本当に素晴らしいことを目指して、shebang行をチェックし、perlを呼び出していない場合は正しいプログラムを実行します。
ルートアクセスが必要なスクリプト内のコマンドの前書きsudo
-ユーザーがまだアクセス許可を取得していない場合、スクリプトはその時点でパスワードの入力を求めます。
例
#!/bin/sh
mem=$(free | awk '/Mem:/ {print $4}')
swap=$(free | awk '/Swap:/ {print $3}')
if [ $mem -lt $swap ]; then
echo "ERROR: not enough RAM to write swap back, nothing done" >&2
exit 1
fi
sudo swapoff -a &&
sudo swapon -a
このスクリプトは、sudo <scriptname>
またはとして実行できます<scriptname>
。どちらの場合でも、パスワードの入力は1回だけ要求されます。
sudo
、25の異なるコマンドを冗長に呼び出す必要があります。sudoを1回呼び出す方が簡単です。ただし、ここでスクリプトがsudoを1回だけ呼び出すのは、sudoのタイムアウトが15分であるためです。それよりも時間がかかるコマンドは再プロンプトが必要になります。あなたのやり方はうまくいきます。。。動作に必要な方法ではありません。
ここで明らかな懸念に対処した人は誰もいないようです。置くsudo
あなたが配布していること、あなたのスクリプト内では、不正なユーザーの習慣を促進します。(「ユーザーの観点から」と言うので、あなたはそれを配布していると仮定しています。)
真実はのバンキングのセキュリティの原則に似ているアプリケーションやスクリプト使用でのガイドラインがあるということです:あなたを呼び出すと、彼らは「あなたの銀行から」呼び出していると言う誰かにあなたの個人情報を与えることはありませんが、そしてそれは存在します同様の理由で。
アプリケーションのルールは次のとおりです。
プロンプトが表示されたら、パスワードを入力しないでください 何が行われているのか確信。 これは、sudo
アクセス権を持つすべてのユーザーに3回適用されます。
sudo
コマンドラインで実行したためにパスワードを入力している場合は、すばらしいです。SSHコマンドを実行したために入力する場合は、問題ありません。もちろん、コンピューターにログインするときに入力する場合は、すばらしいです。
外部のスクリプトまたは実行可能ファイルを実行し、プロンプトが表示されたときにパスワードをうまく入力した場合、 、スクリプトがそれで何のかません。ご存知のように、それをプレーンテキストの一時ファイルに保存することもできますし、それ自体のクリーンアップに失敗することさえあります。
明らかに未知のコマンドセットを実行することに関する別々の追加の懸念がありますroot
が、私がここで話しているのはパスワード自体のセキュリティを維持することです。アプリケーション/スクリプトが悪意のあるものではないとしても、パスワードを安全に処理して防ぐ必要があります他のアプリケーションがそれを入手して悪意を持って使用。
したがって、これに対する私自身の個人的な反応は、ルート特権が必要な場合にスクリプトに入れる最良のことです:
#!/bin/bash
[ "$UID" -eq 0 ] || { echo "This script must be run as root."; exit 1;}
# do privileged stuff, etc.
sudo script_name
は同じように脆弱ですが、それは同じです。たぶん、この考えは悪い習慣を助長するでしょう-私はそれについて何も言いません。しかし、キーはプログラムが何をするかを知ることであり、それはユーザーの責任です。これが、オープンソースソフトウェアの背後にある全体的なアイデアです。私自身のスクリプトについては、まあ。。。スクリプトはプレーンテキストです-ユーザーは、スクリプトが何をするかを知りたい場合に読むことができます
exec
-それ自体を呼び出しますが、同時にprocessを置き換えるため、スクリプトの複数のインスタンスを生成しません