2017-02-17 27 views
1

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

Вот краткий обзор того, что я хочу сделать:

spawn ssh [email protected] expect "password: " send "PASSWORD\r" expect "$ " send "grep <something> /some/log/file >> file.txt" expect "$ " send "exit\r"

... затем продолжать делать это в десятки более серверов с выводом команды Grep добавляющим к file.txt каждый раз. Я не против, где файл file.txt на самом деле. Это может быть на моем локальном компьютере или на любом из серверов.

Лучшее, что я придумал, было бы поместить каждый из них в файл на сервере, на котором выполняется grep, а затем scp все эти файлы на локальные и добавив их все. Это кажется невероятно расточительным, хотя, поэтому я ищу способ отправить вывод на сервер или локально с сервера.

ответ

0

Было бы проще автоматизировать и более безопасно, если бы вы использовали аутентификацию открытого ключа вместо аутентификации паролей, чтобы добраться до серверов. Тогда вы могли бы просто цикл над ними, как это:

for host in server1 server2 server3 ...; do 
    ssh -n "$host" 'grep <something> /some/log/file' 
done >file.txt 

Поскольку у вас есть пароль доступа, вы можете легко поместить открытый ключ в .ssh/authorized_keys для того, чтобы ключ доступа первым. Вы можете сделать это с вашим ожидать сценария:

spawn ssh [email protected] 
expect "password: " 
send "PASSWORD\r" 
expect "$ " 
send "mkdir -p .ssh\r" 
expect "$ " 
send "cat >>.ssh/authorized_keys <<EOF" 
send "(public key goes here)\r" 
send "EOF\r" 
expect "$ " 
send "chmod 0700 .ssh\r" 
expect "$ " 
send "chmod 0600 .ssh/authorized_keys\r" 
expect "$ " 
send "exit\r" 
0

Если по какой-то причине вы должны использовать решение с паролем входа, вы можете добавить в файл с expect что-то вроде:

log_user 0     # to not see the output on screen 
set fh [open foo.log a] # open the file for appending 

set servers {[email protected] [email protected] […]} 

foreach s $servers { 
    spawn ssh [email protected] 
    […] 
    send "command" 
    expect "$ " { puts $fh "$expect_out(buffer)"} 
} 
close $fh 
+0

Это отлично работает, не могли бы вы объяснить, почему вы используете [open foo.log a], а не только foo.log? Кроме того, в чем смысл закрытия $ fh? –