回答:
sudoers
ユーザーに一致する別のエントリがファイルにあります。NOPASSWD
ルールが優先されるためには、そのルールの後にある必要があります。
これを行うと、sudo
を除くすべてのコマンドに対して通常/path/to/my/program
パスワードの入力が求められます。これにより、パスワードを要求せずに常に実行できます。
.bashrc
か(つまり)。または、内部にシェルスクリプトもあり/usr/local/sbin
ますか?試してみる。
/etc
にありますが、一部のシステムでは別の場所に配置されています。見つからない場合は、を試してくださいman sudoers
。そのシステム用に構築さman
れた時点で、そのファイルのローカルの場所をページに置き換える必要がありますsudo
。
に一致するエントリが複数ある場合/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
)。
john ALL=(ALL) NOPASSWD: all
ます。を経由しても意味がありませんsu
。
sudoers
、特別なことをする必要はありませんsudo
。毎回チェックします。
完全なソリューション:次の手順は、目的の出力を達成するのに役立ちます。
新しいスクリプトファイルを作成します(create_dir.sh
目的のスクリプト名に置き換えます)。
vim ~/create_dir.sh
スクリプトはユーザーのホームディレクトリに作成されます
ルートディレクトリレベルでフォルダーを作成するなどroot
、sudo
ユーザーのみが実行できるコマンドをいくつか追加します。
mkdir /abc
注:sudo
これらのコマンドには追加しないでください。保存して終了(を使用:wq!
)
以下を使用して実行許可を割り当てます。
sudo chmod u+x create_dir.sh
このスクリプトがパスワードを必要としないように変更を加えます。
sudoers
ファイルを開きます。
sudo visudo -f /etc/sudoers
最後に次の行を追加します。
ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
ahmad
ユーザー名は何でも置き換えます。また、これが最後の行であることを確認してください。保存して終了。
コマンドを実行するとき、次のsudo
ように追加します:
sudo ./create_dir.sh
これにより、パスワードを要求せずにスクリプトファイル内のコマンドが実行されます。
ここに記載されている簡単な手順に従ってくださいhttp://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/
sudo
一部sudo chmod u+x create_dir.sh
は不要です。ユーザーはに書き込むことができるので、create_dir.sh
事実上そのユーザーに無料のルートシェルを与えました。
chmod
頼っているので、全体は不要だと思いますsudo
。
sudoを使用する必要がなく、sudoers構成ファイルを変更する必要がない場合は、次を使用できます。
sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME
これにより、sudoを使用せずにコマンドがrootとして実行されます。
Manjaroのようなディストリビューションがある場合、/ etc / sudoersの定義をオーバーライドするファイルを最初に処理する必要があります。そのファイルを削除するか、そのファイルを直接操作して新しい構成を追加します。
このファイルは次のとおりです。
sudo cat /etc/sudoers.d/10-installer
それを見る唯一の方法はルート権限の下にあり、それなしではこのディレクトリをリストすることはできません。このファイルはマンジャロ固有で、この設定は他の名前で同じディレクトリにあります。
選択したファイルに、次の行を追加して、目的の構成を取得できます。
グループの認証を無視する
%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"
この動作を引き起こす可能性があります。
sudoers
れます-sudoによる処理を変更するためにエイリアスをどのように期待しますか。または、sudo
このエラーメッセージを常に出力してパスワードをすくうようなものにリダイレクトすることについて話していますか?それは...ここケースはほとんどありません
alias sudo="sudo env PATH=$PATH"
は私の中にあることによって引き起こされることが判明しました~/.bashrc
。自分で解決するだけでなく、やみくもに自分のビジネスに取り掛かるのではなく、このスレッドに沿ってやってくる他の誰かのための可能な解決策として答えを提出しました。
スクリプトを実行するときは、として実行する必要がありますsudo /path/to/my/script
。
編集:別の回答に対するコメントに基づいて、アイコンからこれを実行します。あなたは、作成する必要があります.desktop
だけで、端末上のように、sudoをして、あなたのプログラムを実行ファイルを。
gtk-sudo
視覚的なパスワードプロンプトの使用を検討することもできます。
おそらく、ルートとして物事を実行するべきではなく、ルート権限をまったく必要としないようにシステムをさらに変更することがより良い方法であるという考えを考慮する必要があります。
これは私のために問題を解決しました(また助けたかもしれない他の答えのいくつかを試みました):
呼び出していたスクリプトはにあり/usr/bin
、書き込み許可のないディレクトリにあります(ただし、通常はそこにあるすべてのファイルを読み取ることができます)。スクリプトはchmodded + x(実行可能権限)でしたが、まだ機能しませんでした。このファイルをの代わりにホームディレクトリのパスに移動/usr/bin
すると、パスワードを入力せずにsudoで呼び出すことができました。
また、私が疑ったこと(将来の読者のために明確にする):スクリプトをsudoとして実行する必要があります。スクリプトを呼び出すsudo
ときに入力します。スクリプト内で実際にルートが必要なコマンドには使用しないでください(私の場合はキーボードのバックライトを変更します)。おそらくそれでも機能しますが、あなたはする必要はありませんし、そうしないより良い解決策のように思えます。sudo
sudo
スクリプト内で使用するsudoers
ことは、パスワードなしで問題のコマンドを実行するための適切な権限(で設定)があれば提供されます。それは物事をもう少し安全にします。
別の可能性としては、インストール、構成、スーパーコマンドを使用してスクリプトを次のように実行することです。
super /path/to/your/script
あなたには、いくつかのバイナリ実行したい場合は、実行可能(おにコンパイルされている例えばELFです-whichいくつかのCソースコードからバイナリ)ではないルートとしてscript-を、あなたは可能性がある、それがすることを検討のsetuid(および実際に/bin/login
、/usr/bin/sudo
そして/bin/su
そしてsuper
すべてその技術を使用しています)。ただし、非常に注意して、大きなセキュリティホールを開けることができます。
具体的には、あなたのプログラムがparanoicallyコード化されなければならない、あなたは使用することができます(その潜在的に敵対的な利用者を想定し、「演技」の前に、すべての引数と環境と外部の条件をチェック)のseteuidを(2)と友人(も参照ではsetreuid(2) )を注意深く(capabilities(7)&credentials(7)&execve(2)も参照してください...)
このようなバイナリをインストールするときは(chmod(1)をchmod u+s
読んで)使用します。
しかし、非常に注意してください。
そのようなことをコーディングする前に、高度なLinuxプログラミングを含むsetuidに関する多くのことを読んでください。
スクリプト、またはシバン処理されたものはsetuidできないことに注意してください。しかし、それをラップする小さなsetuid-binaryを(Cで)コーディングできます。
理想的には、どのコマンドを介しsudo
て実行できるかをカスタマイズする場合/etc/sudoers.d/
、sudoers
ファイルを直接編集するのではなく、別のファイルでこれらの変更を行う必要があります。また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
などやABC
、その後abc
使用するのに最適な「最後」の文字のプレフィックスがどうなるかを決定します。
以下は、オプションの一部がvariableである特定のオプションセットがある場合にのみ、パスワードなしでコマンドを実行する場合です。私の知る限り、sudoers宣言で変数または値の範囲を使用することはできません。つまりcommand option1
、次のものcommand option2
を使用せずに明示的にアクセスを許可できます。
user_name ALL=(root) /usr/bin/command option1
ただし、構造がである場合command option1 value1
、どこでもvalue1
異なる可能性があるため、可能な値ごとに明示的なsudoers行が必要ですvalue1
。シェルスクリプトはそれを回避する方法を提供します。
この回答は、M。Ahmad Zafarの回答に触発され、そこでのセキュリティ問題を修正しました。
sudo
。/usr/local/bin/
)に保存し、ファイルをルート所有(例chown root:wheel /usr/local/bin/script_name
)にし、他のユーザー(例chmod 755 /usr/local/bin/script_name
)の書き込みアクセス権を持たないようにします。visudoを使用して、例外をsudoersに追加します。
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
。
スクリプトを実行しますsudo script_name
。
たとえば、macOSのディスプレイスリープタイムアウトを変更したい。これは次を使用して行われます。
sudo pmset displaysleep time_in_minutes
スリープタイムアウトを変更することは、パスワード入力の手間を正当化するものではありませんpmset
が、多くのことを行うことができる無害なアクションであると考えています。
だから私は次のスクリプトを持っています/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
/path/to/my/program
pythonスクリプトだった場合、これはまだ機能しますか?