เชลล์สคริปต์จากเครื่องโลคัลเพื่อรันคำสั่งในเครื่องรีโมตจากนั้นดำเนินการต่อบนเครื่องโลคัล


10

ปัญหาคือ: ฉันต้องการคัดลอกไฟล์จากเครื่องระยะไกล

ฉันกำลังมองหาวิธีในการเขียนเชลล์สคริปต์ที่จะเชื่อมต่อกับเครื่องระยะไกลรับตำแหน่งของไฟล์ที่เก็บไว้เมื่อฉันได้รับการยกเลิกการเชื่อมต่อตำแหน่งจากเซิร์ฟเวอร์ระยะไกลและใช้ scp จากภายในเครื่องท้องถิ่นที่มีตำแหน่งที่ได้รับไป คัดลอกไฟล์

โดยเฉพาะฉันต้องการทราบว่าจากสคริปต์ฉันจะเชื่อมต่อกับเครื่องระยะไกลทำงานในเครื่องนั้น ตัดการเชื่อมต่อและดำเนินการต่อภายในเครื่อง

คำตอบ:


15

โซลูชันที่ 1:

remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path

สิ่งนี้ทำงานได้โดยเชื่อมต่อกับเครื่องระยะไกลเรียกใช้คำสั่งบางอย่างและคัดลอกผลลัพธ์ไปยังตัวแปรในเครื่องท้องถิ่นของคุณ บอกว่าการสะท้อนพา ธ ของไฟล์จากระยะไกลจับภาพไว้ในเครื่อง

โซลูชันที่ 2:

ssh user@host "determine_path; cat filename" >local_filename

สิ่งนี้ทำงานโดยการค้นหาและส่งออกไฟล์โดยตรงจากระยะไกลและเปลี่ยนเส้นทางไปยังไฟล์ในเครื่อง นี่ข้าม scp สิ่งนี้ต้องการให้ขั้นตอนก่อนหน้า "cat" ไม่มีเอาต์พุต (ซึ่งคุณสามารถแก้ไขด้วย &> / dev / null)


1
+1 สำหรับแสดงวิธีแก้ปัญหาทั้งหมดด้วยการเชื่อมต่อเดียวแทนที่จะแยก ssh + scp
Peter Cordes

คำตอบทั้งหมดมีประโยชน์ แต่อันนี้แก้ปัญหาของฉันโดยเฉพาะอย่างยิ่ง
gnsr

20

คุณสามารถเขียนสคริปต์ในรูปแบบต่อไปนี้:

command1
command2
...
ssh user@machine command3
...
command4
command5

คุณต้องตั้งค่าคีย์ SSH เพื่อให้สามารถใช้งานได้command3โดยไม่ต้องใส่รหัสผ่าน


2
ควรสังเกตว่าสิ่งนี้จะเกิดขึ้นพร้อมกัน ในขณะที่ssh user@remote command3กำลังทำงานcommand4ไม่สามารถเริ่ม
aaaaa พูดว่าคืนสถานะโมนิก้า

3
@aaaaaa เว้นแต่ว่าคุณจะทำssh user@machine command3 &
ไอแซค

3
@Isaac ใช่ประเด็นของฉันคือว่าอาจเป็นพฤติกรรมที่พึงปรารถนา แต่ควรเป็นการตัดสินใจที่
รัดกุม

2

ฉันคิดว่าคุณมีความคิดอยู่บ้างว่าคุณจะระบุไฟล์ที่คุณต้องการคัดลอกได้อย่างไรและคุณสามารถเขียนสคริปต์หรือชุดคำสั่งที่จะทำงานบนเครื่องระยะไกลที่ใช้การระบุนี้ได้หรือไม่ .

นอกจากนี้ฉันจะสมมติว่าคำสั่งเหล่านั้นพิมพ์บนเอาต์พุตมาตรฐานพา ธ เต็มไปยังไฟล์หรือพา ธ สัมพัทธ์กับไฟล์เทียบกับโฮมไดเร็กทอรีของผู้ใช้ SSH ที่ใช้สำหรับการคัดลอก ในตัวอย่างของฉันชื่อของสคริปต์คือ "getfilepath.sh" แม้ว่ามันจะไม่จำเป็นต้องเป็นเชลล์สคริปต์ แต่ก็อาจเป็นไฟล์ปฏิบัติการอื่นหรือแม้แต่ชุดคำสั่ง

# Script to be executed on local machine.

# put any leading local commands here.

FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .

# put any trailing local commands here.

ในรหัสข้างต้นสัญกรณ์ "$ ()" เป็นวิธีการจับเอาท์พุทมาตรฐานของคำสั่งเป็นตัวแปรเชลล์ มันค่อนข้างมาตรฐาน แต่ถ้าคุณใช้เชลล์ที่ไม่เข้าใจคุณสามารถล้อมรอบคำสั่งด้วย "back-ticks" ซึ่งเป็นเครื่องหมายเน้นเสียงทางด้านซ้ายของคีย์ 1 บนคีย์บอร์ดของสหรัฐอเมริกาส่วนใหญ่


0

อาจเป็นไปได้ที่จะทริกเกอร์งานที่กำหนดเวลาไว้ในเครื่องระยะไกลที่ทำงานทั้งหมดได้

สิ่งนี้จะป้องกันไม่ให้คุณเชื่อมต่อกับเครื่องรีโมตในขณะที่คุณค้นหาตำแหน่งของไฟล์ที่คุณต้องการคัดลอก

ฉันกำลังทำสิ่งนี้:

บรรทัด comand ทริกเกอร์งานที่กำหนดเวลาไว้ซึ่งดำเนินการ batchscript ในกรณีของฉัน

schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"

ขอแสดงความนับถืออย่างสูง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.