เรียกใช้ rsync ด้วยการอนุญาตรูทบนเครื่องระยะไกล


30

ฉันต้องการซิงค์โฟลเดอร์จากเครื่องของฉันกับโฟลเดอร์บนเครื่องระยะไกล rootโฟลเดอร์ระยะไกลเท่านั้นที่สามารถจัดการโดย sudoฉันมีบัญชีบนเครื่องระยะไกลที่สามารถใช้ ฉันจะเรียกใช้ rsync ได้อย่างไรว่ามีสิทธิ์การใช้งานรูทบนเครื่องระยะไกล

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="sudo rsync"

แต่ (หลังจากป้อนรหัสผ่านของฉัน) ฉันได้รับข้อผิดพลาดต่อไปนี้:

sudo: no tty present and no askpass program specified

คุณไม่สามารถเปลี่ยนการอนุญาตในโฟลเดอร์ระยะไกลเพื่อให้ผู้ใช้ของคุณมีสิทธิ์เขียนเพื่อเข้าถึงได้หรือไม่?
ฟิล

1
น่าเสียดายที่ไม่ใช่ตัวเลือก
ปีเตอร์

มันเป็นเรื่องที่ดีมากในการตรวจสอบคำตอบในคำถามเดียวกันบน Unix SE unix.stackexchange.com/questions/92123/...
ndemou

คำตอบ:


12

ลองวิธีนี้ ในไฟล์ sudoers ของคุณ ( /etc/sudoers) ตั้งค่าผู้ใช้ของคุณเช่นนี้:

username ALL= NOPASSWD:/usr/bin/rsync

NOPASSWD:/usr/bin/rsyncบอกsudoว่าเมื่อผู้ใช้ของคุณทำงาน/usr/bin/rsyncหรือเพียงแค่rsyncว่ารหัสผ่านไม่จำเป็นต้องใช้

จากนั้นต้นฉบับของคุณ--rsync-path="sudo rsync"ควรใช้งานได้


ฉันใช้ตัวเลือก sudo rsync โดยไม่ตั้งค่าชื่อผู้ใช้ทั้งหมด ... หลังจาก rsync เสร็จสิ้น บนรีโมทเมื่อฉันพยายามที่จะ cd หรือ ls ฉันได้รับอนุญาตปฏิเสธ แม้ว่าฉันจะรูท ฉันต้อง sudo ถึง ls แต่ในกรณีของแผ่นซีดีมันเป็นไปไม่ได้ ฉันพยายามที่จะ chown ไดเรกทอรีและไฟล์ทั้งหมด ยังไม่ทำงาน ใครรู้เหตุผลและวิธีการแก้ไขหรือไม่
อัฒภาคหวั่น

2
คุณควรพูดถึงวิธีแก้ไขไฟล์ sudoers ด้วย
Jonathan

1
โปรดดูunix.stackexchange.com/a/92397/128237สำหรับผลกระทบด้านความปลอดภัยของการแก้ไขนี้
BrainStorm.exe

11

นี่คือวิธีแก้ปัญหาที่ฉันได้รับ:

rsync -R -avz -e ssh --rsync-path="echo mypassword | sudo -S  mkdir -p /remote/lovely/folder && sudo rsync" /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete

ภารกิจนิดหน่อย!


12
ฉันหวังว่าคุณจะจำรหัสผ่านของคุณได้ในบรรทัดคำสั่ง ควรจะปรากฏให้เห็นตามระยะเวลาที่ rsync กำลังทำงาน
BillThor

1
รหัสผ่านสามารถมองเห็นได้ที่ไหน? เพียงแค่ในกล่องท้องถิ่นในบรรทัดคำสั่ง? หรือวิธีการนี้สร้างช่องโหว่ระยะไกลด้วยหรือไม่ ฉันพยายามที่จะเข้าใจคำตอบข้างต้นและการใช้โซลูชันนี้ให้มีประโยชน์ ฉันถามคำถามที่นี่: superuser.com/questions/398146/…
MountainX

@MountainX มันจะปรากฏในรายการของกระบวนการ (เช่นps aux) การทดสอบ: แล้วเปิดสถานีในเครื่องจากระยะไกลและrsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/example ใช้เฉพาะเมื่อเป็นสิ่งแรกที่มาถึงใจของฉันด้วยระยะเวลาการดำเนินการที่มีขนาดใหญ่ ps aux | grep findfind /
Ivan Vučica

