Rsync SSH komutu için şifre otomatik olarak nasıl geçilir?


111

Yapmam gereken rsynctarafından sshve şifresini geçme ihtiyacı olmaksızın otomatik olarak yapmak istiyorum sshmanuel.


ssh'nizi her aktardığınızda veya oturum açtığınızda parola istemini geçmenin en kolay yolu bir anahtar oluşturmaktır, işte bunu 2 adımda nasıl yapabileceğiniz brightery.com/en/post/…
Muhammed El-Saeed

Yanıtlar:


44

Komut dosyası içeren ssh oturum açma işlemleri için parolası olmayan bir anahtar dosyası kullanmalısınız. Bu açıkça bir güvenlik riskidir, anahtar dosyanın kendisinin yeterince güvenli olmasına dikkat edin.

Şifresiz ssh erişimini kurma talimatları


9
Bir komut metnine şifre koyma imkanı yok mu?
liysd

3
Değil kolayca ssh'ın bunun için hiçbir seçenek yoktur
Mad Scientist

Bunun her zaman mümkün olmadığı unutulmamalıdır (örneğin, birçok android ssh sunucusu uygulaması oldukça sınırlıdır).
Ponkadoodle

@Ponkadoodle OP, sunucu tarafı değil, istemci tarafı istekleriyle ilgilidir. ssh -imüşteri tarafında her zaman mümkün olmalıdır. Sunucunun tüm anahtar türlerini desteklemeyebileceğini mi söylüyorsunuz (örn. ECDSA)? Bu büyük bir sorun olmayacak, sadece bir kullanım durumu ssh-keygen -t. Bir şey mi kaçırıyorum?
Jonathan H

1
Bu ilk başta bir güçlük gibi görünse de, bu doğru cevaptır. Şifreler hassas bilgilerdir ve bunlar açık bir şekilde saklanmamalı veya programlarda dikkatsizce kullanılmamalıdır. Anahtar dosyalar bunun için var; sadece kimlik dosyalarırsync -essh -i hakkında bilgi edinin ve .
Jonathan H

94

"Sshpass" etkileşimli olmayan ssh şifre sağlayıcı yardımcı programını kullanın

Ubuntu'da

 sudo apt-get install sshpass

Rsync komutu

 /usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p password ssh -o StrictHostKeyChecking=no -l username" src_path  dest_path

4
Bunun en iyi uygulama olmadığını biliyorum, ancak anahtar tabanlı kimlik doğrulama yapmayan sakat SSHD'li bir NAS'ım var. Bu cevap, otomatik yedekleme bulmacamın eksik parçasıydı. Son çare cevabı için +1
Mike Gossmann

8
Eğer bir keyfile kullanamazsınız, ancak komuta şifreyi dahil etmek istemiyorsanız, size geçici bir dosyaya yazmak ve böyle şunları içerebilir: sshpass -p`cat .password` ssh [...]. Ardından .passworddosyanızı chmod 400 .passwordyalnızca kullanıcınızın okuyabildiğinden emin olmak için koruyun .
lutuh

5
Tamlık için, uzak bir sunucuya ssh'ing yapılması durumunda, src_pathsunucu: yol olmalıdır, şöyle:server01.mydomain.local:/path/to/folder
harperville

bu kesinlikle doğru cevap! ssh sihri olmadan komut dosyası oluşturmanıza izin verir, sadece bir tane komut dosyası yazabilirsiniz. ;) Tebrikler @Rajendra
Genuinefafa

1
çünkü -arsync anahtarı içerir -rlptgoD:, böyle komutu kısaltabilirrsync -az ...
Jannie Theunissen

24

rsyncOrtam değişkenini RSYNC_PASSWORDkullanmak istediğiniz parolaya ayarlayarak veya --password-fileseçeneği kullanarak komutta parola istemini önleyebilirsiniz .


41
yalnızca hedef sunucuda çalışan rsync arka plan programı varsa çalışır
Darryl Hebbes

4
Bu cevap rsync daemon kullanmadıkça yardımcı olmamakla birlikte, Google beni buraya getirdi ve tam da ihtiyacım olan şeydi. Benim için, doğrudan rsync'den rsyncd'ye ihtiyacım vardı, ssh yok. Sadece şifre dosyası seçeneğini kullandım ve bir komut dosyası için mükemmel bir şekilde çalıştım.
gregthegeek

15

Genel / özel anahtar kullanamıyorsanız, şunları kullanabilirsiniz:

#!/usr/bin/expect
spawn rsync SRC DEST
expect "password:"
send "PASS\n"
expect eof
if [catch wait] {
    puts "rsync failed"
    exit 1
}
exit 0

SRC ve DEST'i normal rsync kaynak ve hedef parametrelerinizle değiştirmeniz ve PASS'ı şifrenizle değiştirmeniz gerekecektir. Sadece bu dosyanın güvenli bir şekilde saklandığından emin olun!


3
bu komutlar benimRed Hat Enterprise Linux Server release 5.11 (Tikanga)
To Kra 18'15

13

Bunun gibi çalışmasını sağladım:

sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir  remote_user@remote_host:/remote_dir

ne olacak remote_port_ssh? Gerçek bir değer için yer tutucu gibi görünür.
En Williams

6

Bir ssh anahtarı kullanın.

