sudoパスワードを要求し、bashスクリプトでプログラムによって特権を昇格しますか?


49

現在、ストックLinuxシステム(現在、Ubuntu)にさまざまなプログラムをインストールおよびセットアップするbashスクリプトに取り組んでいます。プログラムをインストールし、昇格された特権を必要とするさまざまなフォルダーに多数のファイルをコピーするため、標準の「昇格された特権が必要です」を終了しました。

ただし、可能であれば、ユーザーがsudoでスクリプトコマンドを実行しない場合(GUIファイルマネージャーから起動するなど)、sudoパスワードをユーザーに要求し、スクリプトの権限を自動的に昇格できるようにしたいと考えています。ユーザーがスクリプトを再起動する必要はありません。

これは標準のLinuxインストールで実行するように設計されているため、システムを変更するオプションは私の目的には機能しません。すべてのオプションをスクリプト自体に含める必要があります。

これはBash内で可能ですか?もしそうなら、これを行うための最良の(安全でありながら簡潔な)方法は何ですか?



@MichaelMrozek-ああ、断片化を最小限に抑えながら、非常に多くのニッチサイトを持つ喜び。そして、あなたが知っている、あなたが与えたリンクは、Googleを検索しているときに一度も私のために出てきたことはありません。
シャウナ


@jwwこれらのリンクのほぼすべてが、このリンクから約4年後に質問されたことに気付きますか?
シャウナ

1
@Shauna-あなたは今までに問題を解決したと思います。リンクは将来の訪問者向けです。

回答:



16

私は提案します:

#!/bin/bash

if (($EUID != 0)); then
  if [[ -t 1 ]]; then
    sudo "$0" "$@"
  else
    exec 1>output_file
    gksu "$0 $@"
  fi
  exit
fi

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
done

何をif [[ -t 1 ]];チェックしますか?
シャウナ

ああ、わかった。私はそれが端末対GUIに関係していると考えましたが、ifステートメント自体がチェックしていたものがわからなかった。
シャウナ

すごい、ありがとう!
Fire-Dragon-DoL

16

これをスクリプトの最初の行として追加します。

[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"

に変更sudoするgksugksudo、グラフィカルプロンプトを希望する場合。


3
"$*"は、すべての引数を1つにマージ/path/to/script one two threeすることになり(結果$1としてone two three)、$*引用符なしでは引数内のスペースが台無しになることに注意してください。"$@"正しく動作します
マイケル・ムロゼック

@MichaelMrozekあ、そうです。それは私が探していたものです、修正
ケビン

sudoコマンドがないと思われるDebianでこれを行う方法はありますか?
間違ったユーザー名

@wrongusername installはsudo、を使用するよりもはるかに優れていsuます。しかし、本当に必要な場合は、おそらくexec su -c "$0" "$@"
ケビン

2

共有を気にしないスクリプトの例::

#!/bin/bash
[ "$UID" -eq 0 ] || exec sudo "$0" "$@" && echo -n "sudo bash what: "
read WHAT
sudo $WHAT

--ImP.TeK


[ "$UID" -eq 0 ] || exec sudo "$0" "$@"-本当に効率的なワンライナーのように見えます!いいね!
溝の蜜

ここで有効なUIDを使用するのは理にかなっています$EUDIか、それとも常に同じ結果ですか?例:[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
グルーブネクター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.