ฉันจะคัดลอกไฟล์จากเซิร์ฟเวอร์หลายเครื่องไปยังระบบโลคัลของฉันได้อย่างไร


11

เรามีการปรับใช้แอปพลิเคชั่นหลายตัวบนเซิร์ฟเวอร์เช่น app00, app01 และอื่น ๆ ฉันต้องการคัดลอกไฟล์บันทึกเดียวจากเซิร์ฟเวอร์ทั้งหมดเหล่านี้ลงในเครื่อง mac ของฉันเพื่อให้สามารถทำการ grepping และตัดบางอย่าง

ฉันใช้ csshX เพื่อดูไฟล์นี้ แต่ไม่สามารถหาค่าเทียบเท่าสำหรับ scp โดยทั่วไปฉันต้องการสองสิ่ง:

  1. ความสามารถในการเชื่อมต่อกับหมายเลขของเซิร์ฟเวอร์ดังกล่าวและคัดลอกไฟล์
  2. หลีกเลี่ยงความขัดแย้งในการตั้งชื่อในเครื่องโดยอาจนำหน้าล็อกไฟล์ด้วยชื่อโฮสต์เซิร์ฟเวอร์

ฉันจะทำสิ่งนี้ได้อย่างไร


1
ฉันอาจจะเขียนสคริปต์ด้วยตัวเอง นั่นไม่ใช่ตัวเลือกใช่ไหม
Bernhard

ฉันกำลังทำสิ่งนั้นอยู่ตอนนี้แบร์นฮาร์ด :) ฉันแค่หวังว่าจะมีบางอย่างเช่น csshX สำหรับสิ่งนี้ด้วย
Gaurav

คำตอบ:


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ที่ส่วนท้ายและคุณมีการทำงานพร้อมกันโดยไม่มีค่าใช้จ่ายเพิ่มเติม
l0b0

3
@ l0b0 ฉันไม่ทราบว่าเป็นที่ต้องการ ฉันชอบวิธีนี้เพราะฉันรู้ได้ว่าไฟล์ไหนและไม่สามารถคัดลอกได้ เคล็ดลับที่ดีแม้ว่าขอบคุณ
terdon

12

ใช้GNU ขนาน :

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

ไม่เหมือนกับโซลูชันที่ใช้ a 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

ขอบคุณมากฉันยังใหม่กับการเขียนโปรแกรมทุบตีและเขียนอะไรแบบนั้นสกปรกกว่าเยอะ :)
Gaurav

0

หากคุณสามารถใช้งาน python ได้มีโมดูลที่น่าสนใจที่จะทำให้งานการจัดการเครื่อง - ish ง่ายขึ้นเรียกว่า 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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.