Debian: 起動時にパスワードなしで sudo bash スクリプトを使用する方法

Debian: 起動時にパスワードなしで sudo bash スクリプトを使用する方法

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が他のユーザーの下で実行されるなど)。

質問:

  1. crontabメソッドが機能しないのはなぜですか? (確認するためにcrontabサービスを開始しました)
  2. 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/aptapt。これは、誰かが自分のマルウェアを呼び出すaptことによって$PATH


次に、最も簡単な解決策はデスクトップアイテムと機能するスクリプト sudoに置き換えることです。 GUIバージョンの一部です。端末を使用する代わりに、GNOMEセッションが暗くなり、パスワードの入力を求められます。pkexecpkexecpolkitsudo

#!/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.serviceapt-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 パッケージ

  1. 無人アップグレードをインストールする必要があります。

    sudo apt install unattended-upgrades
    
  2. その後、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";
    
  3. その後、起動時にアップデートを開始するには(コンピュータがあまり使用されていないため、セキュリティパッチが必要になる場合があります)、新しいサービスが必要です。

    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
    
  4. これでサービスを有効にします。

    systemctl enable unattended-upgrades.service
    
  5. その後、毎日取得するには、次のように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;
  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

フラットパック

  1. 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
  1. 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
  1. 最後に、私たちは継続的に実行する必要があります。
systemctl enable flatpak-update.service
systemctl enable flatpak-update.timer
systemctl start flatpak-update.service
systemctl start flatpak-update.timer

スチュワート、あなたを助けてくれたすべてのメンバー、そしてChatGPTに感謝します!

関連情報