คัดลอกไฟล์ที่ได้รับการป้องกันระหว่างเซิร์ฟเวอร์ในหนึ่งบรรทัด?


13

ฉันต้องการคัดลอกsquid.confจากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่ง

  • เซิร์ฟเวอร์ไม่ได้พูดคุยกัน ฉันต้องการผ่านเวิร์กสเตชันของฉัน
  • เซิร์ฟเวอร์ทั้งสองมีไฟล์ดังนั้นจึงจะถูกเขียนทับบนเป้าหมาย
  • ไฟล์มี600สิทธิ์และเป็นของ root
  • การเข้าสู่ระบบผ่านทางรูต ssh ถูกปิดการใช้งาน ( PermitRootLogin no)
  • ฉันต้องการที่จะทำมันในบรรทัดเดียวถ้าเป็นไปได้เพราะมันจะเป็นส่วนหนึ่งของคู่มือการติดตั้ง

ฉันรู้ว่าต้องทำ

ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
    ssh target 'tar xzpf - -C /etc/squid/'

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

ฉันก็รู้ว่าฉันสามารถทำได้:

ssh -t source 'sudo cat /etc/squid/squid.conf'

วิธีนี้-tทำให้ sudo เพื่อขอรหัสผ่านของผู้ดูแลระบบก่อนที่จะส่งออกเนื้อหาของไฟล์

ปัญหาคือฉันไม่รู้วิธีรวมเทคนิคเหล่านั้นเป็นสิ่งที่จะขอรหัสผ่าน sudo บนเซิร์ฟเวอร์แต่ละเครื่องและถ่ายโอนไฟล์ไปยังปลายทาง เป็นไปได้ไหม

UPDATE : นี่คือสิ่งที่ดีที่สุดที่ฉันจะได้รับ:

ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
    ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
    'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'

การเรียกสิ่งนี้สายการบินเดียวดูเหมือนยืด ฉันคิดว่าฉันจะทำลายมันลงเพื่อแยกขั้นตอนในคู่มือการตั้งค่า


คำตอบ:


11

มันง่ายกว่าการเชน ssh ด้วย ssh มากกว่าเชน ssh กับ sudo ดังนั้นการเปลี่ยนการกำหนดค่าเซิร์ฟเวอร์ ssh ก็โอเคฉันขอแนะนำให้เปิด ssh สำหรับรูทของแต่ละเซิร์ฟเวอร์ แต่จาก localhost เท่านั้น คุณสามารถทำได้ด้วยMatchประโยคในsshd_config:

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

จากนั้นคุณสามารถตั้งค่าเชนการพิสูจน์ตัวตนแบบใช้คีย์จากผู้ใช้รีโมตไปยังผู้ใช้โลคัลและจากผู้ใช้โลคัลจนถึงรูท คุณยังคงมีหลักฐานการตรวจสอบเพื่อให้บันทึกของคุณบอกคุณที่เข้าสู่ระบบในฐานะที่เป็น root และขั้นตอนการรับรองความถูกต้องเป็นเช่นเดียวกับถ้า sudo มีส่วนเกี่ยวข้อง

ในการเชื่อมต่อกับเซิร์ฟเวอร์ในฐานะรูทให้กำหนดนามแฝง~/.ssh/configดังนี้:

Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"

หากคุณยืนยันที่จะใช้sudoฉันเชื่อว่าคุณจะต้องใช้คำสั่งแยกต่างหากตามที่sudoยืนยันในการอ่านจากเทอร์มินัล (แม้ว่าจะมีตั๋วสำหรับบัญชีของคุณ) ¹และไม่มีวิธีการคัดลอกไฟล์ตามปกติ (scp, sftp, rsync) รองรับการโต้ตอบกับเทอร์มินัลระยะไกล

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

ssh -t source 'sudo true'
ssh -t target 'sudo true'
ssh -t source 'sudo cat squid.conf' |
ssh -t target 'sudo tee /etc/squid/squid.conf'

