Как скопировать файл с нескольких серверов в мою локальную систему?

11

У нас есть многократное развертывание приложения на серверах, таких как app00, app01 и так далее. Мне нужно скопировать один файл журнала со всех этих серверов на мой локальный Mac, чтобы я мог выполнить некоторые операции поиска и вырезки.

Я использовал csshX для просмотра этого файла, но я не могу найти эквивалент для scp. Я в основном хочу две вещи:

  1. Возможность подключения n номеров таких серверов и копирования файла
  2. Избегайте конфликтов имен локально, возможно, с помощью префикса файла журнала с именем хоста сервера

Как мне это сделать?

Gaurav
источник
1
Я бы, наверное, сам написал сценарий для этого. Это не вариант?
Бернхард
Я делаю это прямо сейчас, Бернхард. :) Я просто надеялся, что для этого есть что-то вроде csshX.
Гаурав

Ответы:

18

Это тривиально, чтобы сделать с небольшим сценарием. Например:

for server in app0 app1 app4 app5 appN; do
    scp user@$server:/path/to/log/file /local/path/to/"$server"_file
done

Выше будет скопировать файл с каждого из серверов последовательно и назовите его SERVERNAME_file. Таким образом, файл из app0будет app0_fileи т. Д. Очевидно, вы можете изменить имена на что угодно.

Тердон
источник
3
Поставьте &в конце scpкоманды и a waitв конце, и вы получите параллелизм без дополнительных затрат.
10
3
@ l0b0 Не знаю, так ли это. Мне нравится этот подход, потому что я могу знать, если и какие файлы не удалось скопировать. Хороший совет, хотя, спасибо.
Тердон
12

Используйте GNU параллельно :

parallel -j0 scp {}:/remote_path file_from_{} ::: host1 host2 host3 # and so on

В отличие от решений, которые используют for, это будет запускать все загрузки параллельно

wingedsubmariner
источник
5
remote_path="/path/to/file"
local_target_dir="/path/to/dir"
hosts=(app00 app01)
for host in "${hosts[@]}"; do
    scp "$host":"$remote_path" "$local_target_dir"/filename."$host"
done
Хауке Лагинг
источник
Большое спасибо, я новичок в программировании Bash и написал что-то вроде этого, просто намного грязнее. :)
Гаурав
0

Если вы можете использовать python, есть интересный модуль, который упрощает задачи администрирования машины, который называется fabric: http://docs.fabfile.org/en/latest/tutorial.html.

Я хотел использовать это, но не обошлось слишком

Павел
источник
0

Это сработало для меня

#!/bin/bash
#Expect script
/usr/bin/expect -<<EOD 

set SERVERS {1 2 3 .. N}

foreach SERVER \$SERVERS {
    spawn scp user@\$SERVER:remote local/"\$SERVER"RESWeb.log
    expect {
      -re ".*es.*o.*" {
        exp_send "yes\r"
        exp_continue
      }
      -re ".*sword.*" {
        exp_send "pswrd\r"
      }
    }
    expect eof 
}
EOD

echo "completed"
user170232
источник