Uzak makinede rsync'i root izniyle çalıştırın


31

Makinemdeki bir klasörü uzak makinedeki bir klasörle senkronize etmek istiyorum. Uzak klasör sadece tarafından manipüle edilebilir root. Uzak makinede kullanabileceğim bir hesabım var sudo. Uzak makinede kök izinlerine sahip olacak şekilde rsync'i nasıl çalıştırabilirim?

Aşağıdakileri denedim:

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

Ancak (şifremi girdikten sonra) aşağıdaki hatayı alıyorum:

sudo: no tty present and no askpass program specified

Uzak klasördeki izinleri değiştiremezsiniz, böylece kullanıcınız buna erişebilir.
Phil

1
Ne yazık ki bu bir seçenek değil.
Peter,

Unix SE unix.stackexchange.com/questions/92123/… de aynı soruya verilen cevabı kontrol etmek çok daha iyidir .
ndemou

Yanıtlar:


12

Bu çözümü dene. Sudoers dosyanızda ( /etc/sudoers) kullanıcınızı şöyle ayarlayın:

username ALL= NOPASSWD:/usr/bin/rsync

NOPASSWD:/usr/bin/rsyncsöyler sudokullanıcı çalıştırdığında o /usr/bin/rsyncya da sadece rsyncşifre gerekli olduğunu.

O zaman orjinalin --rsync-path="sudo rsync"işe yaramalı.


Rsync yapıldıktan sonra ALL ... adını ayarlamadan sudo rsync seçeneğini kullandım. uzaktan kumandada cd veya ls kullanmaya çalıştığımda. İzin verilmedi. ben kök olmama rağmen ls 'e sudo yapmak zorundayım. ancak cd durumunda bile mümkün değildir. Tüm dizinleri ve dosyaları kesmeye çalıştım. hala işe yaramadı. nedenini ve nasıl düzeltileceğini bilen var mı?
Dreaded noktalı virgül

2
sudoers dosyasını nasıl düzenleyeceğinizi de söylemelisiniz
Jonathan

2
Bu düzeltmenin güvenlikle ilgili etkileri için lütfen unix.stackexchange.com/a/92397/128237 adresine bakın .
BrainStorm.exe

11

Karşılaştığım çözüm bu:

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

Görevin bir parçası!


12
Umarım şifrenizi komut satırında göreceksinizdir. Rsync'in çalıştığı süre boyunca görünür olmalıdır.
BillThor

1
şifre nerede görünür? Sadece komut satırındaki yerel kutuda? Yoksa bu yaklaşım aynı zamanda uzak güvenlik açıkları da yaratıyor mu? Yukarıdaki cevabı ve bu çözümü kullanmanın sonuçlarını anlamaya çalışıyorum. Burada bir soru sordum: superuser.com/questions/398146/…
MountainX

@MountainX İşlemler listesinde görülebilir (ör. ps aux). Test:, rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/exampleardından uzak makinedeki terminali açın ve ps aux | grep find. find /sadece büyük yürütme süresi ile aklıma gelen ilk şey olarak kullanılır.
Ivan Vučica

1
Bunun eski olduğunu biliyorum, ancak komuttaki şifreden kaçınmak istiyorsanız, ssh için tuşlarını kullanabilirsiniz ve uzaktaki makinede, kullanıcılarınızı NOPASSWD: ALL bayrağıyla sudoers dosyasına ekleyin. Aşağıdaki bağlantıdaki en yüksek dereceli cevaba bakınız. NOT: Kabul edilen cevap bu değildir: askubuntu.com/questions/147241/execute-sudo-without-password
Dave

10

Bu blogdaki çözüm benim için gerçekten işe yaradı: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .

Temelde:

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

İlk satır, şifreyi ekranda göstermeden etkileşimli şifre girişi sağlar. Ubuntu 9.04'te benim için harika çalışıyor.


1
Bu Yokedilecek tty_tickets seçeneği gerektirir: !tty_tickets.
13'te 13

2
Ya ssh -t [other options]oynamak yerine stty -echo?
Ivan Vučica

Ben benim durumumda çoktan belirledim: tty_ticketsneyse ... bu yüzden bu yaklaşımı deneyebilirim.
MountainX

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

Kişi nasıl tty_tickets ayarlayamaz? Hangi makinede? Bu rsync komutu sırasında?
Jonathan

4

Şifreyi sağlamak için bir yönteme ihtiyacınız var sudo. askpassNormal mekanizmaların mevcut olmadığı durumlarda şifre istemek için bir program tasarlanmıştır. Kullanıcı adınız olarak sudoçalışacak bir şifre gerektirmemesini ayarlamak rsyncbir seçenektir.

