Чому ця робота rsync + ssh cron дає мені помилки "Дозволено відмовлено (publickey)"?


20

Я роблю резервні копії на локальному диску, який я хочу щодня синхронізувати на віддалений сервер.

Цільовий сервер налаштований лише для доступу до ключа 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]

Будь-які поради, як вирішити цю проблему далі?


Ось що я спробував поки що, і мені не до думок:

  1. Cron напевно працює ps aux | grep cron
  2. Нічого незвичайного в / var / log / syslog Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)

  3. SSH в терміналі на віддалений сервер, як працює резервний користувач ssh backups-user@XX.XX.XX.XX

  4. Запуск команди в терміналі працює відмінно rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/
  5. Вручну вказівка ​​шляху до ключа резервного копіювання користувача не впливає 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/

  6. Заміна непрацюючої команди простою тестовою командою працює echo "Hello world" > ~/Desktop/test.txt

  7. Кричати / лаятися за комп’ютером не мали ефекту (але мені тимчасово стало краще).


Редагувати 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Це заплутано, оскільки я більше не щоденно виконую крон локально, але новий запис все одно з’являється щохвилини в журналах сервера. Файли 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

Якщо 3. працює з використанням файлу ключів, а 6. працює також, то ... помилка ... що говорить логічний файл sshd на приймальному кінці?
січня

@Jan I getSep 7 14:45:01 <hostname> CRON[18716]: pam_unix(cron:session): session closed for user root
Tom Brossman

Це або неправильна лінія журналу, або користувач, який намагається підключитися через ssh, є root ... Або це з машини, яка ініціює створення резервних копій?
січня

1
Том, 2 питання, щоб переконатися. У першому коментарі у логотипу є CRON [...], але він повинен виглядати так Sep 7 16:06:02 <hostname> sshd[6747].... Ви на 100% впевнені, що цей логін із сервера і що це правильний рядок? Crontab, який ви опублікували, - це лише копія резервного копіювання ? Також спробуйте додати файл посвідчення вручну:rsync .... -e 'ssh -i /home/user/.ssh/identity' ...
січня

1
Крім того, цей рядок, який auth.logви розмістили в редакції 2, призначений для запуску хронів на сервері, і не повинен мати нічого спільного з вашими спробами входу. Чи можете ви спробувати tail -f /var/log/auth.logна сервері, коли ви намагаєтеся запустити скрипт через cron? Крім того, я не впевнений, чи спрацювало б це, але чи можете ви спробувати свою першу envкоманду, rsync .... -e 'ssh -vvv -i /home/user/.ssh/identity ...щоб побачити, чи виправляє вона більше помилок?
Алаа Алі

Відповіді:


15

Оскільки в командному рядку все працює добре, помилка Permission denied (publickey)означає, що частина SSH rsyncвикористовує інший ідентифікаційний файл, ніж вказане ім'я користувача.

З коментаря Яна до оригінального питання, ми можемо вказати файл ідентичності в rsyncкоманді за допомогою -e 'ssh -i /path/to/identity.file' ....

Використання наведеної нижче команди для початку зі свіжого середовища в cron та визначення повного шляху до файлу, очевидно, вирішує проблему:

env -i sh -c "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/"

Мене все ще дуже цікавить ця знахідка. Це, мабуть, має відношення до cron, того факту, що він починається з мінімальних змінних умов середовища та ssh-агента. Я буду встановлювати той самий сценарій через пару днів, щоб перевірити його та звітувати.


1
Ви маєте на увазі, що ви бігли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/"
qazwsx

@ Проблеманія, яка виправлена.
Алаа Алі

Я бачу, що у вас є відповідь, але мені цікаво, ви використовуєте "sudo crontab -e", що є кореневим кроном. Що станеться, якщо ви "crontab -e" під час входу в систему як "резервний" користувач.
wlraider70

Я думаю, ти це мав на увазі для людини, яка поставила запитання. Але він використовував crontab свого імені користувача, а не root, і я думаю, що він не хотів використовувати crontab резервного користувача.
Алаа Алі

