Solution 1 :
Parfois, vous pensez trop aux choses.
Rsync n'a pas été installé sur le système distant.
/paume faciale
Solution 2 :
Je mets ceci ici pour que je puisse me souvenir et partager cette astuce :
rsync -av -e "ssh -tt" --rsync-path="stty raw -echo; sudo /usr/bin/rsync" [email protected]${HOSTNAME}:/ ${DEST_DIR}
Cette méthode semble contourner l'exigence d'un tty telle qu'appliquée sur le /etc/sudoers
par défaut de certains systèmes fichier avec Defaults requiretty
. Ces informations ont été élaborées après avoir examiné cette question et ces réponses SO.
Dans cette réponse, ils recommandent de supprimer Defaults requiretty
du /etc/sudoers
. C'est la méthode la plus simple. Cependant, si vous ne parvenez pas à modifier l'hôte distant /etc/sudoers
pour supprimer cette option de configuration, vous pouvez essayer de forcer le rsync
local utiliser ssh -tt
. Cette option pour ssh
est décrit dans le ssh
page de manuel du client comme celle-ci :
Forcer l'allocation de pseudo-terminal. Cela peut être utilisé pour exécuter des programmes arbitraires basés sur l'écran sur une machine distante, ce qui peut être très utile, par ex. lors de la mise en œuvre des services de menu. Plusieurs options -t forcent l'allocation tty, même si ssh n'a pas de tty local.
Ainsi, nous forçons ssh à allouer un pseudo-tty pour éviter l'erreur :
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
Ensuite, le --rsync-path
est remplacé par une commande pour effectuer les opérations suivantes :
stty raw -echo; sudo /usr/bin/rsync
stty raw -echo
est de définir la discipline de ligne du terminal distant comme pass through. Cela le fait effectivement se comporter comme un tube qui serait utilisé à la place d'un pseudo-terminal sans -tt
.
Ensuite, la commande rsync distante sera sudo /usr/bin/rsync
, qui a maintenant un pseudo-tty et passera le requiretty
vérifier sudo
.