데비안 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가 다른 사용자 아래에서 실행되는 등).
질문:
- 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 버전 의 일부 입니다 . 터미널을 사용하는 대신 그놈 세션이 어두워지고 비밀번호를 묻는 메시지가 표시됩니다.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
이미 (적어도 데비안 배포판에는) 서비스 솔루션과 유사한 것이 있습니다. 즉, 하루에 한 번 트리거하고 몇 가지 업데이트를 수행합니다 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
참고로 저는 이렇게 설정했어요무인 업그레이드.
데비안 패키지
무인 업그레이드를 설치해야 합니다.
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님께 감사드립니다!