사용 가능한 업데이트를 나열하지만 설치하지는 마십시오.


209

패키지 업데이트가있는 경우 cron-run보고 스크립트가 알려주기를 원합니다. 만들 수있는 방법인가 apt-get나에게 가능한 업데이트의 목록을 제공하지만 더 아무것도하지?

답변:


231

적절한

최신 버전의 apt경우이를위한 특정 스위치가 있습니다.

apt list --upgradable

적절한

이전 apt-get명령의 경우 -u스위치는 업그레이드 할 수있는 패키지 목록을 표시합니다.

# apt-get -u upgrade --assume-no

로부터 apt-getman 페이지 :

-u
--show-upgraded 업그레이드
 된 패키지를 보여줍니다. 업그레이드 할 모든 패키지 목록을 인쇄하십시오. 구성 항목 : APT :: Get :: Show-Upgraded.
--assume-no  모든 프롬프트에 자동 "아니오". <== 설치를 시작하지 못하게하려면

2
나는이 루트없이 할 수있는 기대했다
ThorSummoner

19
"Y"를 입력하고 Enter를 누르면이 명령 업데이트 설치합니다. "-s"를 추가하는 것이 좋습니다. 그렇지 않으면이 답변이 잘못된 것입니다
Murmel

5
이것은이다 매우 오답 때문에 사용자가 잘못된 입력을 입력하면 입력을 대기하고, 패키지가 설치되어있는 명령 (추가 옵션 제외) 시스템 수정 영업 이익은 (내 시스템에 무슨 일이 있었) 원하는 것을하지 않습니다
Daniel Alder

btw : -u는 기본 옵션입니다apt-get
Daniel Alder

1
@ThorSummoner '-s'는 루트 없이도 원하는 작업을 수행합니다.
nevelis

67
apt-get --just-print upgrade

쉽게 읽을 수는 없지만 apt-get의 출력을 구문 분석하는 perl one liner는 다음과 같습니다.

apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "PROGRAM: $1 INSTALLED: $2 AVAILABLE: $3\n"}'

이것은 다음과 같이 출력되어야합니다 :

PROGRAM: grub-pc INSTALLED: 1.99-21ubuntu3.1 AVAILABLE: 1.99-21ubuntu3.9

잘하면 그것은 다른 누군가를 도울 것입니다.


1
웃음을 위해서만 : apt-get -s upgrade | awk -F '[] [()] +' '/ ^ Inst / {printf "프로그램 : % s \ tcur : % s \ tavail : % s \ n", $ 2, $ 3, $ 4}'
tink

8
다음 column과 같이 사용하면 훨씬 더보기 좋을 수도 있습니다 .apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "PROGRAM: $1 INSTALLED: $2 AVAILABLE: $3\n"}' | column -s " " -t
AntonioK

1
@AntonioK 좋아 보인다!
nick

1
이 Perl 코드가 내 컴퓨터를 해킹 할까봐 두렵습니다 ...;)
Chris

33

enzotib에서 영감을 얻은 또 다른 옵션 :

aptitude search '~U' | wc -l

이 명령은 aptitude를 사용하여 새 패키지를 출력 한 다음 wc를 사용하여 행을 계산합니다.

참고로, ~ U 주위에 작은 따옴표가없는 enzotib의 솔루션이 저에게 효과적이지 않다는 것을 알았습니다. (Wheezy, ZSH, 적성 0.6.8.2)

업데이트 :

새로운 아파트로 지금 할 수 있습니다 :

apt list --upgradable

이것에 감사드립니다. apt list 명령은 내가 원하는 것입니다.
dvorak

이 솔루션의 장점은 sudo / root가 필요 없다는 것입니다.
Gunni

25

가장 쉬운 방법은 다음과 같습니다.

apt list --upgradable

박하에는 작동하지 않습니다.
ychaouche

