Debian 11 テストをしています。これは、コンピュータの経験が少ないユーザーにとって安価なコンピュータであり、ユーザーにパスワードの入力を求めないスクリプトを使用して最新の状態に保ちたいと思います。
複数のトピックのアドバイスに従ってください(例:ここ):
だから私は次の簡単なスクリプトを書いた/home/user/Documents/update.sh
。
#!/bin/bash
sudo apt update -y
sudo apt upgrade -y
sudo apt autoclean -y
sudo apt autoremove -y
その後、スクリプトを実行可能にします。
chmod a+x /home/user/Documents/update.sh
その後、ユーザーにパスワードを要求しないようにuser
権限を与えました。visudo
user ALL=(ALL:ALL) NOPASSWD:/home/user/Documents/update.sh, /usr/bin/apt update, /usr/bin/apt upgrade, /usr/bin/apt autoclean, /usr/bin/apt autoremove
テストのために端末で命令を実行した後sh '/home/user/Documents/update.sh'
、パスワードを入力せずにスクリプトが実行されました。
まず、crontabを使用して起動時にスクリプトを実行します。
起動するたびにスクリプトを実行するために次のように修正しましたcrontab -u user -e
(テストも直接使用しますcrontab -e
)。
@reboot sh '/home/user/Documents/update.sh'
ただし、再起動するたびにスクリプトは起動しません。
次に、Gnome Tweaksとデスクトップファイルを使用して起動時にスクリプトを実行します。
代わりに、ダブルクリックしてスクリプトを実行するupdate.desktop
ファイルを作成してみました。/usr/share/applications
[Desktop Entry]
Name=update
Exec=sh '/home/user/Documents/update.sh'
Terminal=true
Type=Application
Encoding=UTF-8
テスト後にファイルをダブルクリックすると、パスワードを入力せずにスクリプトが実行されます。
それからGNOME調整、起動時にファイルをupdates.desktop
アプリケーションとして追加しました。
ここで2番目の問題が発生します。起動時にスクリプトが起動しますが、パスワードを要求します。
その場合、なぜこれが起こるのか理解できません(Gnome Tweaksが他のユーザーの下で実行されるなど)。
質問:
- crontabメソッドが機能しないのはなぜですか? (確認するためにcrontabサービスを開始しました)
- Gnome Tweakメソッドでパスワードの入力を求めるのはなぜですか。この問題を解決する方法は?
とても感謝しています。
ベストアンサー1
あなたができる最も基本的なことは、/usr/bin
スクリプトにプレフィックスを追加することです:
#!/bin/bash
sudo /usr/bin/apt update -y
sudo /usr/bin/apt upgrade -y
sudo /usr/bin/apt autoclean -y
sudo /usr/bin/apt autoremove -y
ユーザーが実行できます/usr/bin/apt
がapt
。これは、誰かが自分のマルウェアを呼び出すapt
ことによって$PATH
。
次に、最も簡単な解決策はデスクトップアイテムと機能するスクリプト sudo
に置き換えることです。 GUIバージョンの一部です。端末を使用する代わりに、GNOMEセッションが暗くなり、パスワードの入力を求められます。pkexec
pkexec
polkit
sudo
#!/bin/bash
pkexec /usr/bin/apt update -y
pkexec /usr/bin/apt upgrade -y
pkexec /usr/bin/apt autoclean -y
pkexec /usr/bin/apt autoremove -y
インタラクティブなプロンプトなしでユーザーに特定のタスクを実行させる方法もあります。これに対するポルケットルールを見つける必要があります。たとえば、これは次のように適用できます/usr/share/polkit-1/actions/org.update.policy
。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<vendor>Your name</vendor>
<action id="org.update">
<description>Update the system</description>
<message>This will run apt update/upgrade and then autoremove.</message>
<defaults>
<allow_any>yes</allow_any>
<allow_inactive>yes</allow_inactive>
<allow_active>yes</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/apt</annotate>
</action>
</policyconfig>
しかし、最良の答えは(特に非対話型を好む場合)サービスとして実行することです。簡単な解決策は次のとおりです。
#/etc/systemd/system/update.service
[Unit]
Description=Auto upgrade
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/apt update -y
ExecStart=/usr/bin/apt upgrade -y
ExecStart=/usr/bin/apt autoclean -y
ExecStart=/usr/bin/apt autoremove -y
[Install]
WantedBy=multi-user.target
sudo systemctl enable --now update.service
その後、それを実行して次の起動を準備するために使用されます。
apt
すでに(少なくともDebianディストリビューションでは)サービスソリューションに似ています。つまり、1日に1回トリガーしていくつかのアップデートを実行しますapt-daily.service
。apt-daily-upgrade.service
見て
/etc/apt/apt.conf.d/50unattended-upgrades
また、/usr/lib/apt/apt.systed.daily
必要に応じて構成する方法に関するガイダンスも提供されます。私はこのソリューションが独自のサービスを作成するよりもはるかに優れていると思います。システムを損傷する可能性のある極端なケースと信頼性は、作成者がすでに処理しているためですapt
。たとえば、自動クリーニングが削除されlibc6
たり、linux-*
スクリプトがこれを防止したりします。
次のようなことが機能することがあります(この値はデフォルトで無効にするにはすべて0です)。
# /etc/apt/apt.conf.d/10periodic
# Run 'apt update' every day
APT::Periodic::Update-Package-Lists 1
# Run 'apt-get autoclean' every 1 day
APT::Periodic::AutocleanInterval 1
# Run apt-get clean every 1 day
APT::Periodic::CleanInterval 1
# Run unattended-upgrade every 1 day
# This is similar to `apt upgrade` depending on your configuration
# (requires package 'unattended-upgrade')
# This effectively does the 'apt upgrade'
APT::Periodic::Unattended-Upgrade 1
# Run `apt autoremove` after upgrading
# This may be set in /etc/apt/apt.conf.d/50unattended-upgrades
# You might want to set this in that other file to avoid
# getting confused about what goes where
Unattended-Upgrade::Remove-Unused-Dependency "true"