web-dev-qa-db-fra.com

Comment utiliser ssh et Sudo ensemble dans bash?

Je n'ai pas pu trouver de question décrivant ce scénario spécifique.

J'essaie d'exécuter un script bash très basique pour récupérer la journalisation de plusieurs machines. J'exécute le script localement mais j'ai besoin d'accéder à une machine externe via ssh, ainsi que Sudo à un utilisateur privilégié une fois sur cette machine ...

ssh [email protected]
Sudo su  - privledged_user
cat logs > file.txt

L'exécution de sh -x révèle que bash est bloqué sur la ligne 'ssh'. J'ai donc essayé de le réviser comme suit:

ssh [email protected] Sudo su - privledged_user cat logs > file.txt

Cela semble également se bloquer indéfiniment. Existe-t-il une meilleure solution à ce problème ?? Je ne vois pas comment contourner Sudo su d'après ce que je peux dire ...

Merci pour toute aide!

10
Matt124234

La façon dont j'y parviens dans mon environnement actuel est d'exécuter ssh avec le -t flag qui force l'allocation de tty, et ensuite exécuter Sudo -u root dedans, comme suit:

ssh -t hostname << EOF
  command1
  Sudo -u root command2
  Sudo -u otheruser "command3 | command4"
  Sudo -u root /bin/bash -c "command5; command6; command7"
  command8 && ( Sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work

EOF

J'ai mon compte dans sudoers du côté distant afin qu'aucun mot de passe ne soit requis.

Cet exemple vous montre différentes façons de le faire dans une seule session ssh, y compris l'exécution de plusieurs commandes avec bash ou dans un sous-shell. Notez également que si vous placez le code ci-dessus dans un script exécutable, vous pouvez passer des arguments de ligne de commande ($ 1 et $ 2) à ssh et ceux-ci seront développés puis référencés du côté distant.

5
Michael Martinez

Si vous ne voulez pas ou ne pouvez pas empêcher Sudo de vous demander le mot de passe, une astuce simple consiste à le lire localement et à le stocker dans une variable locale:

read -p 'Password: ' -s password

ssh -t [email protected] <<EOF
  echo "$password" | Sudo -S whoami
EOF
5
xpmatteo

Si Sudo est configuré pour autoriser les commandes sans mot de passe, cela devrait faire ce que vous voulez:

ssh [email protected] "Sudo su - privileged_user -c 'cat logs'" > file.txt

ou

ssh [email protected] "Sudo su - privileged_user -c 'cat logs > file.txt'"

selon que vous voulez file.txt le fichier doit être créé localement ou à distance.

Sinon, voici un moyen de transmettre le mot de passe de l'utilisateur distant à Sudo:

echo mrhyner_password | \
  ssh [email protected] \
  "Sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"
1
jlliagre