Bak ssh-keygenve ssh-copy-id.

Bundan sonra şu şekilde kullanabilirsiniz rsync:

rsync -a --stats --progress --delete /home/path server:path

Ssh ile key kullanırsam şunu yazarım: ssh u @ serv -i ./rsa Ama rsync'de nasıl yapılır?
liysd

2
Anahtarı .ssh dizininize koyarsanız ve ona standart bir ad verirseniz (tipik olarak id_rsa / id_rsa.pub), rsync tarafından otomatik olarak alınacaktır.
Craig Trader

6

Bir başka ilginç olasılık:

  1. RSA veya DSA anahtar çifti oluşturun (açıklandığı gibi)
  2. ana anahtarı ana bilgisayara koy (zaten açıklandığı gibi)
  3. Çalıştırmak:
rsync --partial --progress --rsh = "ssh -i dsa_private_file" host_name @ host: / home / me / d.

Not: RSA / DSA özel anahtarınız olan -i dsa_private_file

Temel olarak, bu yaklaşım @Mad Scientist tarafından tarif edilene çok benzer, ancak özel anahtarınızı ~ / .ssh dosyasına kopyalamanız gerekmez. Başka bir deyişle, anlık görevler için kullanışlıdır (bir seferlik şifresiz erişim)


5

Aşağıdakiler benim için çalışıyor:

SSHPASS='myPassword'
/usr/bin/rsync -a -r -p -o -g --progress --modify-window=1 --exclude /folderOne -s -u --rsh="/usr/bin/sshpass -p $SSHPASS ssh -o StrictHostKeyChecking=no -l root"  source-path  myDomain:dest-path  >&2

Yüklemek zorunda kaldım sshpass


2
-a zaten -rlptgoD anlamına gelir ve genel olarak, burada azaltılmış bir komut satırına sahip olmak çok daha yararlı olacaktır.
Christian

4

Rsync komutu için parolayı otomatik olarak girmek zordur. Sorundan kaçınmak için basit çözümüm, yedeklenecek klasörü bağlamak. Daha sonra bağlanan klasörü yedeklemek için yerel bir rsync komutu kullanın.

mount -t cifs //server/source/ /mnt/source-tmp -o username=Username,password=password
rsync -a /mnt/source-tmp /media/destination/
umount /mnt/source-tmp

3

Şimdiye kadar zaten uygulamış olsanız da,

herhangi bir beklenen uygulamayı da kullanabilirsiniz (Perl, Python'da alternatifler bulacaksınız: pexpect, paramiko, vb.)


2

Bunu Windows platformunda yapmak için bir VBScript dosyası kullanıyorum, bana çok iyi hizmet veriyor.

set shell = CreateObject("WScript.Shell")
shell.run"rsync -a Name@192.168.1.100:/Users/Name/Projects/test ."
WScript.Sleep 100
shell.SendKeys"Your_Password"
shell.SendKeys "{ENTER}"

2

Resmi çözüm (ve diğerleri) ilk ziyaret ettiğimde eksikti, bu yüzden yıllar sonra, herkese açık / özel bir anahtar çifti kullanmak niyetinde olan başkalarının buraya gelme ihtimaline karşı bu alternatif yaklaşımı göndermek için geri geldim:

Bunu, kaynaktan hedef yedeklemeye çeken hedef yedekleme makinesinden gerçekleştirin.

rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' user@10.9.9.3:/home/user/Server/ /home/keith/Server/

Bunu, kaynaktan hedef yedeklemeye gönderen kaynak makineden yürütün.

rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' /home/user/Server/ user@10.9.9.3:/home/user/Server/

Ve ssh için alternatif bir bağlantı noktası kullanmıyorsanız, aşağıdaki daha zarif örnekleri düşünün:

Bunu, kaynaktan hedef yedeklemeye çeken hedef yedekleme makinesinden yürütün:

sudo rsync -avi --delete user@10.9.9.3:/var/www/ /media/sdb1/backups/www/

Bunu, kaynaktan hedef yedeklemeye gönderen kaynak makineden yürütün:

sudo rsync -avi --delete /media/sdb1/backups/www/ user@10.9.9.3:/var/www/

Hala bir parola isteniyorsa, ssh yapılandırmanızı kontrol etmeniz /etc/ssh/sshd_configve kaynak ve hedefteki kullanıcıların her birinin diğerlerinin ilgili genel ssh anahtarına sahip olduğunu doğrulamanız gerekir ssh-copy-id user@10.9.9.3.

(Yine bu, ssh anahtar çiftlerini şifresiz, alternatif bir yaklaşım olarak kullanmak içindir ve şifreyi bir dosya aracılığıyla geçirmek için değildir .)


Ve önemli bir yan not, alternatif bağlantı noktası örneğinde, ssh'yi özel anahtar dosyanıza yönlendiriyorsunuz ve komutu hedefte çalıştırdığında, açık anahtarına karşı kimlik doğrulaması yapacaktır.
oemb1905

-1

Andrew Seaford tarafından yayınlanan fikrin ardından, bu sshfs kullanılarak yapılır:

echo "SuperHardToGuessPass:P" | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com:/mypath/ /mnt/source-tmp/ -o workaround=rename -o password_stdin
rsync -a /mnt/source-tmp/ /media/destination/
umount /mnt/source-tmp
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.