Изменить пароль Linux и срок его действия одновременно

С GNU find(, возможно, доступным как gfindв вашей системе):

find. -mindepth 1 -maxdepth 1 -printf '%-58P %TF %AF\n'

Напечатает имя файла, дату последнего изменения (дату создания содержимого файла, если хотите )и дату последнего доступа в формате ГГГГ -мм -дд.

Чтобы ограничить до .txtи .bkpфайлов, к которым не обращались в течение последних 365 дней:

find. -mindepth 1 -maxdepth 1 \
  \( -name '*.txt' -o -name '*.bkp' \) \
  -atime +364 -printf '%-58P %TF %AF\n'

Столбцы должны быть выровнены до тех пор, пока имена файлов не содержат управляющих или многобайтовых -или нулевых символов -ширины или символов двойной ширины -и не длиннее 58 байтов.

Первый столбец выравнивается по левому краю -, третий выравнивается по правому краю (при условии, что ширина терминала составляет 80 столбцов ), второй столбец смещается вправо, чтобы оставить место для имен файлов. Отрегулируйте ширину имени файла и интервал, если вы действительно хотите, чтобы оно было по центру.

Обратите внимание, что список файлов не отсортирован.

С ast -открытымls(или lsвстроенным в ksh93, если он собран с ним):

ls -AZ '%-58(name)Ls %(mtime:%F)s %(atime:%F)s'

Следует сохранить выравнивание для символов с несколькими -байтами, нулевой -шириной и двойной -шириной и отсортировать список.

Сzsh:

#! /bin/zsh -
zmodload zsh/stat
for f (*(DN)) {
  stat -LH s -F %F -- $f &&
    printf '%-58s %s %s\n' $f $s[mtime] $s[atime]
}

Чтобы ограничить файлы .txtи .bkp, к которым не обращались в течение последних 365 дней, замените *(DN)на *.(txt|bkp)(DNa+364).

Следует сохранить выравнивание для многобайтовых -символов и отсортировать имена файлов.

Поскольку не существует стандартной команды для получения времени модификации и доступа надежным и переносимым способом, как обычно, лучше всего использоватьperl:

perl -MPOSIX -Mlocale -Mopen=locale -MEncode::Locale -MEncode -e '
  opendir D, "." || die "open.: $!\n";
  for (
    sort {$a->[1] cmp $b->[1]}
      map {[$_, decode(locale => $_)]}
      grep {!/^\.{1,2}\z/}
      readdir D
  ) {
    if (@s = lstat$_->[0]) {
      printf("%-58s %s %s\n", $_->[1],
        map {strftime("%Y-%m-%d", localtime $_)} ($s[9], $s[8]))
    } else {warn "$_: $!\n"}
  }'

Как и в подходе zsh, он должен сохранять выравнивание для многобайтовых -символов и сортировать имена файлов в соответствии с локальным порядком сортировки.

Поскольку Solaris 10 поставляется с древней версией perl,возможно, вам придется отказаться от поддержки символов ASCII, отличных от -, в именах файлов, что упростило бы его до:

perl -MPOSIX -e '
  opendir D, "." || die "open.: $!\n";
  for (sort grep {!/^\.{1,2}\z/} readdir D) {
    if (@s = lstat$_) {
      printf("%-58s %s %s\n", $_,
        map {strftime("%Y-%m-%d", localtime $_)} ($s[9], $s[8]))
    } else {warn "$_: $!\n"}
  }'

Чтобы ограничить файлы .txtи .bkp, к которым не обращались в течение последних 365 дней, замените !/^\.{1,2}\z/на/\.(txt|bkp)\z/ && -A > 365

0
08.06.2021, 16:23
1 ответ

Причина, по которой вы должны запускать две отдельные команды, согласно исходному коду passwd в:

https://pagure.io/passwd/blob/master/f/passwd.c

Является ли то, что истечение срока действия пароля всегда будет проверяться перед флагом --стандартного ввода, и будет вызывать возврат основной функции, что по существу означает выход из программы в этом случае.

if (passwd_flags & PASSWD_EXPIRE) {
        printf(_("Expiring password for user %s.\n"), username);
        retval = pwdb_update_aging(username, -2, -2, -2, -2, 0);
        printf("%s: %s\n", progname,
               retval ==
               0 ? _("Success") : _("Error"));
        audit_log_acct_message(audit_fd, AUDIT_USER_MGMT,
            NULL, "expired-password", NULL, pwd->pw_uid,
            NULL, NULL, NULL, retval == 0);
        return retval;
    }

Фактический синтаксический анализ параметров строки команды -происходит до этой точки, поэтому порядок не имеет значения, флаг истечения срока действия всегда будет учитываться перед флагом --stdin в этой версии passwd.

Это существенно означает, что вам всегда придется запускать passwd -e <username>и passwd <username>как отдельные команды, поскольку логически невозможно выполнить и истечение срока действия, и смену пароля в рамках одного синтаксиса команды.

1
28.07.2021, 11:26

Теги

Похожие вопросы