Score:0

การคัดลอกไฟล์ไปยังไดเร็กทอรีที่มีการป้องกันบนเซิร์ฟเวอร์ระยะไกล

ธง ru

ฉันกำลังทำงานกับสคริปต์ที่ต้องคัดลอกไฟล์บางไฟล์จากเครื่องโลคัลไปยังไดเร็กทอรีบนเซิร์ฟเวอร์ระยะไกล ปัญหาที่ฉันพบคือไดเร็กทอรี (/etc/init.d) เป็นของ root ดังนั้นฉันจึงได้รับการยกเว้นการอนุญาตหากฉันพยายามคัดลอกไฟล์ลงในไดเร็กทอรี นั่นหมายความว่าฉันไม่สามารถใช้ scp โดยไม่เข้าสู่ระบบในฐานะรูท

ทางออกที่ใกล้เคียงที่สุดที่ฉันพบคือคำตอบนี้: https://askubuntu.com/a/872537/798391 . น่าเสียดายที่คำตอบที่ให้ไว้ใช้งานไม่ได้และไม่มีคำแนะนำใด ๆ ในความคิดเห็นที่ดูเหมือนจะแก้ไขได้ ถ้าฉันวิ่ง

แมว myscript.sh | ssh foo@myserver "sudo tee -a /etc/init.d/myscript.sh"

ฉันได้รับข้อผิดพลาด

sudo: ไม่มี tty และไม่ได้ระบุโปรแกรม askpass

หนึ่งในความคิดเห็นแนะนำให้เพิ่ม -t ในคำสั่ง ssh

แมว myscript.sh | ssh -t foo@myserver "sudo tee -a /etc/init.d/myscript.sh"

แต่นั่นส่งผลให้เกิดข้อผิดพลาด

Pseudo-terminal จะไม่ถูกจัดสรร เนื่องจาก stdin ไม่ใช่เทอร์มินัล

ตัวเลือกอื่นที่แนะนำคือการใช้ -S อาร์กิวเมนต์ของ sudo

แมว myscript.sh | ssh foo@myserver "sudo -S tee -a /etc/init.d/myscript.sh"

อย่างน้อยก็แจ้งรหัสผ่าน แต่หมดเวลาและถามอีกครั้งก่อนที่จะสามารถป้อนรหัสผ่านได้อย่างสมบูรณ์

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

Score:0
ธง cn
raj

มีหลายวิธีเพื่อให้ได้สิ่งที่คุณต้องการ ขึ้นอยู่กับการกำหนดค่าโดยละเอียดของทั้งสองเครื่อง

วิธีที่ง่ายที่สุดคือ (ถ้าเป็นไปได้) เพื่อกำหนดค่าการพิสูจน์ตัวตน ssh ตามคีย์ เพื่อให้ผู้ใช้ภายในของคุณสามารถ ssh เป็นรูทไปยังเครื่องระยะไกล

อีกวิธีหนึ่งคือการใช้ คาดหวัง เพื่อเขียนสคริปต์ที่บันทึกแบบโต้ตอบผ่าน ssh ไปยังเครื่องระยะไกล sudo -i (และพิมพ์รหัสผ่านที่เหมาะสม) จากนั้นคัดลอกไฟล์ที่ทำ scp ในทิศทางกลับกัน (เช่น scp ถูกดำเนินการบนเซิร์ฟเวอร์ระยะไกลไปยังเครื่องของคุณ - จะต้องมีเซิร์ฟเวอร์ ssh ที่ใช้งานอยู่)

วิธีแก้ปัญหาที่น่าจะใกล้เคียงกับสิ่งที่คุณลองในตอนแรกมีดังต่อไปนี้:

  1. เตรียมสคริปต์ (ขอเรียกว่า /tmp/รหัสผ่าน) โดยมีเนื้อหาดังนี้

     #!/bin/sh
     รหัสผ่านสะท้อน
    

    ที่ไหน รหัสผ่าน เป็นรหัสผ่านจริงสำหรับผู้ใช้ ฟู บนเซิร์ฟเวอร์ระยะไกล

  2. chmod 700 /tmp/รหัสผ่าน เพื่อให้ไฟล์สามารถเรียกใช้งานได้และไม่มีใครเข้าถึงได้นอกจากเจ้าของ

  3. คัดลอกไฟล์ (สงวนสิทธิ์) ไปยังเซิร์ฟเวอร์ระยะไกลด้วย scp -p /tmp/รหัสผ่าน foo@myserver:/tmp

  4. ใช้คำสั่งต่อไปนี้:

     แมว myscript.sh | ssh foo@myserver "SUDO_ASKPASS=/tmp/password sudo -A tee -a /etc/init.d/myscript.sh"
    
ru flag
ฉันได้ตั้งค่าการรับรองความถูกต้องตามคีย์แล้ว อย่างน้อยฉันก็คิดว่าฉันทำ ฉันไม่แน่ใจว่าจะช่วยได้อย่างไร เนื่องจากฉันยังคงต้องเรียกใช้คำสั่งคัดลอกด้วยสิทธิ์ระดับสูงบนเซิร์ฟเวอร์ระยะไกล และยังคงต้องระบุรหัสผ่าน
raj avatar
cn flag
raj
@pbuchheit คุณช่วย `ssh root@myserver` ได้ไหม ฉันหมายถึงการตั้งค่าการตรวจสอบคีย์เพื่อให้คุณสามารถทำได้
ru flag
ไม่ ฉันไม่ต้องการเข้าสู่ระบบในฐานะรูท
raj avatar
cn flag
raj
@pbuchheit ลองวิธีแก้ปัญหาที่ฉันอธิบายไว้
ru flag
ทางออกไหน? การใช้ความคาดหวังนั้นเป็นไปไม่ได้ สมาชิกในทีมคนอื่นๆ ต้องสามารถเรียกใช้สคริปต์นี้ได้โดยไม่ต้องใช้ไลบรารีเพิ่มเติม การเพิ่มไฟล์ที่มีรหัสผ่านไปยังเซิร์ฟเวอร์ระยะไกลดูเหมือนจะซ้ำซ้อน ฉันได้ตั้งค่าการตรวจสอบสิทธิ์ด้วยคีย์แล้ว
raj avatar
cn flag
raj
@pbuchheit อาจลองสิ่งนี้ก่อนที่จะแสดงความคิดเห็นว่า "ดูเหมือนซ้ำซ้อน" ไฟล์นี้ใช้เพื่อระบุรหัสผ่านให้กับ sudo (ไม่ใช่ ssh) เพื่อไม่ให้คุณถาม คุณถามว่า "มีวิธีทำให้คำสั่งนี้ใช้งานได้หรือไม่" ฉันให้คำตอบ **ทดสอบแล้ว** แก่คุณ แต่คุณบอกว่าคุณไม่ต้องการลอง - นั่นคือปัญหาของคุณ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา