Удаление файлов при определенных условиях (количество файлов, возраст файла)

Вторая строка не игнорируется, она скрыта. Чтобы увидеть это, запустите

echo "$STR3" | cat -v

Проблема в том, что STR1 заканчивается символом возврата каретки . Этот символ указывает терминалу переместить курсор обратно в начало строки. Он генерируется непосредственно перед обычным символом новой строки (перевода строки). Причина его появления заключается в том, что вы указали SSH эмулировать терминал с параметром -t , чтобы все было правильно отображено. Это не дает полезного результата, когда вы записываете вывод в строку.

Показанные вами команды можно запускать от имени любого пользователя, поэтому sudo не требуется. Если вам не нужен sudo, вам не нужен -t .

STR1=`ssh -q -i "$KEYFILE" "$USERNAME@$MASTER" -p 22 'hostname'`
STR2=`ssh -q -i "$KEYFILE" "$USERNAME@$MASTER" -p 22 "grep search /etc/resolv.conf" | awk {print $2}`
STR3="$STR1$STR2"

Если вашему настоящему сценарию абсолютно необходимо sudo, удалите символы возврата каретки.

STR=`ssh -t … 'sudo mycommand' | tr -d '\r'`

Объединение ssh и sudo обременительно. При повышении привилегий проще придерживаться SSH. Для этого необходимо разрешить учетной записи root войти в систему с помощью SSH. В отличие от того, что вы, возможно, читали в другом месте, это небезопасно по своей сути. Риски повышения привилегий от локального пользователя до root обычно переоцениваются ); если злоумышленник имеет доступ к учетной записи sudoer, он в любом случае имеет доступ к root. Однако для сохранения полезных журналов лучше ограничить прямой доступ к учетной записи root. Вы можете авторизовать доступ к root для локальных пользователей, только поместив следующие директивы в sshd_config :

PermitRootLogin no
…
Match Address 127.0.0.1,::1
    PermitRootLogin yes
Match User root
     PasswordAuthentication no
     GSSAPIAuthentication
     KbdInteractiveAuthentication no

Тогда root будет разрешен вход через SSH, но только с аутентификацией по ключу и только через localhost.После настройки ключей вы можете связать входы SSH в цепочку:

STR=`ssh … 'ssh root@localhost "mycommand"'`

5
23.03.2019, 20:43
2 ответа

Пока у вашего findесть опция -mmin, вы можете:

Использование сценария оболочки:

#!/bin/sh

files_dir=/tmp
file_count=$(find "$files_dir" -name 'ci_session*' -mmin 60 -exec echo x \; | wc -l)

if [ "$file_count" -gt 1000 ]; then
    find "$files_dir" -name 'ci_session*' -mmin 60 -exec rm {} \;
fi

file_countбудет установлено на количество файлов, найденных в указанном каталоге, соответствующих шаблону.

Если file_countбольше 1000, мы снова запустим поиск и удалим эти файлы.


С помощью bash мы можем исключить второй вызов find с массивом:

#!/bin/bash

files_dir=/tmp
mapfile -t files < <(find "$files_dir" -name 'ci_session*' -mmin 60)

if ((${#files[@]}>1000)); then
    rm "${files[@]}"
fi

Примечание :В зависимости от того, сколько файлов вы ожидаете иметь, решение bash может столкнуться с вашим аргументом командной строки limit .

5
27.01.2020, 20:33

Я интерпретировал ваш вопрос как "Как я могу считать файлы, и если их больше 1000, удалить те, которые старше одного часа?".

Подсчет совпадающих имен /tmp/ci_session*и выполнение каких-либо действий, когда их более 1000:

set -- /tmp/ci_session*
if [ "$#" -gt 1000 ]; then
    # something
fi

Это устанавливает позиционные параметры на имена, соответствующие шаблону. Затем специальная переменная $#содержит количество позиционных параметров.

Удаление файлов, соответствующих /tmp/ci_session*, если время их последнего изменения было более часа назад:

find /tmp -maxdepth 1 -type f -name 'ci_session*' -mmin +60 -delete

В совокупности:

#!/bin/sh

set -- /tmp/ci_session*
if [ "$#" -gt 1000 ]; then
    find /tmp -maxdepth 1 -type f -name 'ci_session*' -mmin +60 -delete
fi

Единственное, что следует здесь отметить, это то, что подсчет будет состоять из любого имени, соответствующего шаблону (, даже имен каталогов, если таковые имеются ), в то время как команда findбудет ограничить удаление только обычными файлами (, т.е. не каталогами ).

7
27.01.2020, 20:33

Теги

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