パスワードを要求されずにスクリプトでコマンドをsudoするにはどうすればよいですか?


107

システムを毎日自動的にオンにしたい。そこで、Pythonスクリプトで以下のコードを使用しますが、sudo毎回パスワードを要求します。

os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
       24 hours\' > /sys/class/rtc/rtc0/wakealarm"')

sudo毎回パスワードを要求せずにこのスクリプトを実行するにはどうすればよいですか?


4
マザーボードのマニュアルまたはBIOSを調べて、この動作をサポートしているかどうかを確認してください。私はそれが質問をかわすことを知っています!=]しかし、それは十分な解決策かもしれません。
アレックスヒルゼル

回答:


149

注:ログインパスワードをプレーンテキスト、コマンド、またはファイルに入力する方法は安全ではないため、使用しないでください。

必要な特定のコマンドのみがパスワードなしで実行できるsudoようにセットアップする正しい方法echo date... > rtc...

手順1.そのコマンドだけでシェルスクリプトを作成する

  • 開きgedit例えば(またはお好みのエディタ)、およびスクリプトを作成しますpydatertc.sh
  • この行のみを挿入し、たとえばホームディレクトリに保存します。
    エコー日付\ '+%s \' -d \ '+ 24時間\'> / sys / class / rtc / rtc0 / wakealarm
  • エディターを終了し、ターミナルからスクリプトを実行可能に、所有権をrootに変更します。そうしないと、システムにアクセスできる別のユーザーが編集し、パスワードを必要とせずにrootとして必要なコマンドを実行できます。
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    

