如何将文件从多个服务器复制到本地系统?


11

我们在诸如app00,app01等服务器上部署了一个应用程序。我需要将所有这些服务器中的单个日志文件复制到本地Mac上,以便执行一些grepping和cuting。

我使用csshX来查看此文件,但找不到与scp等效的文件。我基本上想要两件事:

  1. 能够连接n个此类服务器并复制文件
  2. 通过在日志文件前添加服务器主机名,可以避免在本地命名冲突

我该怎么做呢?


1
我可能会自己写一个脚本。那不是一种选择吗?
伯恩哈德

我现在正在这样做,伯恩哈德。:)我只是希望也有类似csshX的东西。
盖拉夫2014年

Answers:


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。因此,from中的文件app0将为app0_fileetc。您显然可以将名称更改为所需的名称。


3
将命令放在命令&末尾,将scpa wait放在末尾,这样就可以并发,而不会产生任何额外费用。
l0b0

3
@ l0b0我不知道这是否是理想的。我喜欢这种方法,因为我可以知道是否以及哪些文件无法复制。很好的提示,谢谢。
terdon

12

使用GNU parallel

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

与使用的解决方案不同for,这将并行运行所有下载


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编程的新手,并写了类似的内容,但更加肮脏。:)
Gaurav


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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.