Иногда мне нужно найти определенное содержимое журнала (например, вызов API) в файлах журналов. Эти файлы журналов существуют на нескольких серверах Linux.
Мне нужно использовать SSH для входа на каждый сервер и использовать grep для поиска в журнале. Сейчас я планирую написать оболочку, чтобы автоматически завершить эту работу. Но когда я попытался поместить "ssh" в оболочку, я ее выполнил, она всегда требовала ввода пароля и выводила сообщение на экран.
Есть ли способ убедиться, что не будет предупреждающего сообщения о вводе пароля? Или есть способ поддержки использования "grep" на нескольких серверах?
Я не могу использовать аутентификацию по ключу SSH, так как я могу выполнить это изменение на рабочих серверах.
Потому что я также планирую предоставить результат на веб-странице (например, JSP, PHP) и выполнить эту оболочку с помощью Java на бэкэнде.
решение1
Альтернативой аутентификации с открытым ключом или аутентификации Kerberos является использование основных соединений. Обычно это делается путем добавления этого в ~/.ssh/config
файл на клиенте:
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
После этого, если вы уже подключены к серверу, то открытие другого сеанса не будет спрашивать ваш пароль и будет повторно использовать первое соединение. Таким образом, если вы держите открытыми соединения со всеми вашими серверами, то ваш скрипт никогда не будет нуждаться в вводе пароля.
См . параметры ControlMaster
, ControlPath
, ControlPersist
в ssh_config(5)
или, в качестве альтернативы, параметры -O
, -S
в ssh(1)
.
решение2
Я действительно опоздал с ответом на этот вопрос, но вы могли бы использоватьТкань. Вы можете написать fabfile.py следующим образом:
from fabric.api import *
env.roledefs = {
'dev': ['dev_a', 'dev_b'],
'pro': ['pro_a', 'pro_b', 'pro_c', 'pro_d']
}
env.user = 'foobar'
env.shell = 'rbash -l -c'
env.disable_known_hosts = True
logfile = '/path/to/logfile.txt'
def g(pattern):
with settings(warn_only=True):
run('grep -H --color "{0}" {1}'.format(pattern, logfile))
Скрипт выше определяет новую команду под названиемгпринимает шаблон в качестве входных данных, вы можете запустить скрипт с помощью:
fab -R dev -p my_pwd g:"some pattern"
для grep "some pattern" на хостах определяется по ролидев.
решение3
Поскольку вы не можете использовать аутентификацию с открытым ключом, вам, вероятно, лучше использовать метод, описанный в первом ответе, чтобы избежать необходимости повторять процесс входа. Создание скрипта для подключения к нескольким серверам должно быть относительно простым:
#!/usr/bin/env bash
hosts=(ipaddr1 ipaddr2 ipaddr3) # or host names
user=username # your user on host
log=/tmp/mylog # result of grepping
for host in ${hosts[@]}; do
echo "== $host ==" >> $log
ssh -l $user $host "grep some_pattern /path/to/logfile 2>&1" >> $log
done
less $log # view result
Я не проверял, но должно работать. Пожалуйста, сообщите мне, если это не то, что вам нужно.
решение4
просто используйте grep4j (https://code.google.com/p/grep4j/) на вашем бэкэнде и отобразите результаты на вашем jsp/php