Я использую следующую команду в корневом каталоге 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
.
sudo
если cron
работа выполняется как root.-rlptgoD
; удалить и заменить на -a
.sudo
для местный TTY, тогда как -t
возможность ssh
для удаленный TTY. Не путайте их. -v
и -q
противоречат друг другу?stdin
не является телетайпом; они не запускаются из терминала или эмулятора терминала).ИЗМЕНИТЬ / ОБНОВИТЬ:
cron
работает, и SSH не выделяет его удаленно, поскольку локального нет.Я собираюсь предположить, что это проблема с ключом ssh. Либо закрытый ключ резервной копии имеет парольную фразу, либо открытый ключ отсутствует в цепочке ключей удаленных пользователей. Может быть, ваша предыдущая попытка использовала ключ, который уже был загружен в вашу связку ключей?