Comment utiliser ssh et sudo ensemble dans bash?


10

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 myuser@machine.net
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 myuser@machine.net 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 l'utilisation de sudo su d'après ce que je peux dire ...

Merci pour toute aide!


Pourquoi le vote serré? Cette question porte sur le thème: gestion du matériel ou des logiciels des serveurs, postes de travail, stockage ou réseaux, outils utilisés pour les administrer, les surveiller ou les automatiser
jlliagre

Réponses:


5

La façon dont j'y parviens dans mon environnement actuel est d'exécuter ssh avec l' -tindicateur qui force l'allocation tty, puis d'exécuter sudo -u root à l'intérieur, 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.


Malheureusement parce que je ne gère pas le serveur distant, je crois que je suis bloqué en utilisant sudo su ici. Cela fonctionnerait-il toujours dans ce format?
Matt124234

oui ça marchera aussi. vous pouvez entrer le mot de passe lorsque vous y êtes invité.
Michael Martinez

J'ai essayé: ssh -t mrhyner@stg-app3.indeed.net << EOF sudo su - adcentrl egrep 'ERROR \ | WARN' / home / adcentrl / cronjobs / logs / * / * EOF Mais j'ai reçu: "Pseudo -terminal ne sera pas alloué car stdin n'est pas un terminal. "
Matt124234

parfaitement bien. ignorez cet avertissement et continuez. si vous voulez, vous pouvez désactiver "RequireTty" dans / etc / sudoers sur l'extrémité distante
Michael Martinez

5

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 user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF

1

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

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt

ou

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"

selon que vous souhaitez que le file.txtfichier soit créé localement ou à distance.

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

echo mrhyner_password | \
  ssh mrhyner@test-server.net \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"

Très intéressant. Cependant, l'utilisation de ssh sans -t me dit "aucun tty présent". L'ajout de -t supprime cette erreur mais ne semble pas honorer 'sudo su' car il me demande un mot de passe. Voici précisément ce que je fais: ssh -t mrhyner@test-server.net "sudo su - adcentrl -c egrep" ERROR \ | WARN "/ home / adcentrl / cronjobs / logs / * / *" Cela me donne: bash : AVERTISSEMENT: commande introuvable [sudo] mot de passe pour mrhyner:
Matt124234

Désolé, je ne sais apparemment pas comment formater mes commentaires dans cette chose
Matt124234

Je supposais que sudo était configuré pour être sans mot de passe pour votre compte distant.
jlliagre

et il vous manque des guillemets supplémentaires.
jlliagre

C'est, ce qui m'a fait penser que bash n'honore pas la commande ssh pour une raison quelconque. C'est comme si j'essayais de faire un sudo depuis mon hôte local = \
Matt124234
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.