1
ฉันรู้ว่ามันเก่า แต่ถ้าคุณต้องการหลีกเลี่ยงรหัสผ่านในคำสั่งคุณสามารถใช้รหัสของ ssh และบนเครื่องระยะไกลเพิ่มผู้ใช้ของคุณไปยังไฟล์ sudoers ด้วยธง NOPASSWD: ALL ดูคำตอบอันดับสูงสุดได้ที่ลิงค์ต่อไปนี้ หมายเหตุ: มันไม่ใช่คำตอบที่ได้รับการยอมรับ: askubuntu.com/questions/147241/execute-sudo-without-password
เดฟ

10

วิธีการแก้ปัญหาในบล็อกนี้ทำงานได้ดีจริงๆสำหรับฉัน: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/

โดยทั่วไป:

stty -echo; ssh myUser@REMOTE_SERVER "sudo -v"; stty echo  
rsync -avze ssh --rsync-path='sudo rsync' myUser@REMOTE_SERVER:/REMOTE_PATH/ LOCAL_PATH 

บรรทัดแรกอนุญาตให้ป้อนรหัสผ่านแบบโต้ตอบโดยไม่แสดงรหัสผ่านบนหน้าจอ ใช้งานได้ดีสำหรับฉันบน Ubuntu 9.04


1
นี้ต้อง tty_tickets !tty_ticketsตัวเลือกที่จะไม่มีการตั้งค่า:
blueyed

2
วิธีการเกี่ยวกับssh -t [other options]แทนการเล่นด้วยstty -echo?
Ivan Vučica

ฉันเป็นกรณีของฉันฉันไม่ได้กำหนด: tty_ticketsอย่างไรก็ตาม ... ดังนั้นฉันอาจลองวิธีนี้
MountainX

1
sudo: no tty present and no askpass program specified
Michael

หนึ่งจะยกเลิกการตั้งค่า tty_tickets อย่างไร เครื่องไหน? ระหว่างคำสั่ง rsync นี้?
Jonathan

4

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

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

แก้ไข: ผมรวมสคริปต์เพื่อปุ่มติดตั้งสำหรับ loings ตามที่สำคัญในการสร้าง UserIDs ในส่วนลูกค้าของโพสต์ของฉันในการตั้งค่า BackupPC บน Linux ดูเอกสารประกอบสำหรับ ssh_config ซึ่งให้รายละเอียดบางอย่างที่คุณสามารถทำได้ด้วยการเรียกคืนการใช้คีย์ตามที่แสดงในสคริปต์


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

รายละเอียดใด ๆ เกี่ยวกับการเข้าสู่ระบบแบบคีย์เบท
TheVillageIdiot

3

บนเครื่องระยะไกล

sudo apt install ssh-askpass
which ssh-askpass

จากนั้นในเครื่องท้องถิ่น

rsync -av -e 'ssh -X' --rsync-path='SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass sudo -A rsync' /some/local/path user@remote:/some/remote/path

เส้นทางทดแทนเพื่อ ssh-askpass ด้วยเส้นทางที่เกิดขึ้นจริงบนเครื่องระยะไกล

แหล่งที่มา: http://unix.bris.ac.uk/2015/08/04/rsync-between-two-hosts-using-sudo-and-a-password-prompt/


2

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

  1. บนรีโมตโฮสต์ตรวจสอบให้แน่ใจว่า / etc / ssh / sshd_config มีบรรทัดนี้ "PermitRootLogin โดยไม่ใช้รหัสผ่าน" (ในการแจกแจงจำนวนมากจะมีตามค่าเริ่มต้น) สิ่งนี้อนุญาตให้รูทรับเชลล์ ssh โดยใช้วิธีการพิสูจน์ตัวตนใด ๆยกเว้นพรอมต์รหัสผ่านที่ไม่ปลอดภัย
  2. (ถ้าคุณยังไม่รู้วิธีการ) ให้ทำตามบทเรียนมากมายกับวิธีรับการเข้าสู่ระบบแบบไม่ใช้รหัสผ่านผ่าน ssh
  3. ใช้ rsync ตามปกติแล้วคุณจะต้องทำและไม่มีการถามรหัสผ่าน