1
사용 가능한 업그레이드 유무에 따라 다른 종료 코드를 반환하지 않는 것은 부끄러운 일입니다. 이것을 스크립트에서 사용할 수 있다면 좋을 것입니다.
데일 앤더슨

18

당신은 실행할 수 있습니다

aptitude -F%p --disable-columns search ~U

또는 서류 미 비자

/usr/lib/update-notifier/apt-check -p; echo

apt-get시뮬레이션을 사용하는 다른 방법 :

apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'

1
이 적성 명령은 저에게 큰 도움이되었으며 루트를 요구하지 않았습니다
JamesCW

apt-get -s dist-upgrade도 잘 작동하며, awker를 통해 파이프를 출력 할 때 동일한 출력을가집니다
ychaouche

감사합니다! 이것은 약간의 의존성 지옥에서 나왔습니다. dist-upgrade일부 패키지를 잃어 버리지 않으려 고 했기 때문에 사용해야했습니다 aptitude. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')트릭을 했어!
Jayen

11

"apticron"패키지를 살펴보십시오 :

apticron-보류중인 패키지 업데이트에 대한 메일을 보내는 간단한 도구

Apticron은 dselect와 aptitude로 보류중인 패키지를 올바르게 처리하여 보안 업데이트와 같은 보류중인 패키지 업데이트에 대한 전자 메일을 매일 보내는 간단한 스크립트입니다.

https://packages.debian.org/buster/apticron


귀하의 링크가 깨졌습니다 ...
Alexis Wilke

10
apt-get update && apt-get -s upgrade

실제로 설치하지 않고 사용 가능한 업데이트를 나열합니다.

첫 번째 명령은 시뮬레이션 된 (따라서 -s) 업그레이드가 수행되기 전에 패키지 색인 파일을 업데이트합니다. "-s"는 설치되었지만 실제로는 설치하지 않는 패킷을 보여주는 시뮬레이션 업그레이드를 수행합니다.

반대로 "-s"대신 "-u"는 실제로 확인 후 설치됩니다.


2
시뮬레이션 옵션은 -s, --simulate, --just-print, --dry-run, --recon, --no-act, 정찰 및 드라이 런 중 하나를 사용하여 실행할 수 있습니다.
ThorSummoner

9

가능한 업그레이드에 대한 정식 버전 정보가 필요했기 때문에 jasonwryan의 답변을 수정했습니다.

apt-get -V -u upgrade

간단하고 IMO가 합리적으로 형식화 된 출력입니다.


3

그냥 출력을 필터링

apt-get update && apt-get -s -V -u upgrade

로그에 기본 정보 만 포함합니다.

아마도, 당신은 줄 뒤에 아름다운 부분이 필요할 것입니다

...

다음과 같은 패키지가 업그레이드됩니다 :

...

처음에는 공백이 거의 없습니다.


안녕하세요. 사이트에 오신 것을 환영합니다. 그대로, 귀하의 답변은 기본적으로 기존 답변을 다시 해시하므로 새로운 것을 추가하지 않습니다. 예를 들어, 출력을 필터링하는 방법을 설명하고 다양한 스위치의 기능에 대한 설명을 추가하여이를 개선 할 수 있습니다.
terdon

2

이 답변 에서 영감을 얻은 또 다른 라이너를 분사하십시오 .

function a { read input;dpkg -l ${input} | grep " ${input} " | awk '{$1=$2=$3=$4="";print $0}' | sed 's/^ *//';unset input;};{ apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "$1 (\e[1;34m$2\e[0m -> \e[1;32m$3\e[0m)\n"}';} | while read -r line; do echo -en "$line $(echo $line | awk '{print $1}' | a )\n"; done;

출력은 다음과 같습니다 (컬러).

locales (2.13-38+deb7u7 -> 2.13-38+deb7u8) Embedded GNU C Library: National Language (locale) data [support]
linux-headers-3.2.0-4-amd64 (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2) Header files for Linux 3.2.0-4-amd64
linux-headers-3.2.0-4-common (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2) Common header files for Linux 3.2.0-4
sudo (1.8.5p2-1+nmu1 -> 1.8.5p2-1+nmu2) Provide limited super user privileges to specific users

