Відповіді:
Ви повинні використовувати ключ файлів без парольної фрази для скриптованих вхідних файлів ssh. Очевидно, це загроза безпеці, подбайте про те, щоб сам файл ключів був забезпечений належним чином.
ssh -i
завжди має бути можливим на стороні клієнта. Ви маєте на увазі, що сервер може підтримувати не всі типи ключів (наприклад, ECDSA)? Це не було б головним питанням, а лише випадком використання ssh-keygen -t
. Я щось пропускаю?
rsync -e
таssh -i
.
Використовуйте неінтерактивну утиліту постачальника паролів 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
sshpass -p`cat .password` ssh [...]
. Потім захистіть .password
файл, chmod 400 .password
щоб переконатися, що його може читати лише ваш користувач.
src_path
повинен бути сервер: шлях, як так:server01.mydomain.local:/path/to/folder
-a
включення rsync включає -rlptgoD
, ви можете скоротити команду так:rsync -az ...
Ви можете уникнути запрошення пароля в rsync
команді, встановивши змінну середовища RSYNC_PASSWORD
на пароль, який ви хочете використовувати, або використовуючи цю --password-file
опцію.
Якщо ви не можете використовувати відкриті / приватні ключі, ви можете використовувати очікувати:
#!/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 своїм паролем. Просто переконайтеся, що цей файл надійно зберігається!
Red Hat Enterprise Linux Server release 5.11 (Tikanga)
У мене це працює так:
sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir remote_user@remote_host:/remote_dir
remote_port_ssh
б встановлено? Це схоже на заповнювач для фактичного значення.
Використовуйте ключ ssh.
Подивіться на ssh-keygen
і ssh-copy-id
.
Після цього ви можете використовувати rsync
такий спосіб:
rsync -a --stats --progress --delete /home/path server:path
Ще одна цікава можливість:
rsync - частковий - прогрес --rsh = "ssh -i dsa_private_file" host_name @ host: / home / me / d.
Примітка: -i dsa_private_file, який є вашим приватним ключем RSA / DSA
В основному такий підхід дуже схожий на той, який описав @Mad Scientist, однак вам не доведеться копіювати ваш приватний ключ до ~ / .ssh. Іншими словами, це корисно для спеціальних завдань (разовий доступ без пароля)
Наступні роботи для мене:
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
Автоматичне введення пароля для команди 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
Хоча ви це вже реалізували,
ви також можете використовувати будь-яку реалізацію очікування (ви знайдете альтернативи в Perl, Python: pexpect, paramiko тощо)
Я використовую файл 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}"
Офіційне рішення (та інші) були незавершеними, коли я вперше відвідав, тому я через роки повернувся, щоб опублікувати цей альтернативний підхід у випадку, якщо хто-небудь інший згорнувся тут, маючи намір використати публічну / приватну пару ключів:
Виконайте це з цільової резервної машини, яка тягне від джерела до цільового резервного копіювання
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 пар ключів без пароля, як альтернативний підхід, а не для передачі пароля через файл.)
Після ідеї, опублікованої Ендрю Сіфордом, це робиться за допомогою 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