Вторая строка не игнорируется, она скрыта. Чтобы увидеть это, запустите
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"'`
Пока у вашего 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 .
Я интерпретировал ваш вопрос как "Как я могу считать файлы, и если их больше 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
будет ограничить удаление только обычными файлами (, т.е. не каталогами ).