web-dev-qa-db-ja.com

パスワードプロンプトなしで特定のプログラムをrootとして実行する方法は?

パスワードなしでSudoとして何かを実行する必要があるため、visudoを使用して、これをsudoersファイルに追加しました。

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

それから私はそれを試しました:

$ Sudo /path/to/my/program
[Sudo] password for MYUSERNAME: 

なぜパスワードを要求するのですか?パスワードを要求せずに、root以外のユーザーでrootとしてコマンドを実行/使用するにはどうすればよいですか?

175
LanceBaynes

sudoers ファイルに別のエントリがあり、通常は/etc/sudoersにありますが、これもユーザーと一致します。 NOPASSWDルールが優先されるためには、そのルールの後にある必要があります。

これを実行すると、Sudo/path/to/my/programを除くすべてのコマンドで通常パスワードの入力を求めます。これにより、パスワードを要求せずに常に実行できます。

97
Warren Young

/etc/sudoersに一致するエントリが複数ある場合、Sudoは最後のエントリを使用します。したがって、パスワードプロンプトで任意のコマンドを実行でき、パスワードプロンプトなしで特定のコマンドを実行できるようにしたい場合は、最後に例外が必要です。

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

(root)の使用に注意してください。これにより、プログラムをrootとして実行し、他のユーザーとしては実行できなくなります。 (意味を考えない限り、必要最低限​​の許可以上の許可を与えないでください。)

Ubuntuを実行していないか、デフォルトのSudo設定を変更した読者への注意(UbuntuのSudoはデフォルトで問題ありません):昇格した特権でシェルスクリプトを実行する危険であり、クリーンな環境から開始する必要があります(シェルが開始した後は手遅れです( シェルスクリプトでsetuidを許可する を参照)。そのため、Sudoを使用する必要があります)。 Defaults env_reset/etc/sudoersがあること、またはこのオプションがコンパイル時のデフォルトであることを確認してください(Sudo sudo -V | grep envにはReset the environment to a default set of variablesを含める必要があります)。