коли я запускаю подібний сценарій зі своїм користувачем, він бере ключ ssh через X11, тому мені потрібна була локальна копія, якщо ключ, і переконайтесь, що цей файл має правильних власників та права, у поєднанні з вищезгаданим добре працював для мене.
Сверре

1

Я щойно вирішив цю проблему, яка мене зайняла ..

Неможливо підключитися в RSYNC через SSH, не дивлячись на те, що встановлено особу для SSH ... Нічого не робиться ... Rsync каже "дозвіл відхилено", а ssh повідомляє мені "read_passphrase: не можна відкрити / dev / tty: Немає пристрою чи адреси цей тип "

Але я прочитав пост, який пояснив, що у crontab є своє середовище, яке не є коренем. Я вже це знав, але не розумів, який вплив він може мати на SSH при використанні SSH-AGENT

Але мій обмін ключами SSH проводиться за допомогою PassPhrase ... тому, якщо середовище інше, і мій RSYNC через SSH очікує парольну фразу, яку неможливо ввести => Інформація про налагодження SSH також вказує на помилку:

"debug1: read_passphrase: не можна відкрити / dev / tty: Немає такого пристрою чи адреси" => Ну так ні ні TTY = немає парольної фрази = не дозволено

На своїй машині я використовую "Keychain" для запуску агента SSH, тому мені не доведеться повторно вводити парольну фразу кожен раз, коли я пробую віддалене з'єднання. Keychain створює файл, який містить таку інформацію

SSH_AUTH_SOCK = /tmp/ssh-PWg3yHAARGmP/agent.18891; експорт SSH_AUTH_SOCK; SSH_AGENT_PID = 18893; експорт SSH_AGENT_PID;

==> Команда SSH-AGENT повертає ту саму інформацію.

Отже, врешті-решт, саме ця інформація, пов’язана з поточним сеансом, дозволяє в майбутньому аутентифікувати поточний сеанс, без необхідності вводити пароль, оскільки це вже було зроблено раніше і запам'ятовується ...

==> Рішення є ... достатньо в сценарії, запущеному crontab, і "джерелом" файлу, що містить цю інформацію, або робити це в командному рядку ds crontab ...

приклад: 14 09 * * *. /home/foo/.keychain/foo.serveur.org-sh && scp -vvv -P 22 /tmp/mon_fic/toto.sh foo@my-server.fr:. >> / var / log / check_connexion.log 2> & 1 або скористайтеся командою "source /home/foo/keychain/foo.server.org-sh" у сценарії, який починає з'єднання за допомогою SSH.

=> З цим джерелом більше не хвилюйтеся. Інформація SSH_AUTH_SOCK та SSH_AGENT_PID завантажується в середовище Crontab і тому відома, RSYNC через SSH працює без жодних проблем.

Це мене зайняло, але зараз це працює :)


1

Застереження для тих, хто використовує SSH-агент для пересилання:

Якщо ви бачите таку поведінку під час налагодження сценарію на віддаленому хості, це тому, що навіть із -e "ssh -i /path/to/key"прапором, ssh використовуватиме ваш локальний (перенаправлений) ключ, а не той, який знаходиться на сервері.

Конкретний приклад: у мене на сервері розробок є скрипт, який перетягує дані з "сервера даних", використовуючи rsync через ssh. Коли я заходжу на сервер розробників і запускаю його, все добре, але коли я запускаю з cron, мені отримують відмову в дозволі. Додаючи деяку багатослівність до процесу SSH (прапор -vv), я помітив наступне:

debug2: key: /home/nighty/.ssh/id_rsa (0x562d8b974820),
debug2: key: /home/juanr/.ssh/id_rsa (0x562d8b962930), explicit
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/nighty/.ssh/id_rsa
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug2: input_userauth_pk_ok: fp 1a:19:08:9f:80:16:b1:db:55:42:9a:52:b2:49:9b:0a
debug1: Authentication succeeded (publickey).

Що мене змусило тут - це те, що я випадково маю інше ім'я користувача на локальному хості ("нічний"), ніж на сервісі розробників ("juanr").

