Укажите файл идентификации (id_rsa) с помощью rsync

197

Мне нужно периодически создавать резервные копии каталога на удаленном сервере, который представляет собой виртуальную машину, размещенную в исследовательской организации. Они утверждают, что доступ к виртуальным машинам осуществляется через ключи ssh, и это хорошо, за исключением того, что я не могу понять, как указать rsync на ключ ssh для этого сервера.

Rsync не имеет проблем, если файл ключа есть ~/.ssh/id_rsa, но когда это что-то еще, я получаю Permission denied (publickey).

С помощью ssh я могу указать файл идентификации с помощью -i, но rsync, похоже, не имеет такой опции.

Я также попытался временно переместить ключ на локальном компьютере ~/.ssh/id_rsa, но это также не работает.

ТЛ; др

Можете ли вы указать идентификационный файл с помощью rsync?

Jangari
источник
1
Полезно также для выполнения sudo rsync, которое по какой-то причине не использует собственные ssh-ключи.
Иосиф
1
@ijoseph Точно, я использую rsync -aAP "sudo -u user ssh" user@server:dir local_dirпри синхронизации из сценариев cron, которые запускаются от имени root
Martin Pecka

Ответы:

342

Вы можете указать точную команду ssh с помощью опции -e:

rsync -Pav -e "ssh -i $HOME/.ssh/somekey" username@hostname:/from/dir/ /to/dir/

Многие пользователи ssh незнакомы с их файлом ~ / .ssh / config. Вы можете указать настройки по умолчанию для каждого хоста через файл конфигурации.

Host hostname
    User username
    IdentityFile ~/.ssh/somekey

В долгосрочной перспективе лучше всего изучить файл ~ / .ssh / config.

Дэн Гартвейт
источник
Мне не помогает иметь IdentityFile в ssh_config. Я могу "ssh web1" без проблем, но при использовании rsync для web1: ... происходит сбой с "Permission denied (publickey)".
Цитрак
1
Попробуйте включить многословность транспорта ssh: rsync -e 'ssh -vv' web1: / etc / issue / tmp / issue
Дэн Гартвейт,
1
Ах. Если вы автоматизируете это и не сможете ввести пароль, вам понадобится дополнительный пароль ssh без пароля, настроенный на обоих концах. Если вы хотите, чтобы rsync работал без пароля в интерактивном сеансе, вам нужно использовать ssh-agent.
Дэн Гартвейт,
16
Duuuuuuude! ~/.ssh/configфайл - вы открыли новую вселенную для меня!
Деманияк
2
~ / .ssh / config спас мне день, большое спасибо.
Смишра
17

Это можно сделать с помощью пользовательской конфигурации SSH, см. Http://www.cyberciti.biz/faq/create-ssh-config-file-on-linux-unix/, в основном, отредактируйте ~ / .ssh / config:

$ nano ~/.ssh/config
#Add Hosts below 
Host server1
HostName examplehost.com
User username
Port 22
IdentityFile /path/to/key

$ rsync -e ssh /home/user/directory user@remote.host.net:home/user/directory/

Это должно работать для любой программы, использующей SSH, rsync,

Cbaker510
источник
4

FYI:

1) Открытый ключ всегда находится в домашнем каталоге пользователя, вошедшего в систему на удаленном сервере, т.е. если вы входите в систему как «резервная копия», он находится в /home/backup/.ssh/authorized_keys. Идентификатор пользователя при входе определяет открытый ключ, используемый в месте назначения.

Вы можете выбрать идентификатор пользователя при установлении соединения двумя различными способами:

ssh user_id@destination.server
or
ssh -l user_id  destination_server     (<-- that is lower case "L")

С другой стороны, с вашей стороны закрытый ключ аналогичным образом находится в homedir пользователя, если вы не переопределите его, как описано в ответе Дэна.

2) Для целей резервного копирования может быть желательно создать ограниченный ключ, который может запускать только одну команду, например «rsync». Есть хорошее описание о том, что связано с резервным копированием «rsnapshot», которое позволяет удаленно создавать резервные копии всего сервера с использованием учетной записи непривилегированного пользователя и «sudo»:

"rsnapshot" Howto

Rsnapshot может легко создавать резервные копии нескольких удаленных или локальных серверов, что делает его удобным и централизованным резервным сервером.

ajaaskel
источник