システムを毎日自動的にオンにしたい。そこで、Pythonスクリプトで以下のコードを使用しますが、Sudo
は毎回パスワードを要求します。
os.system('Sudo sh -c "echo date \'+%s\' -d \'+ \
24 hours\' > /sys/class/rtc/rtc0/wakealarm"')
毎回パスワードを要求することなくSudo
なしでこのスクリプトを実行するにはどうすればよいですか?
注意:ログインパスワードをプレーンテキスト、コマンド、またはファイルに入れる方法は安全ではないため、使用しないでください!
正しい方法Sudo
をセットアップするためにのみ必要な特定のコマンド、つまりecho date... > rtc...
を必要とせずに実行できるパスワード。
gedit
(またはお気に入りのエディター)を開き、スクリプトを作成します。 pydatertc.sh
エコー日付\ '+%s \' -d\'+ 24時間\'>/sys/class/rtc/rtc0/wakealarm
Sudo chown root:root /home/username/pydatertc.sh
Sudo chmod 700 /home/username/pydatertc.sh
pydatertc.sh
がパスワードなしで実行できるようにしますSudo visudo
と入力して、Sudo許可(sudoers
)ファイルを開きます。%Sudo ALL=(ALL:ALL) ALL
username
はユーザー名です:ユーザー名ALL =(ALL)NOPASSWD:/home/username/pydatertc.sh
pydatertc.sh
を呼び出すos.system( 'Sudo /home/username/pydatertc.sh')
これで、パスワードを要求せずにスクリプトを実行できますおよびアカウント、データ、またはシステムのセキュリティを損なうことなく!
wakealarm
のみの代替(一般的な使用ではありません!):この特定の場合のみ、/sys/class/rtc/rtc0/wakealarm
ファイルはシステムのウェイクアップアラームのみを制御し、それ以外は無害であるため、パスワードを避けるには、chown
を使用してそのファイルの所有権を取得するか(アラームを設定する唯一のユーザーである場合)、chmod +666
を使用して誰でも書き込み可能にします。その場合、Python呼び出しからSudo
を削除し、sh -c "...."
をそのまま残します。
警告!
ログインパスワードをプレーンテキストでコマンドまたはファイルに入力することはextremely安全ではなく、個人データとシステムを危険にさらす可能性があります。 強くお勧めしますシステムが「個人用」または「安全な場所」にあると思われる場合でも、これを絶対に行わないでください。
スクリプトが個人使用のみを目的としており、安全な場所に置いており、アカウントの盗難などを恐れていない場合は、次の簡単な解決策があります。
echo LOGINPASSWD | Sudo -S COMMAND HERE
ここで、LOGINPASSWDはログインパスワード(例:iloveponies)であり、COMMAND HEREはsh -c "echo da ..などのように、Sudoの後に来るコマンドです。
特定の時間(または日中)に実行するスクリプトを気にしない場合は、スクリプトをルートのホームディレクトリ(/root
)内に配置し、システムcrontabからスクリプトを実行します(/etc/crontab
)ルートとして。その後、セキュリティを侵害する必要はありません。
スクリプトをcrontabに追加する方法については、 https://help.ubuntu.com/community/CronHowto を参照してください。
上記の優れた回答で言及されていない、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からコマンドを実行する特定のケースでは役に立ちません。しかし、注意することは良いことです。
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