![Контекст](https://rvso.com/image/50564/%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82.png)
Контекст
Я хочу настроить 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чтобы очистить ее.