Как заставить rpm -V проверять ВСЕ файлы?

Я хочу иметь возможность проверять ВСЕ файлы по базе данных rpm (то есть все файлы, происходящие из rpm).

Пример: когда я прошу rpm проверить пакет, содержащий /etc/hosts, я получаю:

# rpm -Vv setup-2.8.14-16.el6.noarch
.........  c /etc/aliases
S.5....T.  c /etc/bashrc
.........  c /etc/csh.cshrc
.........  c /etc/csh.login
.........  c /etc/environment
.........  c /etc/exports
.........  c /etc/filesystems
.........  c /etc/group
.........  c /etc/gshadow
.........  c /etc/host.conf
.........  c /etc/hosts
.........  c /etc/hosts.allow
(stuff deleted)

Я хочу видеть это, например. /etc/hosts изменен. Как мне это сделать?


person Skagen    schedule 17.09.2015    source источник
comment
ИМХО должно быть unix.stackexchange.com (все равно голосование за, так как вопрос выглядит нормально).   -  person gavv    schedule 19.09.2015


Ответы (2)


В файле спецификации rpm может быть явно указано, какие аспекты файла должны быть проверены -V, а файлы конфигурации (показаны c во 2-м столбце вашего вывода) обычно должны быть изменены и не переопределяются при обновлении.

Вы можете довольно легко получить исходный размер файла и право собственности с помощью rpm -qlv, поэтому вы можете создать ls одних и тех же файлов, а затем сравнить их. Например,

rpm=setup
rpm -ql $rpm | 
xargs ls -ld --time-style='+%b %d %Y' |
tr -s ' ' |
sort -k9 |
diff -u <(rpm -qlv $rpm |tr -s ' ' | sort -k9) -

может отображать изменения (префикс - из rpm, теперь +) или нет ( prefix).


Here's a script that takes a list of package names and uses --dump для получения информации о контрольной сумме (и т. д.), которая на моей Fedora 22 выглядит как sha256sum, а не md5sum, и сравнивает ее с реальным файлом. Хотя rpm -V имеет дополнительное конечное поле, «возможности различаются», эта информация не предоставляется в выводе дампа.

#!/bin/bash
for pkg
do rpm -q --dump "$pkg" |
 while read path size mtime digest mode owner group isconfig isdoc rdev symlink
 do if [ "$path" = package ] # not installed
    then echo "$path $size $mtime $digest $mode"
         continue
    fi
    S=. M=. F=. D=. L=. U=. G=. T=.
    type=$(stat --format='%F' $path)
    if [ "$type" = "regular file" ]
    then if realsum=$(sha256sum <$path)
         then [ $digest != ${realsum/ -/} ] && F=5
         else F=?
         fi
    elif [ "$type" = "symbolic link" ]
    then reallink=$(readlink $path)
        [ "$symlink" != "$reallink" ] && L=L
    # elif [ "$type" = "directory" ] ...
    fi
    eval $(stat --format='s=%s u=%U g=%G t=%Y hexmode=%f' $path)
    realmode=$(printf "%07o" 0x$hexmode)
    realmode6=$(printf "%06o" 0x$hexmode)
    [ "$mode" != "$realmode" -a "$mode" != "$realmode6" ] && M=M
    [ "$size" != "$s" ] && S=S
    [ "$owner" != "$u" ] && U=U
    [ "$owner" != "$g" ] && G=G
    [ "$mtime" != "$t" ] && T=T
    flags="$S$M$F$D$L$U$G$T"
    [ "$flags" = "........" ] ||
    echo "$flags $path" # missing: P capabilities
 done
done
person meuh    schedule 19.09.2015
comment
Я добавил скрипт для проверки суммы. - person meuh; 20.09.2015
comment
Если бы я это сделал, я бы (а) сделал его не специфичным для bash и (б) был бы склонен реконструировать отчет, чтобы он больше походил на rpm -V. - person Thomas Dickey; 20.09.2015
comment
теперь это больше похоже на -V. - person meuh; 20.09.2015

Кажется, это два вопроса:

  • как узнать, был ли изменен конкретный файл
  • как проверить все пакеты.

Во-первых, вы можете спросить rpm, какому пакету принадлежит файл, используя параметры -qf. Предполагая оболочку POSIX, проверьте /etc/hosts:

rpm -V $(rpm -qf /etc/hosts) | fgrep /etc/hosts

который, конечно, можно превратить в сценарий, например,

#!/bin/sh
rpm -V $(rpm -qf $1) | fgrep $1

Чтобы проверить все пакеты, используйте опцию -a, например,

rpm -Va

Отвечая на уточнение: c, которые вы видите в строках, говорит о том, что файл помечен тегом rpm %config. На этой странице перечислены буквы, включая использование c:

База данных RPM записывает только исходный размер, md5sum, принадлежность файлов. Тег %config — это обходной путь, используемый для подтверждения того, что некоторые файлы должны быть изменены специалистами по обслуживанию системы (и для того, чтобы не загромождать отчет о проверке). У вас есть несколько вариантов (все они связаны с дополнительной работой):

  • вы можете скачать бинарный пакет rpm, извлечь из него файлы и сравнить их с установленным rpm
  • вы можете записать исходное содержимое пакета (я локально использую rcs для таких вещей) и сравнить с записанной версией.

Для извлечения пригодится скрипт unrpm. (С таким именем есть несколько; здесь является ссылкой на один из них).

person Thomas Dickey    schedule 17.09.2015
comment
Извините, возможно, мой вопрос был неясен. Моя ситуация такова, что я знаю, что файл (например, /etc/hosts) изменен. Когда я запускаю rpm -Vv, в результате для файла нет 5. Я предполагаю, что проверка md5 вообще не выполняется на /etc/hosts. Я хочу запустить проверку rpm таким образом, чтобы проверка md5 выполнялась для ВСЕХ файлов (включая, например, /etc/hosts), и я хочу видеть результат, показывающий 5 для ВСЕХ измененных файлов... включая такие файлы, как /etc/хост. (надеюсь, это более понятно) - person Skagen; 19.09.2015