Làm cách nào để hiển thị lịch sử quản lý gói apt-get thông qua dòng lệnh?


Câu trả lời:


131

Tất cả các hành động với apt (apt-get) được ghi lại. Các tệp này có sẵn trong / var / log / apt /. Để xem nhật ký lịch sử gần đây nhất, hãy thực hiện:

less /var/log/apt/history.log

Các nhật ký này được xoay vòng (mỗi tháng tôi đoán), các tệp cũ sẽ được thêm vào một số và được nén. Vì vậy, để xem nhật ký lịch sử tiếp theo, hãy sử dụng:

zless /var/log/apt/history.log.1.gz

Để xem các bản ghi có sẵn:

ls -la /var/log/apt/

4
Thật tuyệt vời. Điều duy nhất còn thiếu là ai đã chạy các lệnh.
Chuộc tội có giới hạn

3
@LrictAtonement Hãy xem /var/log/auth.log, nó có thể chứa người dùng đang chạy cài đặt. (điều này sẽ không hữu ích nếu cài đặt được gọi thông qua shell / chương trình chạy bằng root)
Lekensteyn

3
Cũng hữu ích: zgrep, zcat
Ishmael

tập tin này cũng đăng nhập các gói phụ thuộc được cài đặt như là kết quả của apt-get ban đầu?
Mahesha999

2
@LrictAtonement các phiên bản mới nhất của APT cung cấp một phần "Được yêu cầu:" của nhật ký để hiển thị ai đã gọi lệnh cũng như lệnh nào họ đã gọi như "Commandline: packkit vai trò = 'update-gói'" hoặc "Commandline: apt nâng cấp "
Michael Tunnell

21

Bạn cũng có thể thực hiện một lệnh ngắn để hiển thị nội dung thú vị.

  • Thêm chức năng tùy chỉnh này vào ~/.bashrc:

    ### pars for fun: install | remove | rollback
    function apt-history(){
    
          case "$1" in
            install)
                  grep 'install ' /var/log/dpkg.log
                  ;;
            upgrade|remove)
                  grep $1 /var/log/dpkg.log
                  ;;
            rollback)
                  grep upgrade /var/log/dpkg.log | \
                      grep "$2" -A10000000 | \
                      grep "$3" -B10000000 | \
                      awk '{print $4"="$5}'
                  ;;
            *)
                  cat /var/log/dpkg.log
                  ;;
          esac
    }
  • Và gọi nó trong một thiết bị đầu cuối như thế này:

    kreso@h17:~$ apt-history install
    2013-08-06 14:42:36 install gir1.2-nautilus-3.0:amd64 <none> 1:3.8.2-0ubuntu1~ubuntu13.04.1
    2013-08-06 14:42:36 install python-nautilus:amd64 <none> 1.1-3ubuntu1
    2013-08-06 14:42:37 install insync-nautilus:all <none> 1.0.20
    2013-08-07 14:41:37 install powertop:amd64 <none> 2.1-0ubuntu1
    2013-08-07 18:44:10 install libdiscid0:amd64 <none> 0.2.2-3build1
    2013-08-07 18:44:11 install sound-juicer:amd64 <none> 3.5.0-0ubuntu1
    

Lấy từ đây


zgrep ... /var/log/dpkg.log*- đầu ra mục từ tài liệu lưu trữ quá.
Ctrl-C

6

Bạn cũng có thể sử dụng lệnh sau để liệt kê các gói được cài đặt gần đây

grep "\ install\ " /var/log/dpkg.log

1
thậm chí tốt hơn: grep "\ install\ " /var/log/apt/history.logtrong trường hợp bạn cần sao chép và dán danh sách vào apt-get
mchid

2

Nếu bạn muốn các gói đã được cài đặt và sau đó không được gỡ cài đặt, hãy thử điều này:

comm -23 <(grep "apt-get install" /var/log/apt/history.log | sed 's/.* //' | sort) \ 
<(grep "apt-get remove" /var/log/apt/history.log | sed 's/.* //' | sort) 

Đây là cài đặt trừ đi bất kỳ loại bỏ phù hợp.

