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

111

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

liysd
источник
Самый простой способ запрашивать пароль pypass каждый раз, когда вы переносите или входите в систему ssh, - это создать ключ, вот как вы можете сделать это за 2 шага brightery.com/en/post/…
Мухаммад Эль-Саид

Ответы:

44

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

Инструкция по настройке беспарольного доступа по ssh

Злой ученый
источник
9
Нет возможности ввести пароль в текст команды?
liysd
3
Нелегко, в ssh нет опций
Mad Scientist
Следует отметить, что это не всегда возможно (например, многие реализации ssh-сервера для Android весьма ограничены).
Ponkadoodle
@Ponkadoodle OP - это запросы на стороне клиента, а не на стороне сервера. ssh -iвсегда должно быть возможно на стороне клиента. Вы имеете в виду, что сервер может поддерживать не все типы ключей (например, ECDSA)? Однако это не будет большой проблемой, это просто случай использования ssh-keygen -t. Я что-то упускаю?
Джонатан Х
1
Хотя поначалу это может показаться проблемой, это правильный ответ. Пароли являются конфиденциальной информацией, и их нельзя хранить в открытом виде или использовать в программах по неосторожности. Вот для чего нужны ключевые файлы; просто узнайте о файлах идентификации rsync -eиssh -i .
Джонатан Х
94

Используйте неинтерактивную утилиту поставщика паролей sshpass "sshpass"

На 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
Rajendra
источник
4
Я знаю, что это не лучшая практика, но у меня есть NAS с поврежденным SSHD, который не выполняет аутентификацию на основе ключей. Этот ответ был недостающей частью моей головоломки с автоматическим резервным копированием. Итак, +1 за ответ в крайнем случае
Майк Госсманн
8
Если вы не можете использовать файл_ключи, но не хотите , чтобы включить пароль в команде, вы можете записать его во временный файл и включить его , как это: sshpass -p`cat .password` ssh [...]. Затем защитите свой .passwordфайл, chmod 400 .passwordчтобы только ваш пользователь мог его прочитать.
lutuh
5
Для полноты, в случае ssh'ing на удаленный сервер, src_pathдолжен быть server: path, например:server01.mydomain.local:/path/to/folder
harperville
это определенно правильный ответ! это позволяет вам создавать сценарии без магии ssh, просто создавая сценарий. ;) Престижность @Rajendra
originalfafa
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
15

Если вы не можете использовать открытый / закрытый ключи, вы можете использовать expect:

#!/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 своим паролем. Просто убедитесь, что этот файл надежно хранится!

kainjow
источник
3
эти команды недоступны на моемRed Hat Enterprise Linux Server release 5.11 (Tikanga)
To Kra
13

У меня это работает так:

sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir  remote_user@remote_host:/remote_dir
andrey465
источник
что бы 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 --partial --progress --rsh = "ssh -i dsa_private_file" имя_хоста @ хост: / home / me / d.

Примечание: -i dsa_private_file, который является вашим закрытым ключом RSA / DSA

По сути, этот подход очень похож на тот, который описал @Mad Scientist, однако вам не нужно копировать свой закрытый ключ в ~ / .ssh. Другими словами, это полезно для специальных задач (одноразовый доступ без пароля)

xhudik
источник
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, и в целом было бы гораздо полезнее иметь здесь сокращенную командную строку.
Christian
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
Эндрю Сифорд
источник
3

Хотя вы уже реализовали это к настоящему времени,

вы также можете использовать любую ожидаемую реализацию (вы найдете альтернативы в Perl, Python: pexpect, paramiko и т. д.)

Жоао Фигейредо
источник
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}"
joseph.smeng
источник
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 ​​без пароля в качестве альтернативного подхода, а не для передачи пароля через файл.)

oemb1905
источник
И важное замечание: в примере с альтернативным портом вы направляете ssh в свой файл с закрытым ключом, и когда он выполняет команду на цели, он аутентифицируется по своему открытому ключу.
oemb1905 07
-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
Лепе
источник