Як автоматично передавати пароль для команди rsync SSH?


111

Мені потрібно зробити з rsyncдопомогою sshі хочу зробити це автоматично , без необхідності проходження пароля sshвручну.

Відповіді:


44

Ви повинні використовувати ключ файлів без парольної фрази для скриптованих вхідних файлів ssh. Очевидно, це загроза безпеці, подбайте про те, щоб сам файл ключів був забезпечений належним чином.

Інструкція по налаштуванню доступу без паролів ssh


9
Немає можливості ввести пароль у тексті команди?
liysd

3
Непросто, немає варіантів для цього в ssh
Mad Scientist

Слід зазначити, що це не завжди можливо зробити (наприклад, багато реалізованих на сервері Android ssh-серверів досить обмежені).
Ponkadoodle

@Ponkadoodle ОП стосується запитів на стороні клієнта, а не на стороні сервера. ssh -iзавжди має бути можливим на стороні клієнта. Ви маєте на увазі, що сервер може підтримувати не всі типи ключів (наприклад, ECDSA)? Це не було б головним питанням, а лише випадком використання ssh-keygen -t. Я щось пропускаю?
Джонатан Н

1
Хоча це може здатися клопотом спочатку, це правильна відповідь. Паролі - це конфіденційна інформація, і їх не слід зберігати в чіткому вигляді або недбало використовувати в програмах. Саме для цього потрібні ключові файли; просто дізнайтеся про файли посвідчення rsync -eтаssh -i .
Джонатан Н

94

Використовуйте неінтерактивну утиліту постачальника паролів ssh

На Ubuntu

 sudo apt-get install sshpass

Команда для rsync

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

4
Я знаю, що це не найкраща практика, але в мене є NAS з калікою SSHD, яка не буде робити аутентифікацію на основі ключів. Ця відповідь була пропущеною частиною моєї головоломки автоматизованого резервного копіювання. Тож +1 за останню відповідь
Майк Госсманн

8
Якщо ви не можете використовувати файл_ключі, але не хочете , щоб включити пароль в команді, ви можете записати його в тимчасовий файл і включити його , як це: sshpass -p`cat .password` ssh [...]. Потім захистіть .passwordфайл, chmod 400 .passwordщоб переконатися, що його може читати лише ваш користувач.
Лутух

5
Для повноти, у випадку зшивання на віддалений сервер, src_pathповинен бути сервер: шлях, як так:server01.mydomain.local:/path/to/folder
harperville

це, безумовно, правильна відповідь! це дозволяє робити сценарії без ssh магії, просто сценарій. ;) Kudos @Rajendra
truefafa

1
Оскільки -aвключення rsync включає -rlptgoD, ви можете скоротити команду так:rsync -az ...
Jannie Theunissen

24

Ви можете уникнути запрошення пароля в rsyncкоманді, встановивши змінну середовища RSYNC_PASSWORDна пароль, який ви хочете використовувати, або використовуючи цю --password-fileопцію.


41
працює лише в тому випадку, якщо на сервері призначення працює демон rsync
Darryl Hebbes

4
Навіть незважаючи на те, що ця відповідь не допомагає, якщо не використати демон rsync, Google приземлив мене тут, і це було саме те, що мені потрібно. Для мене мені знадобився прямий rsync для rsyncd, без ssh. Я просто використовував параметр-файл пароля і прекрасно працював над сценарієм.
gregthegeek

14

Якщо ви не можете використовувати відкриті / приватні ключі, ви можете використовувати очікувати:

#!/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 та DEST на ваші звичайні параметри джерела та пункту призначення rsync та замінити PASS своїм паролем. Просто переконайтеся, що цей файл надійно зберігається!


3
ці команди не доступні в моємуRed Hat Enterprise Linux Server release 5.11 (Tikanga)
До

13

У мене це працює так:

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

що було remote_port_sshб встановлено? Це схоже на заповнювач для фактичного значення.
Макс Вільямс

6

Використовуйте ключ ssh.

Подивіться на ssh-keygenі ssh-copy-id.

Після цього ви можете використовувати rsyncтакий спосіб:

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

Якщо я використовую ключ із ssh, я пишу: ssh u @ serv -i ./rsa Але як це зробити в rsync?
liysd

2
Якщо ви введете ключ у свій .ssh каталог і дасте йому стандартне ім'я (як правило, id_rsa / id_rsa.pub), він автоматично підбере rsync.
Craig Trader

6

Ще одна цікава можливість:

  1. генерувати пара ключів RSA або DSA (як це було описано)
  2. поставити відкритий ключ для хосту (як уже було описано)
  3. запустити:
rsync - частковий - прогрес --rsh = "ssh -i dsa_private_file" host_name @ host: / home / me / d.

Примітка: -i dsa_private_file, який є вашим приватним ключем RSA / DSA

В основному такий підхід дуже схожий на той, який описав @Mad Scientist, однак вам не доведеться копіювати ваш приватний ключ до ~ / .ssh. Іншими словами, це корисно для спеціальних завдань (разовий доступ без пароля)


5

Наступні роботи для мене:

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

Довелося встановити sshpass


2
-a вже передбачає -rlptgoD і взагалі, було б набагато корисніше, щоб тут був зменшений командний рядок.
Крістіан

4

Автоматичне введення пароля для команди rsync важко. Моє просте рішення, щоб уникнути проблеми, - це встановити резервну копію папки. Потім використовуйте локальну команду rsync для резервного копіювання змонтованої папки.

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


2

Я використовую файл VBScript для цього на платформі Windows, він мене дуже добре сервери.

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

Офіційне рішення (та інші) були незавершеними, коли я вперше відвідав, тому я через роки повернувся, щоб опублікувати цей альтернативний підхід у випадку, якщо хто-небудь інший згорнувся тут, маючи намір використати публічну / приватну пару ключів:

Виконайте це з цільової резервної машини, яка тягне від джерела до цільового резервного копіювання

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

Виконайте це з вихідної машини, яка надсилає з джерела на цільове резервне копіювання

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

І якщо ви не використовуєте альтернативний порт для ssh, розгляньте нижче більш елегантні приклади:

Виконайте це з цільової резервної машини, яка тягне від джерела до цільового резервного копіювання:

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

Виконайте це з вихідної машини, яка надсилає з джерела на цільове резервне копіювання:

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

Якщо вам все-таки з’являється запит на введення пароля, вам потрібно перевірити вашу ssh-конфігурацію /etc/ssh/sshd_configі переконатися, що користувачі у вихідному і націленому на них мають відповідний відкритий ключ ssh, надсилаючи кожен із них ssh-copy-id user@10.9.9.3.

(Знову ж таки, це для використання ssh пар ключів без пароля, як альтернативний підхід, а не для передачі пароля через файл.)


І важливою стороною є зауваження, що в прикладі альтернативного порту ви спрямовуєте ssh на файл свого приватного ключа, і коли він виконує команду по мішені, він перевіряє автентифікацію на свій відкритий ключ.
oemb1905

-1

Після ідеї, опублікованої Ендрю Сіфордом, це робиться за допомогою sshfs:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.