Normalde bu gibi durumlar için anahtar tabanlı giriş bilgilerini uygun kısıtlamalar ile yapılandırıyorum. Yalnızca rsyncroot olarak çalışan kısıtlı bir anahtar konfigüre ederseniz, bu tür şeylerin yapılması daha kolay hale gelir. Başka bir alternatif rsycnduzak istekleri işlemek için bir işlem kullanmaktır . Yapılandırma uygulanabilecek çeşitli kısıtlamalar sağlar.

DÜZENLEME: benim yazının Müşteriler bölümündeki oluşturma userids anahtar tabanlı loings kurulum anahtarları için bir komut dosyası dahil Linux üzerinde Backuppc kurma . Ayrıca, komut dosyasında gösterildiği gibi, anahtar kullanım kısıtlamasıyla yapabileceğiniz bazı şeyleri ayrıntılarıyla ayrıntılandıran ssh_config belgesine bakın.


Yardımınız için teşekkürler, ama benim için daha iyi bir çözüm buldum.
Peter

keybased girişi hakkında herhangi bir detay var mı?
TheVillageIdiot


2

Mevcut cevapların karmaşıklığına hayran kaldım. Bu var uzakta bir şifre kullanmadan uzak ana bilgisayara root olarak bağlanabilmek sistemlerinizi (PC ve uzak ana) yapılandırmak kolay ve kullanışlı. Ve görünüşünden farklı olarak bu da güvenli .

  1. Uzaktaki ana bilgisayarda / etc / ssh / sshd_config dosyasının "PermitRootLogin şifresiz" satırına sahip olduğundan emin olun (birçok dağıtımda varsayılan olarak burada bulunur). Bu , güvensiz güvensiz parola istemi dışında herhangi bir kimlik doğrulama yöntemini kullanarak kökün bir ssh kabuğu almasını sağlar .
  2. (Zaten nasıl olduğunu bilmiyorsanız) ssh ile şifresiz giriş yapma konusunda birçok öğreticiden herhangi birini takip edin
  3. Normalde yaptığınız gibi ve herhangi bir şifre sormadan rsync kullanın.

Unutmayın, uzaktaki ana makinenin /root/.ssh/authorized_keys içindeki satır orada olduğu sürece, makine PC'nizden kök komutları kabul eder.


rrsync bu yaklaşımı kullanır.
KOD-READ

0

NOPASSWDUbuntu 14.04'te parola doğrulamayı korumak istediğimi düşünerek (kullanmak veya anahtar istemiyorum ):

  • sudoUzak makinede " Debian'da desteklenmesi gerekiyor, bkz. " Adlı tty_ticketsgeçici bir dosyayı devre dışı bırakarak "Aç" ve "sudo zaman aşımını 15 dakika daha uzatan" kullanıcının önbelleğe alınmış kimlik bilgilerini güncelle "/etc/sudoers.d//etc/sudoers.d/README
  • Run rsyncile sudodiğer yanıtlar gösterildiği gibi
  • Yeniden etkinleştiren sudogeçici dosyayı kaldırarak uzaktaki makinede "Kapat"/etc/sudoers.d/tty_tickets

... veya komut satırları ile:

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'

Bu komutları yerel makinede çalıştırırken aldığım yanıtlar:

$ 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.

Not sudo -vher zaman dosyaları oluşturulduktan sonra koştu olmalıdır /etc/sudoers.d/buradaki değişiklikler kabul edilir, böylece.


0

Diğer bir yöntem ise uzak makinede rsync'i başlatarak izin kısıtlamalarını aşmaktır. Yerine:

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

Yapabilirsin:

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

y.y.y.yYerel makinenizin IP adresi nerede . Bu, yalnızca yerel makineniz bir SSH sunucusu olarak görev yapabilirse çalışır.


1
Hm ... ilk komut satırınızda yerelden uzaktan kumandaya kopyalama yapmıyorsunuz - ve sonra ikinci komut satırında, birincisine eşdeğer olması gereken, uzaktaki yerellere kopyalama (ilkine eşdeğer olmayan)?
sdaau

Tüh! Onu düzeltti.
Keith

0

Benim çalışma ortamım eklemek --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

örnek:

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"

Şifreleri tek satırlık komut satırına koymak genellikle iyi bir fikir değildir; Örneğin, işlem ağacında görünür hale gelirler. Bazen bu ifadedeki gerçek şifreyi biraz daha iyi olan $ (cat my_password.txt) ile değiştiriyorum.

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"


Bu konuyu küçük bir bağlam ve açıklama ile genişletebilir misiniz? Neye "ekle", nerede? Bu neden sorunu çözüyor? Teşekkürler.
fixer1234
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.