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"
答え2
ちなみに私はこう設定しました。無人アップグレード。
Debian パッケージ
無人アップグレードをインストールする必要があります。
sudo apt install unattended-upgrades
その後、
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
構成ファイルを変更し、少なくとも次の行のコメントを削除します。... "origin=Debian,codename=${distro_codename}-updates"; "origin=Debian,codename=${distro_codename}-proposed-updates"; "origin=Debian,codename=${distro_codename},label=Debian"; "origin=Debian,codename=${distro_codename},label=Debian-Security"; ... Unattended-Upgrade::AutoFixInterruptedDpkg "true"; Unattended-Upgrade::MinimalSteps "true"; ... Unattended-Upgrade::Remove-Unused-Kernel-Packages "true"; ... Unattended-Upgrade::Remove-New-Unused-Dependencies "true"; Unattended-Upgrade::Remove-Unused-Dependencies "true"; ... Unattended-Upgrade::OnlyOnACPower "false";
その後、起動時にアップデートを開始するには(コンピュータがあまり使用されていないため、セキュリティパッチが必要になる場合があります)、新しいサービスが必要です。
sudo nano /etc/systemd/system/unattended-upgrades.service
含む:
[Unit] Description=Unattended Upgrades After=apt-daily.service apt-daily-upgrade.service apt-daily-upgrade.timer apt-get-upgrade.service [Service] ExecStart=/usr/bin/unattended-upgrade [Install] WantedBy=multi-user.target
これでサービスを有効にします。
systemctl enable unattended-upgrades.service
その後、毎日取得するには、次のように
sudo nano /etc/apt/apt.conf.d/20auto-upgrades
実行して変更する必要があります。
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "1";
APT::Periodic::CleanInterval 1;
- 最後に、起動時にそれをインポートするには(必要に応じて)、まず次のように
sudo systemctl edit apt-daily.timer
(スケジュールされた適切なアップデートサービス)を実行する必要があります。
[Unit]
Description=Daily apt download activities
[Timer]
OnStartupSec=20
RandomizedDelaySec=5
Persistent=true
[Install]
WantedBy=timers.target
そして、sudo systemctl edit apt-daily-upgrade.timer
以下を実行してください:
[Unit]
Description=Daily apt upgrade and clean activities
After=apt-daily.timer
[Timer]
OnStartupSec=60
RandomizedDelaySec=10
Persistent=true
[Install]
WantedBy=timers.target
フラットパック
- Flatpakも同様です。まず、
sudo nano /etc/systemd/system/flatpak-update.service
次を実行します。
[Unit]
Description=Update Flatpak
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/flatpak update --noninteractive --assumeyes
[Install]
WantedBy=multi-user.target
sudo nano /etc/systemd/system/flatpak-update.timer
また、以下を実行する必要があります。
[Unit]
Description=Update Flatpak
[Timer]
OnBootSec=2m
OnActiveSec=2m
OnUnitInactiveSec=24h
OnUnitActiveSec=24h
AccuracySec=1h
RandomizedDelaySec=10m
[Install]
WantedBy=timers.target
- 最後に、私たちは継続的に実行する必要があります。
systemctl enable flatpak-update.service
systemctl enable flatpak-update.timer
systemctl start flatpak-update.service
systemctl start flatpak-update.timer
スチュワート、あなたを助けてくれたすべてのメンバー、そしてChatGPTに感謝します!