간단한 설명을 원하지 않으면 다음을 사용하십시오.

{ apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "$1 (\e[1;34m$2\e[0m -> \e[1;32m$3\e[0m)\n"}';} | while read -r line; do echo -en "$line\n"; done;

산출:

locales (2.13-38+deb7u7 -> 2.13-38+deb7u8)
linux-headers-3.2.0-4-amd64 (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2)
linux-headers-3.2.0-4-common (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2)
sudo (1.8.5p2-1+nmu1 -> 1.8.5p2-1+nmu2)

하나의 라이너는 일부 패키지의 설명을 출력하지 않는다는 점을 제외하면 환상적입니다.
ychaouche

2
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "

cron 이메일에 가장 간단합니다. 사용자 반복이 없으며 업데이트가 없으면 출력이 없습니다.


1

@jasonwryan의 답변에 경고를 작성한 후 내 솔루션을 제공하고 싶습니다.

apt-get dist-upgrade --assume-no

불행히도, 이것은 debian wheezy에서 작동하지 않으며 여전히 업그레이드되지 않은 lxc 컨테이너를 확인해야했습니다. 이 양식은 항상 작동합니다.

apt-get dist-upgrade </dev/null

마지막으로 출력을 다시 포맷하고 싶었습니다. --dry-run더 안전하다고 느끼기 때문에 호출을 다시 변경하기로 결정했습니다 ( 모든 추가 출력을 사용 하지만 무시 함).

apt-get --dry-run dist-upgrade | awk '
BEGIN{p=0}
/^The/{p=1;t=$0}
/no longer required/{p=0}
#optional: /been kept back/{p=0}
p && t{print t;t=""}
/^  / && p{print $0}
'

보고:

The following packages have been kept back:
  iproute
The following packages will be upgraded:
  unzip

1

apt-check 아마도 가장 효율적인 스크립팅 방법 일 것입니다.

/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 1

아주 약간만 수정하면 보안 업데이트 만 표시됩니다.

/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 2

0

변형으로 다음을 사용합니다.

apt-get -V -s dist-upgrade \
    |grep -E "^   .*=>.*" \
    |awk 'BEGIN {
        ul=sprintf("%*s",40,""); gsub(/ /,"-",ul);
        printf "%-30s %-30s %-30s\n", "Package", "Installed", "Available";
        printf "%-30.30s %-30.30s %-30.30s\n", ul, ul, ul;
     }
     {
        printf "%-30s %-30s %-30s\n",
               $1,
               substr($2,2),
               substr($4,1,length($4)-1)
     }'

이름이 지정된 스크립트에 첨부 apt-updates하면 apt-updates사용자와 관계없이 모든 업데이트 목록을 얻기 위해 전화 를 걸 수 있습니다 .

여전히 apt-get update권한있는 액세스 권한 으로 전화해야합니다 .


출력은 패키지 이름 (첫 번째 열) 만 표시하고 두 번째 열은 항상 "="를 인쇄하고 세 번째 열은 항상 비어 있습니다. 나는 민트에있어.
ychaouche

0

있다 apt-show-versions도구. 사용 가능한 업데이트를 표시하려면 다음을 실행하십시오.

apt-show-versions -u

0

나는 이것을 사용하고 싶다 :

apt-get -qq update && apt-get -qq -s upgrade

다음과 같은 출력을 얻습니다.

Inst linux-base [3.5] (4.5~deb8u1 Debian-Security:8/oldstable [all])
Conf linux-base (4.5~deb8u1 Debian-Security:8/oldstable [all])

사용 가능한 업데이트가 있고없는 경우 없습니다. 이 방법으로 간단히 모니터링 솔루션과 결합 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.