Người giới thiệu:


+1: Một lớp lót đẹp nhưng chỉ hợp lệ cho giai đoạn luân chuyển nhật ký cuối cùng. Ngoài ra, thay vì sortsử dụng sort -utrong cả hai trường hợp để tránh các dòng trùng lặp hiển thị, chẳng hạn như trong gói like oracle-java8-installervà nhiều thứ khác.
Cbhihe

1

Đây là cách bạn thực sự làm điều đó, nói lẩm bẩm gói:

_P=mutter &&
(cat /var/log/dpkg.log{,.1};zcat /var/log/dpkg.log.*.gz) |
egrep --text "^[^ ]* [^ ]* (configure|install|remove|status [^ ]*|trigproc|upgrade) $_P[: ]" |
sort --reverse | less

Sử dụng dpkg.log sẽ ghi lại các hoạt động mà apt-get không nhìn thấy.

Đầu ra:

2016-12-20 09:47:35 status unpacked mutter:amd64 3.22.2-2ubuntu1~ubuntu16.10.1
2016-12-20 09:47:35 status installed mutter:amd64 3.22.2-2ubuntu1~ubuntu16.10.1
…

1
Xin lưu ý ba backticks ở đây không hoạt động theo cách bạn nghĩ họ làm.
edwinksl

1

Để có được lịch sử cập nhật của một gói cụ thể giả sử nó đã được cài đặt / cập nhật thông qua apt đây là một oneliner (bash và zgrep), ví dụ dành cho gói skypeforlinux:

package='skypeforlinux'; pregex="(${package}[^\)]+\))"; while read -r line; do [[ "$line" =~ ^Start-Date:[[:space:]]([[:digit:]].+) ]] && curdate="${BASH_REMATCH[1]} "; [[ "$line" =~ $pregex ]] && echo "$curdate ${BASH_REMATCH[1]}"; done < <(for i in `ls -tr /var/log/apt/history*`; do zgrep -B3 "$package" $i; done)

Điều này ghi lại các tệp nhật ký lịch sử của apt cho skypeforlinux, bao gồm cả ba dòng trước để lấy ngày. Sau đó lặp lại kết quả và lặp lại ngày và phiên bản có liên quan.

Thay thế giá trị biến gói bằng tên gói của bạn, thậm chí hoạt động cho nhiều gói với điều kiện chúng bắt đầu bằng cùng một chuỗi.

Ví dụ với đầu ra:

package='apache'; pregex="(${package}[^\)]+\))"; while read -r line; do [[ "$line" =~ ^Start-Date:[[:space:]]([[:digit:]].+) ]] && curdate="${BASH_REMATCH[1]} "; [[ "$line" =~ $pregex ]] && echo "$curdate ${BASH_REMATCH[1]}"; done < <(for i in `ls -tr /var/log/apt/history*`; do zgrep -B3 "$package" $i; done)
2017-10-19  15:00:09  apache2-utils:amd64 (2.4.18-2ubuntu3.5)
2017-11-24  14:24:45  apache-pom-java:amd64 (10-2build1, automatic)
2018-02-22  16:42:02  apache2-data:amd64 (2.4.18-2ubuntu3.5, automatic)
2018-02-26  15:34:34  apache2:amd64 (2.4.18-2ubuntu3.5)
2018-02-26  15:36:32  apache2-data:amd64 (2.4.18-2ubuntu3.5)
2018-02-26  15:40:50  apache2-data:amd64 (2.4.18-2ubuntu3.5, automatic)
2018-02-26  15:42:07  apache2:amd64 (2.4.18-2ubuntu3.5)
2018-02-26  15:42:39  apache2:amd64 (2.4.18-2ubuntu3.5)
2018-03-15  10:08:50  apache-pom-java:amd64 (10-2build1)
2018-04-20  08:55:07  apache2-data:amd64 (2.4.18-2ubuntu3.5, 2.4.18-2ubuntu3.8)
2018-07-06  08:55:11  apache2-data:amd64 (2.4.18-2ubuntu3.8, 2.4.18-2ubuntu3.9)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.