パスワードプロンプトなしでrootとして特定のプログラムを実行するにはどうすればよいですか?

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

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

次に試してみました:

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

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

回答

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

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

コメント

  • /path/to/my/programがPythonスクリプトの場合、これは引き続き機能しますか?
  • プログラムは可能ですか?代わりに、bashに設定されたエイリアス(つまり、.bashrc)になりますか?または、/usr/local/sbin内のシェルスクリプトでさえありますか?試してみる。
  • Nikos-いいえ、エイリアスにすることはできません。実際のパスを指している必要があります。
  • sudoers?どこですか?答えを使うのは大変です(
  • @VasiliiSuricov:’は通常/etcにありますが、一部のシステムでは’が見つからない場合は、man sudoersを試してください。そのファイルのローカルの場所をivid =に置き換える必要があります。 sudoがそのシステム用に構築されたときの “cf19fd5844”>

ページ。

回答

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

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

、プログラムをrootとして実行できるようにしますが、他のユーザーとしては実行できません(影響を考慮しない限り、必要最小限の権限を超えないようにしてください)。

再注意Ubuntuを実行していない、またはデフォルトのsudo構成を変更したユーザー(Ubuntuのsudoはデフォルトで問題ありません):昇格された権限でシェルスクリプトを実行するのは危険です。クリーンな環境から開始する必要があります(シェルが開始されましたが、遅すぎます(シェルスクリプトでsetuidを許可するを参照)。そのため、sudoが必要です)。 /etc/sudoersDefaults env_resetがあること、またはこのオプションがコンパイル時のデフォルト(sudo sudo -V | grep envにはReset the environment to a default set of variables)を含める必要があります。

コメント

  • exは、sudoを使用してjhonからrootになります。 su a no pass —– > john ALL =(ALL)NOPASSWD:/ bin / su
  • @adrian任意のコマンドを許可する場合ルート、john ALL=(ALL) NOPASSWD: allにします。 ‘ suを経由しても意味がありません。
  • 質問:シェルスクリプトの権限を変更する必要がありますセキュリティのために、rootユーザーのみが変更して読み取ることができるようにするには? ‘攻撃者が、パスワードを必要とせずにすべての権限が付与されているスクリプトを変更して、攻撃者が望むことを実行できるようにすることを考えています。明らかに、攻撃者は’ sudoersファイルを読み取って、どのスクリプトがこの権限を持っているかを知ることさえできませんが、カスタムスクリプトが含まれているフォルダを見つけたら、すべてのカスタムスクリプトを試すことができます。いくつかが許可されることを期待して保存されているか、そのようなものです。
  • @JeffreyLebowskiスクリプトを(直接的または間接的に)実行するsudoルールがある場合は、’ルート(またはとにかくroot権限を持つ人)だけがスクリプトファイル、スクリプトファイルを含むディレクトリ、およびその親ディレクトリなどに書き込むことができることが重要です。 ‘誰でもスクリプトファイルを読むことができるかどうかは問題ではありません(パスワードなどが含まれている場合を除きますが、’悪い考えです。 ‘パスワードがある場合は、独自のファイルに含める必要があります。そうでない場合は、’誤ってパスワードが漏洩するリスクが高くなります。このサイトの質問にコードのそのセクションを貼り付けます。
  • @alperいいえ。再起動が必要なものはほとんどありません。 sudoersを変更した後は、’特別なことをする必要はありません。sudoがチェックします毎回。

回答

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

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

  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. ファイル:

      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/

コメント

  • ここに関連する手順を提供し、より詳細な情報のバックアップとしてリンクを使用した方がよいでしょう。そうすれば、そのリンクが有効でなくなったとしても、あなたの答えは可能な価値を保持します。
  • このアドバイスは安全ではありません。 sudo chmod u+x create_dir.shsudoの部分は、ユーザーが(おそらく)自分のホームディレクトリの所有権を持っているため、不要です。ユーザーはcreate_dir.shに書き込むことができるため、そのユーザーに無料のルートシェルを効果的に提供できます。
  • @Lekensteynこれは、ユーザーとして実行されているすべてのプログラムにも意味します。 。ユーザーがパスワードなしでsudoを使用して何かを実行できるようにするだけでもかまいません。
  • 何かが足りないのでしょうか?特権を上げるためにsudoに依存しているため、chmod全体は不要だと思います。

回答

構文が間違っていると思います。少なくとも私は自分に合った次のものを使用します:

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

コメント

  • (ALL)の部分はオプションであり、省略してもまったく同じ効果があります。 (root)がある方が良いのですが、’では問題を説明できません。
  • +1 for sudoこのコマンドのためだけに!システム全体を壊す理由はありません…
  • @Johan:それはすでに問題になっています。

回答

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

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

これsudoを必要とせずにコマンドをrootとして実行します。

コメント

  • うわー、これまでこの解決策について聞いたことがありません。 li>
  • @RyanNerd:これは安全なソリューションではありません。 OPは、パスワードなしでrootとしてコマンドを実行できるだけでなく、誰でもrootユーザーとしてコマンドを実行できるようになりました。
  • ” chmod 4775 filename “は1つの方法です。次に、ファイル全体のアクセス許可を再定義せずに SETUID を実行するためのより良い方法は、” chmod u + s filename ”
  • sudo chmod005は安全です。 ‘現在のユーザーに書き込み権限を付与したくない。そうしないと、セッション内の誰もがスクリプトを使って何でもできる可能性があります。

回答

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を使用するための扉を開いています。つまり、実行できます。システムのすべてを変更するすべてのものを、責任を持って使用します。

回答

sudoがエイリアスされていないことを確認します。次のように実行します

/usr/bin/sudo /path/to/my/program 

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

alias sudo="sudo env PATH=$PATH" 

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

コメント

  • その通り、私のコメントはここで順序が狂っていました。申し訳ありませんが、 。それにもかかわらず、私は’興味をそそられました-エイリアシングがsudoによるsudoersの処理をどのように変えると思いますか。または、sudoを、このエラーメッセージを常に出力してパスワードをスクープするものにリダイレクトすることについて話しているのですか?ここではそうは思われません…
  • 私はOPと同じ問題を抱えていました。 ~/.bashrcalias sudo="sudo env PATH=$PATH"が含まれていることが原因であることが判明しました。自分で解決してやみくもに自分のビジネスに取り掛かるのではなく、このスレッドに参加する他の人のための可能な解決策として自分の答えを提出しました。
  • その’は問題ありませんが、はっきりしない場合(この場合、少なくとも一部の人にとっては’ではありません)、回答に説明を入れてコンテキストを提供することをお勧めします。人々が盲目的に魔法の呪文を使うのを防ぎます。 +2(-(-1)+ +1)。 🙂

回答

スクリプトを実行するときは、。

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

視覚的なパスワードプロンプト。

おそらく、rootとして実行するべきではなく、システムをさらに先に変更して実行しないようにするという考えを検討する必要があります。ルート権限が必要な方が良い方法です。

コメント

  • シェルスクリプトをsetuidにしないでくださいシェルスクリプトでsetuidを許可するを参照してください。
  • ‘であるため、言及しないことも検討しました。 sそのような悪いオプション。 ‘この質問者が悪いアドバイスだという警告があってもアドバイスを使用するのではないかと心配しているので、削除しました!

回答

これで問題は解決しました(他の回答もいくつか試しましたが、役に立ったかもしれません):

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

疑わしい(将来の読者のために明確にする):スクリプトをsudoとして実行する必要があります。スクリプトを呼び出すときにsudoと入力します。実際にrootを必要とするスクリプト内のコマンドにsudoを使用しないでください(私の場合はキーボードのバックライトを変更します)。おそらくそれも機能しますが、使用する必要はありません。

コメント

  • 2番目の段落に私の問題に対する答えがありました
  • @MuhammadAhmadZafar Glad
  • 適切な権限(sudoers

を使用してもまったく問題ありません。)パスワードなしで問題のコマンドを実行します。それは物事をもう少し安全にします。

  • ステップバイステップとして書き直されたこの答えを実際に使用することができます’これがあなたのやり方です’他の回答との対話としてではなく
  • @WalrustheCat良い点。答えを読み直すと、少し戸惑っていたのではないかと思います。ただし、現時点では、’正確な状況を覚えていないため、’より適切な記述を行うことはできません。あなたがそれを理解した場合、おそらくいくつかの答えの組み合わせで、必ず新しい答えを提出してください!
  • 回答

    別の可能性として、 super コマンドでスクリプトを次のように実行します

    super /path/to/your/script 

    バイナリを実行する場合実行可能(たとえば、Cソースコードから ELF バイナリにコンパイルした場合)-これはスクリプトではありません-rootとして、スクリプトを setuid (実際には/bin/login/usr/bin/sudoおよび/bin/suおよびsuperはすべてその手法を使用しています)。ただし、非常に注意してください。巨大なセキュリティホールを開く可能性があります

    具体的には、プログラムはパラノイカルにコーディングされている(したがって、”行動する前にすべての引数と環境および外部条件を確認します。 seteuid(2)とその友人( setreuid(2)も参照)を慎重に使用できます( 機能(7) & 資格情報(7)も参照してください。 & execve(2) …)

    あなたはこのようなバイナリをインストールするときは、chmod u+s chmod(1)を読んでください)を使用してください。

    ただし、 非常に注意してください

    setuid について、を含む多くのことを読んでください。 div id = “4bc7fc507a”>

    高度なLinu xプログラミング、そのようなものをコーディングする前に。

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

    Linuxでは、アプリケーションコードが Linuxカーネルと相互作用することに注意してください

    a> syscalls(2)を使用します。それらのほとんどは失敗する可能性があります。 errno(3)を参照してください。多くのLinuxアプリケーション(例: GNU bash GNU make GNU gdb GNOME )はオープンソースです。ダウンロードしてから学習し、ソースコードに貢献することができます。

    コメント

    • 高度なLinuxプログラミングはデッドリンクです。

    回答

    理想的には、sudoを介して実行できるコマンドをカスタマイズする場合は、iv id =の下の別のファイルでこれらの変更を行う必要があります。 sudoersファイルを直接編集する代わりに、 “70b7afbe19”>

    。また、ファイルを編集するには、常にvisudoを使用する必要があります。ALLコマンドでNOPASSWDを付与しないでください。

    例: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}} | sortprintf "%s\n" {{0..99},{A-Z},{a-z}} | LANG=C sortを実行して、現在の言語が

    などまたはABC、次にabcを使用して、使用するのに最適な「最後の」文字プレフィックスを決定しますbe。

    回答

    すべてのユーザーがパスワードを要求せずにsudoとしてプログラムを実行できるようにするには、次の行を追加できます

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

    in /etc/sudoers

    %sudo が作成されることに注意してください。

    コメント

    • ‘はsudoルールを実現する1つの方法ですが、’このルールにNOPASSWDフラグを設定しても、パスワードプロンプトが表示される理由についての質問には答えません。なぜそれが起こったのかについては、受け入れられた回答を参照してください。

    回答

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

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

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

    この回答は、M。AhmadZafarの回答に触発され、そこでのセキュリティの問題を修正します。

    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  

    回答

    または、Pythonを使用することもできます pudo パッケージ。

    インストール:

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

    以下は、root権限でコマンドを実行するために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 

    回答

    / etc /内にあるスクリプトsudoersで、以下の行のコメントを解除します。

    #includedir /etc/sudoers.d

    /etc/sudoers.d/ディレクトリ内に任意の名前のファイルを1つ作成し、最大回答数に示されている内容を追加します。 rootとしてのすべてのユーザーのように

    #!/bin/bash ALL ALL = NOPASSWD: /path/of/the/script/which/you/want/to/run/as/root 

    これは、root権限でスクリプトを実行する最も安全な方法です。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です