использование даты в сценарии оболочки

Войдите на машину, которой нужны учетные записи. Станьте пользователем root.

sudo -i

Став root, добавьте пользователей и установите пароли. Создайте столько пользователей, сколько необходимо.

adduser $username
passwd $username

Для каждого пользователя, который должен иметь возможность стать пользователем root, добавьте пользователя в правую группу sudo. Это колесо на RHEL.

usermod -aG wheel $username

Убедитесь, что ваша конфигурация sudo позволяет группе стать root.

visudo

Вы увидите две конфигурации для группы wheel, как показано ниже.

## Allows people in group wheel to run all commands
# %wheel ALL=(ALL) ALL

## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL

Раскомментируйте один из параметров конфигурации и сохраните файл. Например, чтобы настроить sudo, чтобы каждый пользователь вводил свой пароль, чтобы стать root или выполнять команду как root, используйте следующую строку.

## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL

Итак, вы создали m обычных пользователей и n привилегированных пользователей, которые могут стать root или выполнять команду как root.

0
01.03.2017, 21:50
2 ответа

Если вы хотите найти обычные файлы, возраст которых превышает 10 дней и которые последний раз изменялись в субботу (в часовом поясе пользователя, запустившего сценарий), с помощью GNU инструменты (и вы, похоже, работаете в системе GNU, поскольку используете специфичную для GNU опцию для date и оболочки GNU), вы можете сделать:

find . -type f -mtime +10 -printf '%Tu%p\0' |
  sed -zn 's/^6//p' |
  tr '\0' '\n'

Хотя в конечном итоге GNU добавил (но другой ) stat команда в начале 2000-х для запроса метаданных файла более гибким в сценариях способом, чем с ls , большая часть ее функциональности уже была в GNU find задолго до этого. и с гораздо лучшим интерфейсом, чем у GNU stat .

Большинство других реализаций stat могут дать вам время модификации в любом формате, GNU stat не может (причина, по которой вы в конечном итоге прибегаете к комбинации ls и GNU date в вашем вопросе, я полагаю), но GNU find может (с GNU date вы также можете использовать date -r " $ file "+% u ).

Выше % T - время модификации с использованием указанного формата strftime . % Вт - день недели в виде числа от 1 (понедельник) до 7.Это лучше в сценариях, чем использование % a / % A , зависящих от локали.

Мы печатаем это число, за которым следует путь к файлу, с разделителями NUL, чтобы можно было обрабатывать имена файлов с символами новой строки, и по конвейеру к sed , чтобы выбрать записи, начинающиеся с 6 (и удалите для них 6). Затем при выводе NUL переводятся в новую строку.

-z был добавлен в GNU sed в 2012 году. Если ваш sed старше, вы можете изменить приведенное выше значение на:

find . -type f -mtime +10 -printf '%Tu%p\0' |
  tr '\0\n' '\n\0'
  sed -n 's/^6//p' |
  tr '\0' '\n'

Обычно вы не хочу повторять вывод find , как вы делаете в своем вопросе . Если вы хотите перебрать файлы, найденные с помощью find в bash , вам лучше сделать:

 while IFS=/ read -d '' -ru3 day file; do
   case $day in
     (6) printf '"%s" was last modified on a Saturday\n' "$file";;
   esac
 done 3< <(find . -type f -mtime +10 -printf '%Tu/%p\0')

В zsh вы также можете сделать:

zmodload zsh/stat # for zsh's stat builtin
last_modified_on_a_saturday() {
  local -A stat
  stat -LF %u -H stat -- ${1-$REPLY} &&
    ((stat[mtime] == 6))
}
for file in **/*(ND.m+10+last_modified_on_a_saturday); do
   do-something with $file
done
3
28.01.2020, 02:15

Вы можете значительно упростить ситуацию, используя команду stat вместо ls .

#!/bin/bash
for i in $(find . -type f -mtime +10 ); 
do
   echo "$i"
   echo "ligne dans la boucle";
   #il faut verifier si il a ete créer un samedi ou pas;

   #///////////////////////
   #jour=`ls -lrt $i| awk '{print $7}'`;
   #mois=`ls -lrt $i| awk '{print $6}'`;
   #annee=`ls -lrt $i| awk '{print $8}'`;
   #requette="date -d '$mois $jour $annee' +'%a %u %A'";
   #//////////////////////////////

   # get the month, year, and day from stat-ing the file
   mois_jour_annee=`stat -c '%y' "$i" | cut -d' ' -f1`

   # and then...
   requette="date -d '${mois_jour_annee}' +'%a %u %A'";

   echo "$requette";
   test=$(eval "$requette");
   echo "$test";
   echo " ";
done
3
28.01.2020, 02:15

Теги

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