Контекст

Контекст

Контекст

Я хочу настроить rsyncрезервное копирование моего сервера, поэтому я запускаю следующую команду

rsync -r -e ssh --rsync-path="sudo rsync" [email protected]:/ /backup/

В идеале эта команда запросила бы мой пароль личного ключа ssh, затем подключилась бы, затем запросила бы пароль sudo для rsyncuser, а затем запустила бы rsync на сервере. Но я получил печально известную ошибку:

sudo: no tty present and no askpass program specified

Поэтому мне пришлось добавить это к /etc/sudoers(using sudo visudo), что по сути дает пользователю полный доступ к системе для чтения и записи без пароля rsyncuser, что мне не по вкусу:

rsyncuser ALL= NOPASSWD:/usr/bin/rsync

Вопрос

Как мне вместо этого заставить sudo считать свой пароль, скажем, с другого TTY?

Таким образом, я мог бы работать rsyncв одном терминальном окне на своей локальной машине и использовать другое терминальное окно для открытия (возможно, отдельного) ssh-соединения с сервером и указать там пароль sudo.

Единственный способ, который я могу придумать, — это использовать скрипт expectвокруг sudo, который считывает пароль из именованного канала, а я бы писал в этот канал с другого терминала.

Примечание: это больше ради эксперимента и обучения, чем для какой-либо практической цели.Я не пытаюсь узнать, как использовать sudo с rsync., Я уже прочитал все, что смог найти по этому поводу.

решение1

sudoпрочитает переменную окружения, SUDO_ASKPASS, если он не запущен из терминала (как в вашем случае) или если установлен -A. Он использует это как команду для запуска, чтобы получить пароль. Например:

echo -e '#!/bin/sh\nhead -n 1' > ~/bin/reader
chmod a+x ~/bin/reader
export SUDO_ASKPASS="$HOME/bin/reader"
sudo -A echo "I'm root\!"

Вам будет предложено ввести пароль на стандартном вводе, терминал не потребуется.

Однако в конкретном случае, который вы пытаетесь сделать, может быть лучше разрешить вход root SSH, но только с ключом SSH и командой, ограниченной rsync. Есть хороший ресурс по этому вопросуздесь.

решение2

Пытаться:

ssh userfoo@host "sudo -S p'enter pw: ' [command] "

Это выдаст запрос на ввод пароля (" enter pw:"), который отобразится на вашем локальном хосте/терминале. Недостатком этого является риск безопасности, так как ваш пароль отображается в открытом виде в окне терминала. Он не будет сохранен в локальном .bash_history, но это история прокрутки окна терминала. Так что, если вы используете, например, Konsole, используйте Ctrl+ Shift+ , Kчтобы очистить ее.

Связанный контент