데비안: 시작 시 비밀번호 없이 sudo bash 스크립트를 사용하는 방법

데비안: 시작 시 비밀번호 없이 sudo bash 스크립트를 사용하는 방법

데비안 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

테스트 후 파일을 더블클릭하면 비밀번호 입력 없이 스크립트가 실행됩니다.

그런 다음그놈 조정, 시작 시 파일을 updates.desktop애플리케이션으로 추가했습니다.

여기서 두 번째 문제가 발생합니다. 부팅 시 스크립트가 시작되지만 비밀번호를 묻습니다.

그렇다면 왜 이런 일이 발생하는지 이해할 수 없습니다(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/apt있지만 apt. 이는 누군가가 자신의 악성 프로그램을 호출 apt하여 $PATH.


다음으로 가장 쉬운 해결책은 데스크탑 항목과 작동하는 스크립트 sudo로 바꾸는 것입니다 . GUI 버전 의 일부 입니다 . 터미널을 사용하는 대신 그놈 세션이 어두워지고 비밀번호를 묻는 메시지가 표시됩니다.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이미 (적어도 데비안 배포판에는) 서비스 솔루션과 유사한 것이 있습니다. 즉, 하루에 한 번 트리거하고 몇 가지 업데이트를 수행합니다 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

참고로 저는 이렇게 설정했어요무인 업그레이드.

데비안 패키지

  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님께 감사드립니다!

관련 정보