[〜#〜]警告[〜#〜]:この回答は安全ではないと見なされています。以下のコメントを参照

完全なソリューション:次の手順は、目的の出力を達成するのに役立ちます。

  1. 新しいスクリプトファイルを作成します(create_dir.shを目的のスクリプト名に置き換えます)。

    vim ~/create_dir.sh
    

    スクリプトはユーザーのホームディレクトリに作成されます

  2. rootまたはSudoユーザーのみがルートディレクトリレベルでフォルダーを作成するように実行できるいくつかのコマンドを追加します。

    mkdir /abc
    

    注:これらのコマンドにSudoを追加しないでください。保存して終了(:wq!を使用)

  3. 以下を使用して実行権限を割り当てます。

    Sudo chmod u+x create_dir.sh
    
  4. このスクリプトがパスワードを必要としないように変更を加えます。

    1. sudoersファイルを開きます。

      Sudo visudo -f /etc/sudoers
      
    2. 最後に次の行を追加します。

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      ahmadをユーザー名に置き換えます。また、これが最後の行であることを確認してください。保存して終了。

  5. ここで、コマンドを実行するときに、次のようにSudoを追加します。

    Sudo ./create_dir.sh
    

    これにより、パスワードを要求せずにスクリプトファイル内のコマンドが実行されます。

ここに記載されている簡単な手順に従ってください http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

24
M. Ahmad Zafar

構文が間違っていると思います。少なくとも私は私のために働く以下を使います:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
12
musiKk

Sudoを使用したり、sudoers構成ファイルを変更したりする必要がない場合は、次のコマンドを使用できます。

Sudo chown root:root path/to/command/COMMAND_NAME
Sudo chmod 4775 path/to/command/COMMAND_NAME

これにより、Sudoを使用せずにコマンドがrootとして実行されます。

6
linuxgnuru

Manjaroのようなディストリビューションがある場合は、最初に/ etc/sudoersの定義をオーバーライドするファイルを処理する必要があります。ファイルを削除するか、そのファイルを直接操作して、新しい構成を追加します。

このファイルは:

Sudo cat /etc/sudoers.d/10-installer

それを確認する唯一の方法は、ルート権限の下にあります。このディレクトリがないと、このディレクトリを一覧表示できません。このファイルはManjaro固有であり、他の名前でこの設定を見つけることができますが、同じディレクトリにあります。

選択したファイルに次の行を追加して、目的の構成を取得できます。

グループの認証を無視する

%group ALL=(ALL) NOPASSWD: ALL

またはユーザーの認証を無視する

youruser ALL=(ALL) NOPASSWD: ALL

または特定のユーザーの実行可能ファイルの認証を無視する

youruser ALL=(ALL) NOPASSWD: /path/to/executable

クイックノート:認証なしでSudoを使用するためのドアを開いています。つまり、システムからすべてを変更してすべてを実行でき、責任を持ってそれを使用できます。

5
Lyoneel

Sudoにエイリアスが設定されていないことを確認します。このように走る

/usr/bin/Sudo /path/to/my/program

たとえば、次のようなシェルエイリアス:

alias Sudo="Sudo env PATH=$PATH"

この動作を引き起こす可能性があります。

4
Sepero

これは私のために問題を解決しました(役立つかもしれない他の答えのいくつかも試しました):

呼び出していたスクリプトは/usr/binにありました。このディレクトリには、書き込み権限がありません(通常、そこにあるすべてのファイルを読み取ることができます)。スクリプトはchmodded + x(実行可能権限)でしたが、それでも機能しませんでした。このファイルを/usr/binではなく、ホームディレクトリ内のパスに移動すると、パスワードを入力せずにSudoで呼び出すことができるようになりました。

また、私が疑問に思ったこと(将来の読者のために明確にします):スクリプトをSudoとして実行する必要があります。 callingスクリプトの場合は、Sudoと入力します。実際にrootを必要とするスクリプト内のコマンドにはSudoを使用しないでください(私の場合、キーボードのバックライトを変更します)。たぶんそれでもうまくいくかもしれませんが、そうする必要はありません。

2
Luc

スクリプトを実行するときは、Sudo /path/to/my/scriptとして実行する必要があります。

編集:別の回答へのコメントに基づいて、これをアイコンから実行します。端末と同じように、Sudoでプログラムを実行する.desktopファイルを作成する必要があります。

ビジュアルパスワードプロンプトにgtk-Sudoを使用することも検討できます。

Rootとして実行するべきではなく、システムをさらに変更してroot権限をまったく必要としないほうがよい方法だと考えてください。

2
Caleb

別の可能性は、インストールして構成し、次に super コマンドを使用してスクリプトを次のように実行することです。

super /path/to/your/script

いくつかのバイナリを実行したい場合 実行可能 (たとえば、いくつかのCソースコードから [〜#〜] elf [〜#〜] バイナリにコンパイルした場合)-これはnotスクリプト-rootとして、あなたはそれを作ることを考える setuid (実際には/bin/login/usr/bin/Sudo/bin/susuperはすべてこの手法を使用しています)。ただし、非常に注意してください巨大なセキュリティホールを開く可能性があります

具体的には、プログラムを偏執的にコード化する必要があります(したがって、潜在的に敵意のあるユーザーを想定して、「実行」する前にすべての引数と環境および外部条件を確認してください)。次に、 seteuid(2) とフレンド(以下を参照)を使用できます。また、慎重に setreuid(2) )(また参照 capabilities(7)credentials(7)execve(2) ...)

そのようなバイナリをインストールするときは、chmod u+s(read chmod(1) )を使用します。

ただし、十分注意してください

そのようなものをコーディングする前に、 Advanced Linux Programming を含むsetuidに関する多くのことを読んでください。

スクリプト、または Shebang -edのものはsetuidできないことに注意してください。しかし、それをラップする小さなsetuid-binaryを(Cで)コーディングできます。

Sudoを介して実行できるコマンドをカスタマイズする場合は、sudoersファイルを直接編集するのではなく、_/etc/sudoers.d/_の下の別のファイルでこれらの変更を行うのが理想的です。また、ファイルを編集するには常にvisudoを使用する必要があります。 NOPASSWDコマンドに対してALLを付与しないでください。

例:_Sudo visudo -f /etc/sudoers.d/mynotriskycommand_

アクセス許可を付与する行を挿入します:_myuser ALL= NOPASSWD: /path/to/your/program_

次に保存して終了すると、構文エラーがある場合はvisudoによって警告が表示されます。

_Sudo -l_を実行すると、ユーザー固有のNOPASSWDコマンドが出力の%groupyouarein ALL=(ALL) ALLコマンドの前に表示された場合に、ユーザーに付与されている権限を確認できますパスワード。

これらのsudoers.dファイルをたくさん作成している場合は、ユーザーごとに名前を付けて作成し、視覚化しやすくすることをお勧めします。ファイル名とファイル内のルールの順序は非常に重要であり、最後にロードされたものが優先されます。

プレフィックス00-99またはaa/bb/ccを使用してファイル名の順序を制御できますが、数値のプレフィックスを持たないファイルがある場合は、番号付きファイルの後にロードされ、上書きされることにも注意してください。設定。これは、言語設定によっては、シェルが使用する「字句ソート」が最初に数値をソートし、次に「昇順」でソートするときに大文字と小文字を交互に配置する場合があるためです。

_printf '%s\n' {{0..99},{A-Z},{a-z}} | sort_と_printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort_を実行して、現在の言語がAaBbCc etcまたはABCを出力するかどうかを確認し、次にabcを使用して最適な「最後の」文字を判別します。使用する接頭辞は次のようになります。

0
dragon788

または、python pudo パッケージを使用できます。

インストール:

user$ Sudo -H pip3 install pudo # you can install using pip2 also

以下は、ルート権限でコマンドを実行するためのpython自動化で使用するためのコードスニペットです。

user$ python3 # or python2
>>> import pudo
>>> (ret, out) = pudo.run(('ls', '/root')) # or pudo.run('ls /root')
>>> print(ret)
>>> 0
>>> print(out)
>>> b'Desktop\nDownloads\nPictures\nMusic\n'

以下は、root権限でコマンドを実行するためのcmdの例です。

user$ pudo ls /root
Desktop  Downloads  Pictures  Music
0

ユーザーにパスワードを尋ねずにSudoとしてプログラムを実行できるようにするには、次の行を追加します

%Sudo ALL=(root) NOPASSWD: /path/to/your/program

/etc/sudoers

%Sudoにすることに注意してください。

0
ultimatex

以下は、特定のオプションセットがある場合にのみパスワードなしでコマンドを実行する場合(オプションの一部が変数である場合)です。私の知る限り、sudoers宣言で変数または値の範囲を使用することはできません。つまり、以下を使用して_command option1_へのアクセスを明示的に許可できますが、_command option2_へのアクセスは許可できません。

user_name ALL=(root) /usr/bin/command option1

ただし、構造が_command option1 value1_である場合、_value1_は変化する可能性があるため、_value1_の可能な値ごとに明示的なsudoers行が必要です。シェルスクリプトはそれを回避する方法を提供します。

この回答はM. Ahmad Zafarの回答に触発され、セキュリティの問題が修正されています。

  1. Sudoなしでコマンドを呼び出すシェルスクリプトを作成します。
  2. スクリプトをルート特権フォルダー(例:_/usr/local/bin/_)に保存し、ファイルをルート所有(例:_chown root:wheel /usr/local/bin/script_name_)に他のユーザーへの書き込みアクセス権なし(例:_chmod 755 /usr/local/bin/script_name_)にします。
  3. Visudoを使用してsudoersに例外を追加します。

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name

  4. スクリプトを実行します_Sudo script_name_。

たとえば、macOSでディスプレイのスリープタイムアウトを変更したいとします。これは以下を使用して行われます:

_Sudo pmset displaysleep time_in_minutes_

スリープタイムアウトを変更することは、パスワード入力の煩わしさを正当化しない無害なアクションであると考えていますが、pmsetは多くのことを実行できるため、他のことはSudoパスワードの背後に置いておきたいと思います。

だから私は_/usr/local/bin/ds_に次のスクリプトを持っています:

_#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "Sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi
_

sudoersファイルの最後に、次の行があります。

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

タイムアウトを3分に設定するには、通常のユーザーアカウント_user_name_からスクリプトを実行します。

_Sudo ds 3_

PS私のスクリプトのほとんどは入力検証であり、これは必須ではないため、以下も機能します。

_#!/bin/bash
pmset displaysleep $1 
_
0
Koit Saarevet