ステップ2. pydatertc.shパスワードを必要とせずに実行できるようにsudoをセットアップする

  • sudo visudoターミナルで入力してsudo許可(sudoers)ファイルを開きます
  • 25行目あたりに、次の行が表示されます。 %sudo ALL=(ALL:ALL) ALL
  • その行の下にusername、ユーザー名を次のに挿入します。
    ユーザー名ALL =(ALL)NOPASSWD:/home/username/pydatertc.sh
  • エディターを終了します(Ctrl+ Xif nano

ステップ3. Pythonスクリプトを変更して呼び出す pydatertc.sh

  • 行を次のように変更します。
    os.system( 'sudo /home/username/pydatertc.sh')

これで、パスワードを必要せず、アカウント、データ、またはシステムのセキュリティを損なうことなく、スクリプトを実行できます。


代替のみwakealarm(一般的な使用ではありません!):

のみ、この特定のケース以来、/sys/class/rtc/rtc0/wakealarmファイルが唯一のシステムのための目覚ましアラームを制御し、それ以外の場合は無害で、パスワードを回避するための別の代替ではと、そのファイルの所有権を取得するのいずれかであるchown(あなたがアラームを設定する唯一のユーザーであれば) 、またはchmod +666; その場合は、sudoPython呼び出しからを削除し、sh -c "...."そのまま残します。


1
素晴らしい、これが正しい方法です。
-roadmr

1
このような非常に詳細で有用な回答と、それをどのように行うべきか。
ArtOfCode

@RobertRosati、提案された編集に感謝します-そもそも忘れてはいけません!
ISH

1
@ m-ricこれらの行の上のコマンドを読みましたか?「それ以外の場合、システムにアクセスできる別のユーザーがシステムを編集し、パスワードを必要とせずにルートとして必要なコマンドを実行できる可能性があります」
トバイアスキエンツラー

2
私はこの答えが古いことを理解しています-しかし、まだ問題があります:ファイルが/ home / usernameにある場合、そのディレクトリが悪意のあるユーザー(または妥協)。ファイルを削除または名前変更し、別のスクリプトをその場所に配置し、パスワードなしスクリプトを実行sudoできます。したがって、スクリプトをrootのみが変更できるディレクトリ(たとえば、/ usr / sbinまたは/ root)に置く方がはるかに安全です。それ以外の場合、LGTM。
NVRAM

30

警告!

ログインパスワードをプレーンテキスト、コマンドまたはファイルに入れることは非常に安全ではなく、個人データとシステムを危険にさらす可能性があります。されて非常にお勧め、あなたのシステムが「個人」または「安全な場所」であると考えても、これを行う決して!

スクリプトが個人使用のみを目的としており、安全な場所に置いており、アカウントが盗まれることなどを恐れていない場合は、次の簡単な解決策があります。

echo LOGINPASSWD | sudo -S COMMAND HERE

LOGINPASSWDはログインパスワード(例:iloveponies)であり、COMMAND HEREはsudoの後に来るコマンドです(sh -c "echo da ..などなど)


13
@Viswa、パスワードをプレーンテキストで公開するのは非常に危険です。それをしないことを強くお勧めします
アンワー

3
-1これが良いアイデアのように思える場合は、rootアカウントにパスワードを設定してz7sgのソリューションを使用するだけの方が良いでしょう。それは同じくらい簡単で、この非常に危険なセキュリティ問題を引き起こすことはありません。
ブライス

4
ハァッ!私の答えには6つのアップ投票と4つのダウン投票がありました:)しかし、なぜ、私は「個人使用」、「安全な場所」などをクリアしなかったのですか?このファイルを提供し、sshサーバーを実行していない限り、セキュリティ上の問題はありません!スクリプトが個人用で安全な場所にある場合、セキュリティの問題はどこにありますか?
hytromo

5
Downvoted、これは暗黒面への道であり、sudoメソッドでは必要ありません。
フロイド

4
わかりました、ハッカーがあなたのアカウントに単純なユーザーとしてログインしている場合でも、/ usr / share / help / lv / ubuntu-helpの下にパスワードがあるスクリプトをどのように見つけるのでしょうか?
-hytromo

21

スクリプトを1時間(または1日)の特定の時間に実行してもかまわない場合は、ルートのホームディレクトリ(/root)内に配置し、システムcrontab(/etc/crontab)からrootとしてスクリプトを実行します。その後、セキュリティを侵害する必要はありません。

スクリプトをcrontabに追加する方法については、https://help.ubuntu.com/community/CronHowtoを参照してください


4
anacron24時間365日実行されないデスクトップ/ラップトップの場合は、おそらく使用する必要があります
-balki

これは、たとえば、更新プログラムを確認し、その情報を使用して何かを実行し、必要な更新プログラムについて管理者に電子メールを送信するスクリプトを作成している場合に便利な回答です。個人的に、私のスクリプトの多くはサーバーの自動化に使用されているため、sudo crontab -eを使用するだけで私はそうする傾向があります。+1
Rab 14年

11

上記の優れた回答で言及されていないsudoの別の関連する素晴らしい機能は、「timestamp_timeout」変数です。これはsudo変数であり、対話型パスワード入力を節約するために増やすことができます。

たとえば、/ etc / sudoers(またはそこに含まれるファイルの1つ)でデフォルトを変更できます。

# only require a password once every 60 minutes
Defaults timestamp_timeout=60

「man sudoers」の完全な説明:

timestamp_timeout

        Number of minutes that can elapse before sudo will ask for
        a passwd again.  The default is 5, set this to 0 to always
        prompt for a password.

もちろん、これはcronからコマンドを実行する特定のケースでは役に立ちません。しかし、注意することは良いことです。


0
export MY_SUDO_PASS="user_password_here"

正常に機能するかどうかをテストするには:

echo $MY_SUDO_PASS
> user_password_here

「sudo apt-get update」を実行し、前に作成した環境変数からパスワードを受け入れます。

echo $MY_SUDO_PASS | sudo -S apt-get update

Pythonから実行します(ディレクトリの所有権をusername_hereに再帰的に変更する例):

python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)

echo $ MY_SUDO_PASS get's password -Sスイッチはそれをキャッチし、sudoにパスワードを渡します


私は、これは、既存の回答アラームに関する最新のBIOSサポートウェイクに追加されますかわからないんだけど...
エルダーオタク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.