วิธีการเขียนสคริปต์ทุบตีที่เข้าสู่เครื่องอื่นเพื่อทำสิ่ง?


11

เป็นไปได้ไหมที่จะเขียนสคริปต์ทุบตี

  1. จะเริ่มจากเครื่อง A, เข้าสู่ระบบในเครื่อง B อื่นโดย ssh (ทั้งเครื่อง A และ B จะเป็น Linux-Machines),
  2. คัดลอกไฟล์บางไฟล์ไปยังเครื่อง B
  3. รันสคริปต์ python กับสคริปต์ python ที่ระบุบนเครื่องเหล่านี้
  4. โอนผลลัพธ์กลับไปที่เครื่อง A
  5. ออกจากระบบบี

เทคนิคนี้ใช้ได้หรือไม่?

คำตอบ:


15

แน่นอนมันเป็นไปได้:

scp file user@host:
ssh user@host path_to_script
scp user@host:file_to_copy ./

และนั่นคือ ...

แต่มีปัญหาหนึ่งคือคุณจะถูกถามรหัสผ่านสามครั้ง เพื่อหลีกเลี่ยงการที่คุณสามารถสร้างคีย์ ssh และอนุญาตผู้ใช้ด้วยปุ่มเหล่านี้

เพื่อสร้างการเรียกใช้คีย์ ssh ssh-keygen -t rsaให้ตอบคำถามและคัดลอกกุญแจสาธารณะไปยังรีโมตโฮสต์ (เครื่อง B) ไปยัง~/.ssh/authorized_keysไฟล์ ควรบันทึกรหัสส่วนตัวใน~/.ssh/id_rsaเครื่องท้องถิ่น (A)


หากคีย์สาธารณะไม่ได้เป็นตัวเลือกคุณสามารถทำสิ่งที่หยาบเพื่อลดพรอมต์รหัสผ่านเช่นcat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
Patrick

หากคุณไม่ต้องการที่จะใช้รหัสผ่านที่คุณก็สามารถใช้เชื่อมต่อร่วมกัน OpenSSH โดยการกำหนดControlMaster=yesและControlPath=/path/to/socketfileจากนั้นเริ่มการเชื่อมต่อ SSH หนึ่งที่มี-fการเรียกใช้ SSH พื้นหลัง บอกการเชื่อมต่อ SSH ที่ตามมาทั้งหมดให้ใช้ไฟล์ซ็อกเก็ตเดียวกัน
jsbillings

4

ฉันสามารถทำทุกอย่างในการsshเชื่อมต่อ / ครั้งเดียว:

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst

นี้:

  1. คัดลอกlocal_srcไปremote_dst,
  2. รันcommand,
  3. คัดลอกไปremote_srclocal_dst

แต่ถ้าcommandเขียนในผลที่มียังอยู่ในstdout local_dstถ้าcommandอ่านข้อมูลจากนั้นก็จะได้รับและstdinEOF


3

ในขณะที่คุณสามารถทำได้ภายในเซสชันเดียว ssh มันเป็นเรื่องยากเล็กน้อยที่จะรวมการคัดลอกไฟล์เข้ากับคำสั่งที่รันอยู่

วิธีที่ง่ายที่สุดในการจัดการงานนี้คือการเรียกใช้เซสชัน SSH แยกต่างหากสำหรับการดำเนินการทั้งสาม:

rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

สิ่งนี้ต้องการการพิสูจน์ตัวตนกับเครื่อง B สามครั้ง วิธีที่แนะนำในการหลีกเลี่ยงการพิสูจน์ตัวตนหลายครั้งคือการใช้ตัวช่วยการเชื่อมต่อการเชื่อมต่อใน OpenSSH เวอร์ชั่นทันสมัย: เริ่มการเชื่อมต่อหลักไปที่ B ทุกครั้งและให้ SSH กลับมาที่การเชื่อมต่อหลักอัตโนมัติ เพิ่มControlMaster autoและControlPathบรรทัดให้กับคุณ~/.ssh/configจากนั้นเริ่มการเชื่อมต่อหลักในพื้นหลังจากนั้นปฏิบัติงานของคุณ

ssh -fN machineB                         # start a master connection in the background
# Subsequent connections will be slaves to the existing master connection
rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

แทนที่จะใช้ SCP หรือ rsync เพื่อคัดลอกไฟล์มันอาจจะง่ายต่อการติดตั้งระบบแฟ้มระยะไกลภายใต้SSHFS วิธีนี้จะดูแลการตั้งค่าการเชื่อมต่อหลักโดยวิธีการ (สมมติว่าคุณได้ตั้งค่า~/.ssh/configตามที่ระบุไว้ด้านบน)

mkdir /net/machineB
sshfs machineB: /net/machineB
cp -Rp inputs /net/machineB/
ssh machibeB 'some command -i inputs -o outputs'
cp -Rp /net/machineB/outputs .
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.