Зверніть увагу, як він позначає ключ на сервері розробників як "явний", але все ж використовує пересланий ключ з мого ноутбука для входу в систему. Виконання ssh-copy-idв цей момент нічого не вирішує, тому що він просто заново встановлює пересланий ключ, а не той, який з dev сервер. Якщо ви використовуєте SSH-копії ідентифікатор з пересилкою агента, вам потрібно вказати , який ключ для установки з прапором -i: ssh-copy-id -i ~/.ssh/id_rsa.pub user@host.


0

Ви вже спробували стару хитрість очищення файлів хостів? Я маю на увазі:

rm ~/.ssh/known_hosts

Варто спробувати, оскільки ssh відновить його, і ви позбудетеся від черствих речей. Звичайно, ви також можете видалити частини, що належать даному IP / хосту.

Більше запитань: чи працює ваш cron під вашим UID або він працює як користувацький cron або root?


1
Кожні команди працюють окремо, тому я не бачу, як видалення ~/.ssh/known_hostsнічого не змінить? І cron працює як мій користувач "tom" на робочому столі, з наміром увійти на сервер як "резервне копіювання користувача" за допомогою відповідного (без пароля) SSH ключа, який знаходиться у користувача tom's ~/.ssh.
Том Броссман

3
@ runlevel0 Ані прапор, -rані -fпрапор не потрібні для видалення known_hosts- це звичайний файл (а не каталог), і він не читається тільки. rm .ssh/known-hostsбуло б значно безпечніше, враховуючи, що помилка друку з одним символом - випадкове додавання пробілу між .і ssh/known_hostsпісля rm -rf(або rm -r) зазвичай видаляє весь вміст домашньої папки користувача!
Елія Каган

Привіт Eliah, чудовий момент справді !! Я використовую прапор -rf як рефлекторну дію, але ви абсолютно праві. Мені погано.
runlevel0

0

Використовуйте rrsyncсценарій разом із виділеним ключем ssh наступним чином:

REMOTE-сервер

mkdir ~/bin
gunzip /usr/share/doc/rsync/scripts/rrsync.gz -c > ~/bin/rrsync
chmod +x ~/bin/rrsync

МІСЬКИЙ комп’ютер

ssh-keygen -f ~/.ssh/id_remote_backup -C "Automated remote backup"      #NO passphrase
scp ~/.ssh/id_remote_backup.pub devel@10.10.10.83:/home/devel/.ssh

ВИДАЛИТИ комп’ютер

cat id_remote_backup.pub >> authorized_keys

Додайте до щойно доданого рядка наступне

command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding

Щоб результат виглядав так

command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAA...vp Automated remote backup

МІСЦЕВО

Введіть у дозвіл crontabнаступний сценарій x:

#!/bin/sh
echo ""
echo ""
echo "CRON:" `date`
set -xv
rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -avzP devel@10.10.10.83:/ /home/user/servidor 

Джерело: http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/


0

Щоб спробувати і налагодити додавання до ssh частини "ssh -v" таким чином, ви можете отримати багатослівний режим з деякою корисною інформацією.

Редагувати: зі сторінки чоловіка:

-v      Verbose mode.  Causes ssh to print debugging messages about its progress.  This is helpful in debugging connection,
             authentication, and configuration problems.  Multiple -v options increase the verbosity.  The maximum is 3.

-1

Я думаю, ви неправильно налаштували файл sshd_config. Переконайтесь у цьому PermitRootLogin yesта PubkeyAuthentication yes віддаленому обслуговуванні.


1
Він не намагається увійти як root, і він, ймовірно, має налаштування автентифікації відкритих ключів правильно, оскільки він може ssh і навіть запустити команду резервного копіювання з терміналу успішно.
Алаа Алі

1
Дякую за пораду, але я точно не PermitRootLoginввімкнув і не планую цього змінювати. Найкраща практика - це вимкнути її, а ssh лише як звичайний користувач (якщо потрібно, додайте їх до своїх «sudoers») і ніколи не використовуйте root.
Том Броссман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.