อย่าลืมว่าตราบใดที่บรรทัดใน /root/.ssh/authorized_keys ของรีโมตโฮสต์นั้นมีเครื่องที่ยอมรับคำสั่งรูทจากพีซีของคุณ


rrsyncใช้วิธีการนี้
CODE-READ

0

นี่คือสิ่งที่ใช้งานได้สำหรับฉันโดยพิจารณาว่าฉันต้องการเก็บการรับรองความถูกต้องของรหัสผ่านไว้ (ดังนั้นฉันไม่ต้องการใช้NOPASSWDหรือปุ่ม) - บน Ubuntu 14.04:

  • "Open up" sudoบนเครื่องระยะไกลโดยการปิดการใช้งานtty_ticketsผ่านไฟล์ชั่วคราวใน/etc/sudoers.d/(ซึ่งควรได้รับการสนับสนุนใน Debian, ดู/etc/sudoers.d/README ) และ "อัปเดตข้อมูลประจำตัวที่แคชของผู้ใช้" ซึ่ง "ขยายเวลา sudo หมดเวลาอีก 15 นาที"
  • เรียกใช้rsyncด้วยsudoตามที่แสดงในคำตอบอื่น ๆ
  • "ปิด" sudoบนเครื่องระยะไกลโดยการลบไฟล์ชั่วคราว/etc/sudoers.d/ซึ่งเปิดใช้งานอีกครั้งtty_tickets

... หรือด้วยบรรทัดคำสั่ง:

ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'

เหล่านี้คือคำตอบที่ฉันได้รับเมื่อเรียกใช้คำสั่งเหล่านี้บนเครื่องโลคอล:

$ ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
[sudo] password for remoteuser: 
Defaults !tty_tickets
Connection to $REMOTEPC closed.

$ rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
remoteuser@$REMOTEPC's password: 
sending incremental file list
client.conf
           1269 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)

$ ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
removed ‘/etc/sudoers.d/temp’
[sudo] password for remoteuser: 
Connection to $REMOTEPC closed.

โปรดทราบว่าsudo -vควรรันหลังจากไฟล์แต่ละครั้ง/etc/sudoers.d/ดังนั้นยอมรับการเปลี่ยนแปลงในนั้น


0

วิธีอื่นคือการหลีกเลี่ยงข้อ จำกัด สิทธิ์โดยการเริ่มต้น rsync บนเครื่องระยะไกล แทน:

rsync /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder

คุณทำได้:

ssh ubuntu@x.x.x.x 'rsync ubuntu@y.y.y.y:/home/ubuntu/my/lovely/folder /remote/lovely/folder'

ที่อยู่y.y.y.yIP ของเครื่องท้องถิ่นของคุณอยู่ที่ไหน ใช้งานได้เฉพาะในกรณีที่เครื่องท้องถิ่นของคุณสามารถทำหน้าที่เป็นเซิร์ฟเวอร์ SSH


1
อืม ... คุณไม่ได้คัดลอกโลคัลไปที่รีโมตในบรรทัดคำสั่งแรกของคุณ - และจากนั้นในบรรทัดคำสั่งที่สองซึ่งควรจะเทียบเท่ากับอันแรกคัดลอกรีโมตไปยังโลคอล (ซึ่งไม่เท่ากับครั้งแรก)?
sdaau

อ๊ะ! ซ่อมมัน.
คี ธ

0

วิธีแก้ปัญหาของฉันคือการเพิ่ม --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

ตัวอย่าง:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="echo <PASSWORD> | sudo -Sv && sudo rsync"

โดยปกติแล้วไม่ใช่ความคิดที่ดีที่จะใส่รหัสผ่านลงในบรรทัดคำสั่งแบบหนึ่งบรรทัดเดียว พวกมันสามารถมองเห็นได้ในแผนผังกระบวนการตัวอย่างเช่น บางครั้งฉันแทนที่รหัสผ่านจริงในคำสั่งประเภทนี้ด้วย $ (cat my_password.txt) ซึ่งดีกว่าเล็กน้อย

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="cat my_password.txt | sudo -Sv && sudo rsync"


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