Я часто делаю резервные копии на локальный диск, который хочу ежедневно синхронизировать с удаленным сервером.
Целевой сервер настроен только для доступа по ключу SSH (без пароля). Так как мой основной SSH-ключ для этого сервера защищен парольной фразой, я создал второй SSH-ключ (не защищенный парольной фразой) + пользователь, который будет использоваться для автоматического резервного копирования - таким образом, мне не нужно присутствовать, чтобы вводить мою парольную фразу при запуске cron ,
Я использую cron и rsync, и все команды работают по отдельности, но не срабатывают при объединении.
Самое дальнее, что у меня есть, пока идет поиск неисправностей
env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/"
который возвращает ошибку
Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]
Любые советы о том, как решить эту проблему дальше?
Вот что я пробовал до сих пор, и у меня нет идей:
- Крон определенно бежит
ps aux | grep cron
Ничего необычного в / var / log / syslog
Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)
SSH в терминале к удаленному серверу в качестве резервного пользователя
ssh backups-user@XX.XX.XX.XX
- Запуск команды в Терминале работает отлично
rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/
Указание пути к пользовательскому ключу резервного копирования вручную не имеет никакого эффекта
rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/
Замена неработающей команды простой тестовой командой работает
echo "Hello world" > ~/Desktop/test.txt
Крики / ругательства на компьютере не имели никакого эффекта (но я временно почувствовал себя лучше).
Изменить 1:
Вот мой файл crontab и скрипт, который он вызывает.
...
# m h dom mon dow command
MAILTO=""
* * * * * sh /home/tom/Documents/Scripts/offsite-backup
и
#!/bin/bash
rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/
Изменить 2:
Просто для пояснения, /var/log/auth.log
на целевом сервере есть строка. Sep 11 08:23:01 <hostname> CRON[24421]: pam_unix(cron:session): session closed for user root
Это сбивает с толку, потому что я больше не запускаю cron каждую минуту локально, но новая запись по-прежнему появляется каждую минуту в журналах сервера. Файлы Crontab для всех пользователей (включая root) на сервере пусты и ничего не делают.
Кроме того, пользователь «только резервные копии» был создан только на сервере и с ограниченными правами, с выделенным ключом SSH, скопированным на мой настольный компьютер. Я предполагаю, что это путь, потому что все работает при запуске команд вручную.
Выложенный выше файл crontab предназначен для меня, пользователь 'tom' на моем настольном компьютере. Я хочу, чтобы он вызывал скрипт, который должен входить на сервер как пользователь «только для резервного копирования». Я просто попытался запустить скрипт резервного копирования (а не команду внутри него), и он успешно подключился и работал. Я запустил его на своем рабочем столе как пользователь 'Tom', тот же самый пользователь, который создал работу cron, которая не будет работать. Вот вывод из журнала сервера, соответствующий этому успешному входу в систему
Sep 11 08:35:31 <hostname> sshd[25071]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 11 08:35:32 <hostname> sshd[25071]: Accepted publickey for backups-only from <desktop IP> port 54242 ssh2: RSA e2:e6:07:27:c1:continues...
Sep 11 08:35:32 <hostname> sshd[25071]: pam_unix(sshd:session): session opened for user backups-only by (uid=0)
Sep 11 08:35:32 <hostname> systemd-logind[638]: New session 12 of user backups-only.
Sep 11 08:36:00 <hostname> sshd[25133]: Received disconnect from <desktop IP>: 11: disconnected by user
Sep 11 08:36:00 <hostname> sshd[25071]: pam_unix(sshd:session): session closed for user backups-only
Sep 7 14:45:01 <hostname> CRON[18716]: pam_unix(cron:session): session closed for user root
Sep 7 16:06:02 <hostname> sshd[6747]...
. Вы на 100% уверены, что это логлин с сервера и что это правильная строка? Вы разместили crontab только для резервных копий ? Кроме того, попробуйте добавить файл идентификации вручную:rsync .... -e 'ssh -i /home/user/.ssh/identity' ...
auth.log
, размещенная в разделе «Правка 2», предназначена для работы cron на сервере и не должна иметь ничего общего с вашими попытками входа в систему. Можете ли вы попробоватьtail -f /var/log/auth.log
на сервере, пока вы пытаетесь запустить скрипт через cron? Кроме того, я не уверен, что это сработает, но можете ли вы попробовать свою первуюenv
команду с помощью,rsync .... -e 'ssh -vvv -i /home/user/.ssh/identity ...
чтобы увидеть, если она выдаст больше ошибок?Ответы:
Поскольку все работает нормально из командной строки, ошибка
Permission denied (publickey)
означает, что часть SSHrsync
использует файл идентификации, отличный от указанного имени пользователя.Из комментария Яна к исходному вопросу мы можем указать файл идентификации в
rsync
команде, используя-e 'ssh -i /path/to/identity.file' ...
.Использование приведенной ниже команды для запуска новой среды в cron и указание полного пути к файлу, по-видимому, решает проблему:
Я все еще очень заинтересован в этом открытии. Вероятно, это связано с cron, тем, что он начинается с минимальных переменных среды, и с ssh-agent. Я создам тот же сценарий через пару дней, чтобы проверить его и доложить.
источник
env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /path/to/identity.file' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/"
Я только что решил эту проблему, которая держала меня занятым ..
Невозможно соединиться в RSYNC через SSH, несмотря на то, что указана идентификационная информация для SSH ... Ничего не сделано ... Rsync говорит "отказано в разрешении" и ssh сообщает мне "read_passphrase: не удается открыть / dev / tty: нет устройства или адреса этот тип"
Но я прочитал пост, в котором объясняется, что у crontab есть свое собственное окружение, отличное от root. Я уже знал это, но я не понимал, какое влияние это может оказать на SSH при использовании SSH-AGENT.
Но мой обмен ключами SSH выполняется с помощью PassPhrase ... поэтому, если среда отличается, и мой RSYNC через SSH ожидает парольную фразу, которая не может быть введена => Информация отладки SSH также указывает на ошибку:
На моей машине я использую «связку ключей» для запуска агента SSH, поэтому мне не нужно повторно вводить фразу-пароль каждый раз, когда я пытаюсь выполнить удаленное соединение. Цепочка для ключей генерирует файл, который содержит следующую информацию
==> Команда SSH-AGENT возвращает ту же информацию.
Итак, в конце концов, именно эта информация, относящаяся к текущему сеансу, позволяет в будущем выполнять аутентификацию текущего сеанса без необходимости вводить фразу-пароль, потому что это уже сделано ранее и запомнено ...
==> Решение есть ... этого достаточно в скрипте, запущенном crontab, и "найти" файл, содержащий эту информацию, или сделать это в командной строке ds crontab ...
=> С этим источником, больше не беспокойтесь. Информация о SSH_AUTH_SOCK и SSH_AGENT_PID загружается в среде Crontab и поэтому известна, RSYNC через SSH работает без каких-либо проблем.
Это занимало меня, но теперь это работает :)
источник
Предостережение для тех, кто использует SSH Agent Forwarding:
Если вы видите такое поведение при отладке скрипта на удаленном хосте, это потому, что даже с
-e "ssh -i /path/to/key"
флагом ssh будет использовать ваш локальный (переадресованный) ключ, а не ключ на сервере.Конкретный пример: у меня есть скрипт на сервере dev, который извлекает данные с «сервера данных», используя rsync через ssh. Когда я захожу на сервер dev и запускаю его, все хорошо, но при запуске из cron я получаю отказано в разрешении. Добавляя некоторую многословность процессу SSH (флаг
-vv
), я заметил следующее:Что меня здесь прояснило, так это то, что по чистой случайности у меня на локальном хосте другое имя пользователя («спокойное»), чем на сервере dev («juanr»).
Обратите внимание на то, как он помечает ключ на сервере dev как «явный», но все еще использует переадресованный ключ с моего ноутбука для входа в систему. Выполнение
ssh-copy-id
в этот момент ничего не решает, поскольку он просто переустанавливает переадресованный ключ, а не тот из dev сервер. Если вы используете SSH-копии идентификатор с пересылкой агента, вам нужно указать , какой ключ для установки с флагом -i:ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
.источник
Вы уже попробовали старый трюк очистки файлов hosts? Я имею в виду:
Стоит попробовать, так как ssh перестроит его, и вы избавитесь от устаревших вещей. Конечно, вы также можете удалить части, принадлежащие данному IP / хосту.
Дополнительные вопросы: ваша задача cron выполняется под вашим UID или она работает как пользователь cron или root?
источник
~/.ssh/known_hosts
могло бы что-то изменить? И cron запускается как мой пользователь 'tom' на рабочем столе с намерением войти на сервер как пользователь 'только для резервного копирования' с соответствующим (без пароля) ключом SSH, который есть у пользователя tom~/.ssh
.-r
ни-f
флаг, ни флаг -known_hosts
это обычный файл (не каталог), и он не доступен только для чтения.rm .ssh/known-hosts
было бы значительно безопаснее, учитывая, что односимвольная опечатка - случайное добавление пробела между.
иssh/known_hosts
послеrm -rf
(илиrm -r
) обычно удаляло бы все содержимое домашней папки пользователя!Используйте
rrsync
скрипт вместе с выделенным ключом ssh следующим образом:Удаленный сервер
ЛОКАЛЬНЫЙ компьютер
УДАЛЕННЫЙ компьютер
Добавьте к новой добавленной строке следующее
Так что результат выглядит
МЕСТНЫЙ
Вставьте в ваш
crontab
следующий скрипт сx
разрешения:Источник: http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/
источник
Чтобы попытаться отладить, добавьте в ssh часть "ssh -v" таким образом, вы можете получить подробный режим с некоторой полезной информацией.
Изменить: со страницы руководства:
источник
Я думаю, что вы не настроили файл sshd_config должным образом. Проверьте это
PermitRootLogin yes
иPubkeyAuthentication yes
для дистанционного обслуживания.источник
PermitRootLogin
включил и не планирую изменить это. Лучше всего отключить его и использовать ssh только как обычный пользователь (добавьте их в свои «sudoers», если необходимо), а не как root.