Иногда мне нужно узнать конкретное содержимое журнала (например, вызов API) из файлов журнала, эти файлы журнала существуют на нескольких серверах Linux.

Я должен использовать SSH для входа на каждый сервер и использовать grep для поиска в журнале. Прямо сейчас я планирую написать оболочку для автоматического завершения этой работы. Но когда я пытался поместить "ssh" в оболочку, я выполняю ее, для этого всегда требуется ввод пароля и вывод сообщения на экран.

Есть ли способ убедиться, что нет предупреждения о вводе пароля? Или есть в любом случае поддерживать использование "grep" на нескольких серверах?

Я не могу использовать аутентификацию по ключу SSH, так как я могу сделать это изменение на производственных серверах

Потому что я также планирую предоставить результат на веб-странице (например, JSP, PHP) и выполнить эту оболочку с помощью Java на бэкэнде.

4 ответа4

4

Альтернативой аутентификации с открытым ключом или аутентификацией Kerberos является использование мастер-соединений. Обычно это делается путем добавления этого в файл ~/.ssh/config на клиенте:

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p

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

Смотрите параметры ControlMaster , ControlPath , ControlPersist в ssh_config(5) или, альтернативно, опции -O , -S в ssh(1) .

1

просто используйте grep4j ( https://code.google.com/p/grep4j/ ) в своем бэкэнде и отображайте результаты в своем jsp/php

1

Я действительно опоздал, чтобы ответить на этот вопрос, но вы могли бы использовать Fabric. Вы могли бы написать 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))

Приведенный выше скрипт определяет новую команду g, которая принимает шаблон в качестве входных данных. Вы можете запустить скрипт с помощью:

fab -R dev -p my_pwd g:"some pattern"

grep "некоторый образец" на хостах, определяемых ролью dev.

1

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

#!/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

Я не проверял это, но это должно работать. Пожалуйста, скажите мне, если это не то, что вам нужно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .