Назад | Перейти на главную страницу

Rsync через SSH, когда терминал отсутствует

Я использую следующую команду в корневом каталоге crontab в Debian.

rsync -vqrlHEAXogDtzhi --log-file=${LOG} --progress --rsync-path="sudo /usr/bin/rsync" --exclude-from=$CONFIG_DIR/excludes -e "ssh -i /home/backups/.ssh/id_rsa" backups@${HOSTNAME}:/ ${BACKUP_DIR}

И я получаю следующее:

sudo: no tty present and no askpass program specified

Я попытался добавить -t к команде ssh и получил:

Pseudo-terminal will not be allocated because stdin is not a terminal.

Я попытался добавить -t -t к команде ssh и получил:

protocol version mismatch -- is your shell clean?

Я добавил .hushlogin пользователю резервного копирования на удаленном ящике и подтвердил, что могу использовать ssh в качестве резервных копий, используя ключ к удаленному ящику, при этом ничего не отображается (вход в систему отключен). Я до сих пор получаю эти сообщения.

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

Обратите внимание, что в моем sudo нет опции -tt.

Обратите внимание, что в файле источника и назначения / etc / sudoers установлено следующее:

backups ALL= NOPASSWD:/usr/bin/rsync

Обратите внимание, что в моем файле / etc / sudoers нет ссылок на:

Defaults    requiretty

Обратите внимание, что я не буду повторять свой пароль в команде.

Как мне снять шкуру с этой кошки? : |

Спасибо

Иногда ты слишком много думаешь о вещах.

Rsync не был установлен в удаленной системе.

/ facepalm

Поместите это здесь, чтобы я мог вспомнить и поделиться этим трюком:

rsync -av -e "ssh -tt" --rsync-path="stty raw -echo; sudo /usr/bin/rsync"   user@${HOSTNAME}:/ ${DEST_DIR}

Этот метод, кажется, обходит требование для tty как применяется по умолчанию для некоторых систем /etc/sudoers файл с участием Defaults requiretty. Эта информация была создана после просмотра этот ТАК вопрос и ответы.

В этом ответе они рекомендуют удалить Defaults requiretty из /etc/sudoers. Это более простой способ. Однако, если вы не можете изменить удаленный хост /etc/sudoers чтобы удалить этот параметр конфигурации, вы можете попробовать заставить локальный rsync использовать ssh -tt. Этот вариант для ssh описывается в ssh страница руководства клиента как это:

Принудительное выделение псевдотерминала. Это можно использовать для выполнения произвольных экранных программ на удаленном компьютере, что может быть очень полезно, например при реализации услуг меню. Несколько параметров -t принудительно выделяют tty, даже если ssh не имеет локального tty.

Таким образом, мы заставляем ssh выделить псевдотерминал, чтобы избежать ошибки:

Pseudo-terminal will not be allocated because stdin is not a terminal.
stty: standard input: Inappropriate ioctl for device
sudo: sorry, you must have a tty to run sudo

Затем --rsync-path заменяется командой, выполняющей следующие действия:

stty raw -echo; sudo /usr/bin/rsync

stty raw -echo - установить линейную дисциплину удаленного терминала как сквозную. Это фактически заставляет его вести себя как канал, который будет использоваться вместо псевдотерминала без -tt.

Тогда удаленная команда rsync будет sudo /usr/bin/rsync, который теперь имеет псевдотерминал и будет передавать requiretty проверить sudo.

  1. Тебе не нужно sudo если cron работа выполняется как root.
  2. Есть масса ненужных флагов: -rlptgoD; удалить и заменить на -a.
  3. Сообщение TTY от sudo для местный TTY, тогда как -t возможность ssh для удаленный TTY. Не путайте их.
  4. Не надо -v и -q противоречат друг другу?
  5. Последнее, что вам нужно беспокоиться - это зашифрован ли локальный закрытый ключ SSH или нет. Первый не может использоваться с автоматическими запусками (например, те, где stdin не является телетайпом; они не запускаются из терминала или эмулятора терминала).

ИЗМЕНИТЬ / ОБНОВИТЬ:

  • Беру обратно 1 и 2.
  • 3 должно означать отсутствие местного TTY, когда cron работает, и SSH не выделяет его удаленно, поскольку локального нет.

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