¹ เว้นแต่คุณมีNOPASSWDแต่คุณจะไม่ถามสิ่งนี้


วิธีการแก้ปัญหาครั้งแรกที่ทำงานได้ดีสำหรับฉัน Match host localhostแต่บรรทัดที่สองที่ควรจะเป็น
cduck

4

คุณสามารถตั้งค่าsudoให้ไม่ถามรหัสผ่านในวิธีถัดไป:

บนแหล่งที่มา:

user    ALL=NOPASSWD:/bin/cat

ตามเป้าหมาย:

user    ALL=NOPASSWD:/usr/bin/tee

และทำบนเครื่อง yur:

ssh source 'sudo cat /test' | ssh target 'sudo tee /test'

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

PS อย่างไรก็ตามถ้าคุณตั้งค่าsudoให้ถามรหัสผ่านจากผู้ใช้สตริงที่มี[sudo] password for userจะปรากฏในไฟล์เป้าหมาย


+1 สำหรับการแนะนำหุ่นกระบอก แต่โซลูชันของคุณดูไม่ปลอดภัย ฉันอาจอนุญาตให้เข้าสู่ระบบในฐานะ root เช่นกัน
itsadok

2

แทนที่จะใช้ ssh คุณสามารถใช้ scp เพื่อถ่ายโอนไฟล์ระหว่างเซิร์ฟเวอร์

เข้าสู่เซิร์ฟเวอร์เป้าหมาย:

เปลี่ยนเป็น dir เป้าหมายที่คุณต้องการคัดลอกไฟล์

#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .

r - recursive p - รักษาเวลาการแก้ไขเวลาการเข้าถึงและโหมดจากไฟล์ต้นฉบับ


สิ่งนี้ถือว่าฉันสามารถเข้าสู่ระบบในฐานะรูทซึ่งฉันทำไม่ได้ กำลังอัปเดตคำถาม
itsadok

2

โดยไม่เปลี่ยนการกำหนดค่า ssh คุณสามารถสร้างสอง ssh tunnels host-> server1 และ server2-> โฮสต์ผ่านการเชื่อมต่อ ssh ไปยัง server2 เชื่อมต่ออุโมงค์ทั้งสองนี้บนเครื่องโฮสต์ (พอร์ตเดียวกัน) และเรียกใช้ sudo บน server2 เพื่อดึงข้อมูลจาก tunnels ที่เชื่อมต่อบน server1 และบันทึกไว้บน server2

ssh -L60000:${source}:22 -R60000:localhost:60000 -t ${target} 'sudo bash -c "ssh -p 60000 '$(whoami)'@localhost \"cd /path/to/dir; tar -czf - files\"|tar -C/path/to/target -xzf -"'

แนวคิดคือ: 1- เพื่อสร้างช่องสัญญาณโลคัลจากเครื่องของคุณไปยังเครื่องต้นทางบนพอร์ต 60000

ssh -L60000:${source}:22

1b- สร้างอุโมงค์ระยะไกลเพื่อกลับไปยังเครื่องของคุณ

-R60000:localhost:60000

2- เชื่อมต่อกับเครื่องเป้าหมาย

-t ${target}

3 - รันทั้งหมดเป็น root บนเครื่องเป้าหมายสำหรับการเขียน

'sudo bash -c "..."'

4- เชื่อมต่อกับเครื่องต้นทางผ่านอุโมงค์ whoami และ localhost หมายถึง localhost บนเครื่อง $ {target}

ssh -p 60000 '$(whoami)'@localhost

5- แพคเกจรีโมตไฟล์และส่งไฟล์ซิปไปยัง stdout

cd /path/to/dir; tar -czf - file

6- รับแพ็กเกจผ่าน stdout และแตกไฟล์ตามนั้นในไดเร็กทอรี / path / to / target

|tar -C/path/to/target -xzf -

หมายเหตุ: คุณอาจได้รับการยืนยัน 3 sshkey และขอรหัสผ่าน 3 ครั้ง แต่ไฟล์จะถูกคัดลอก

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