Мне нужно сделать это rsync
, ssh
и я хочу сделать это автоматически, без необходимости вводить пароль ssh
вручную.
Мне нужно сделать это rsync
, ssh
и я хочу сделать это автоматически, без необходимости вводить пароль ssh
вручную.
Ответы:
Вы должны использовать ключевой файл без парольной фразы для входа по ssh по сценарию. Очевидно, что это угроза безопасности, позаботьтесь о том, чтобы сам ключевой файл был должным образом защищен.
ssh -i
всегда должно быть возможно на стороне клиента. Вы имеете в виду, что сервер может поддерживать не все типы ключей (например, ECDSA)? Однако это не будет большой проблемой, это просто случай использования ssh-keygen -t
. Я что-то упускаю?
rsync -e
иssh -i
.
Используйте неинтерактивную утилиту поставщика паролей 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
sshpass -p`cat .password` ssh [...]
. Затем защитите свой .password
файл, chmod 400 .password
чтобы только ваш пользователь мог его прочитать.
src_path
должен быть server: path, например:server01.mydomain.local:/path/to/folder
-a
включение rsync включает -rlptgoD
, вы можете сократить команду следующим образом:rsync -az ...
Вы можете избежать запроса пароля по rsync
команде, установив в переменной среды RSYNC_PASSWORD
пароль, который вы хотите использовать, или используя --password-file
опцию.
Если вы не можете использовать открытый / закрытый ключи, вы можете использовать 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 своим паролем. Просто убедитесь, что этот файл надежно хранится!
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 --partial --progress --rsh = "ssh -i dsa_private_file" имя_хоста @ хост: / 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