Имея проблему, что rsync не устанавливает UID и GID как ожидалось, мое инстинктивное чувство - это rsync
должен быть выполнен как root
на целевой машине.
Я не могу войти в систему как root
через SSH, так как это отключено в целях безопасности. Пользователь на целевой машине может использовать sudo
.
Действительно ли возможно использовать rsync
с sudo
?
На целевой машине
rsync
: which rsync
/etc/sudoers
файл: sudo visudo
(см. также: я должен использовать visudo? ) <username> ALL=NOPASSWD:<path to rsync>
, где имя пользователя является именем для входа в систему пользователя, которого rsync будет использовать для входа в систему. Тот пользователь должен смочь использовать sudo
Затем на исходной машине, указать, что sudo rsync
буду использоваться:
rsync ... --rsync-path="sudo rsync" ...
Используя его без NOPASSWD
на целевой машине приведет к сообщению
sudo: никакой подарок tty и никакая askpass программа не указали
Мое решение состоит в том, чтобы использовать --rsync-path="sudo rsync"
, если он запрашивает пароль, вы можете использовать обходной путь, подобный следующему:
rsync -avz --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync" user@192.168.1.2:/ .
Но это не безопасно для ввода пароля в командной строке.
У Вас может быть удаленный sudo, просите Вы свой пароль через X-окна. Вот способ сделать это:
ssh-askpass
, установлен на удаленном хосте (и что Вы используете X-окна, конечно) /etc/sudo.conf
: # Path to askpass helper program
Path askpass /usr/bin/ssh-askpass
Добавляют эти опции к rsync: -e "ssh -X" --rsync-path="sudo -A rsync"
ssh -X
передаст Вашу информацию X-окон, и порт к Вашему удаленному сеансу sudo -A
заставит sudo использовать ssh-askpass для просьбы Вас Ваш пароль Если нет доступа к файлу sudoers, просто создайте скрипт-оболочку для команды ssh.
ssh_sudo:
{
echo $PASSWORD;
cat - ;
} | ssh $* &
Сначала это передает пароль процессу sudo клиента ssh, чтобы запустить rsync на удаленной стороне. Затем все входные данные, поступающие от локального rsync, передаются в ssh.
Наконец, вызовите rsync, например. with:
PASSWORD=<SUDOPASS> rsync -avzue ssh_sudo --rsync-path "sudo -S rsync" SRC DST
Я думаю, что аспект безопасности здесь не так уж и плох, вам нужно будет только сохранить пароль локально как env var. Чтение из файла тоже должно работать...