web-dev-qa-db-ja.com

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

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

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

毎回パスワードを要求することなくSudoなしでこのスクリプトを実行するにはどうすればよいですか?

105
Viswa

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

正しい方法Sudoをセットアップするためにのみ必要な特定のコマンド、つまりecho date... > rtc...を必要とせずに実行できるパスワード。

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

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

ステップ2. Sudoをセットアップして、pydatertc.shがパスワードなしで実行できるようにします

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

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

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

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


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

この特定の場合のみ/sys/class/rtc/rtc0/wakealarmファイルはシステムのウェイクアップアラームのみを制御し、それ以外は無害であるため、パスワードを避けるには、chownを使用してそのファイルの所有権を取得するか(アラームを設定する唯一のユーザーである場合)、chmod +666を使用して誰でも書き込み可能にします。その場合、Python呼び出しからSudoを削除し、sh -c "...."をそのまま残します。

147
ish

警告!

ログインパスワードをプレーンテキストでコマンドまたはファイルに入力することはextremely安全ではなく、個人データとシステムを危険にさらす可能性があります。 強くお勧めしますシステムが「個人用」または「安全な場所」にあると思われる場合でも、これを絶対に行わないでください。

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

echo LOGINPASSWD | Sudo -S COMMAND HERE

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

29
hytromo

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

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

21
z7sg

上記の優れた回答で言及されていない、Sudoのもう1つの関連するニース機能は、 '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からコマンドを実行する特定のケースでは役に立ちません。しかし、注意することは良いことです。

11
arielf
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 switch catch and catch the pass to Sudo

1
jturi