web-dev-qa-db-ja.com

スクリプト内でパスワードなしでSudoを使用する

何らかの理由で、ユーザーとして、Sudoを使用せずに実行するにはスクリプトroot.shが必要です。
私は、sudo INSIDE script.shを置く唯一の解決策と考えました。例を見てみましょう:

script.sh :

#!/bin/sh
Sudo apt-get update

もちろん、このスクリプトを実行すると、パスワードの入力を求めるプロンプトが表示されます。次に、sudoersファイルに追加しました(最後に他のすべてをオーバーライドするために):

user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh

ところで、私も行を試しました:

user ALL=(ALL) NOPASSWD:/path/to/script.sh

(違いを完全に理解していなかったと思う)

しかし、このスクリプトの実行にSudoを使用しない場合、これは私の問題を解決しません。

# ./script.sh
[Sudo] password for user: 
# Sudo ./script.sh
Starts updating...

それで、私は自分自身に言います。「わかりました。つまり、sudoersで参照されたファイルがある場合、Sudoで呼び出した場合にのみプロンプトなしで動作します。
それでは、次のように別のスクリプトscript2.shを作成します。

script2.sh

#!/bin/sh
Sudo /path/to/script.sh

実際に動作します。しかし、特にすべてのコマンドに2つのスクリプトを使用する必要があるという事実により、このソリューションに本当に満足していません。

この投稿は、この問題を抱えている人々を支援し、同じ解決策を検索するためのものです(良い投稿は見つかりませんでした)。

気軽にアイデアを共有してください!


編集1:

この「apt-get update」は、私のスクリプトが実際にどのようなものであるかの単なるFARであるという事実を主張したいと思います。私のスクリプトには多くのコマンドがあり(rootアクセス専用の構成ファイルへのいくつかのcdを使用)、解決策は「まあ、apt-getで直接行う」ことはできません。

例の原則は理解を助けることであり、一般的な問題の答えを単純化する言い訳ではありません。

30
Nilexys

パスワードなしでSudo /usr/bin/apt-get updateを実行する場合は、sudoersエントリが必要です。

user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update

スクリプト全体の大きな問題については、2つのアプローチが考えられます。

アプローチ1

Sudoを必要とするスクリプト内の各コマンドについて、そのコマンド専用にsudoersに行を作成します。この場合、スクリプトは通常どおり呼び出すことができます。

./script1.sh

アプローチ2

スクリプト全体としてsudoersに行を配置します。これが完了すると、個々のコマンドにSudoは必要ありません。ただし、次のようにスクリプトを開始するにはSudoを使用する必要があります。

Sudo ./script.sh
16
John1024

私のブログから: IDMRockstar.com

キッカーは、時々、ルートとしてコマンドを実行する必要があるということです。パスワードを漏らさずにそれを達成するための迅速で汚い方法を以下に示します。

#! /bin/bash
read -s -p "Enter Password for Sudo: " sudoPW
echo $sudoPW | Sudo -S yum update

この方法では、ユーザーはパスワードの入力を求められ(そしてターミナルから隠されます)、必要に応じてコマンドに渡されるため、root =としてスクリプト全体を実行しません

あなたがより良い方法を持っているなら、私はそれを聞きたいです!私はシェルスクリプトの専門家ではありません。

乾杯!

。:アダム

9
Adam

パスワードが非常に安全である必要がない場合(会社のテストサーバーなど)、echoを使用してスクリプトでSudoに昇格できます。

echo YourPasswordHere | Sudo -S Command

ただし、プロンプトは「パスワードを入力してください」というテキストを出力に出力します。だから、それがきちんとしていると期待しないでください。

こちらをご覧ください Askubuntu post

8
Eaton Emmerich

前述のように、sudoers構成に表示する必要があるファイルは、Sudoを実行するファイルではなく、Sudoによって起動されるファイルです。

そうは言っても、私たちがよくやることは、

user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh

Sudo構成で、script.shには、スクリプトが実行する必要のあるすべてのコマンドが含まれています。

次に、Bash関数またはエイリアスを定義して、script.shは実際には

Sudo /path/to/script.sh

唯一の問題は、一部のコマンドをルートとして実行してはならない場合、su - user -c "command"スクリプト内のコマンド。

5
damienfrancois

Sudo環境変数を確認することをお勧めします。具体的には、$ Sudo_USERを使用(および確認)できます。スクリプトをSudo(sudoersの1エントリ)で呼び出してから、ユーザーの作業をSudo_USERとして、ルートの作業をrootとして行います。

2
bryn

新しい/etc/sudoers.d/apt-getファイルに、次の1行を追加します。

user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update

ここには、実行可能ファイルへの完全修飾パスが必要です。

次に、スクリプトで次を使用します。

Sudo apt-get update

ここでは、完全に指定された名前は必要ありません。 Sudoは、実行可能ファイルの解決にPATH環境変数を使用します。

Sudoers構成を変更および確認するときは、エラー回復のために別のルートセッションを開いたままにしてください。

1
Basilevs

単純に、コマンドをrootとして実行するにはsuを使用する必要があります(Sudoでもsuを使用します)代わりにSudo ./script2.shを正常に実行する限り:Sudo su "#" //ここでrootとしてコマンド "#" exit /ここで使用する/ commandsは、Sudoという名前のシェル関数にすることができますが、他のより良い方法はありませんが、スクリプトinti、rc Android ..etcは整頓されている必要があります;)

ただし、これにはNOPASSWDを指定する必要があります。実際、完全に安全です。

ここでの方法は、フィルタリングであるPOISXアクセス許可の原則に欠けているため、すべてのユーザーに何かを有効にしないでください。逆も同様です。

chown root script.sh
chmod 0755 script.sh
chgrp Sudo script.sh

「.shのルート所有者を作成する」「他の人のために読み取り専用で実行する」「それをSudoグループに入れる」もちろんSudoの下にある

1
Youssef