ssh + sudo + su dans le shell de connexion

11

J'ai plusieurs machines dans lesquelles je ssh régulièrement uniquement dans le but d'utiliser sudo supour passer le reste de ma session connecté en tant qu'utilisateur spécial. Le workflow général est le suivant:

mymachine:~ me$ ssh me@othermachine
othermachine:~ me$ sudo su - specialuser # note: no password needed
othermachine:~ specialuser$ # do stuff

Je voudrais résumer cela en une seule ligne que je peux alias, donc je peux simplement configurer un alias pour chaque machine et arriver là où je dois être dans une seule commande, sans avoir à taper le passe- sudo su - specialuserpartout. Je pourrais peut-être configurer me@othermachineà la sudo suconnexion, mais je voudrais garder la flexibilité de fonctionner comme mesi j'en avais besoin.

( Remarque: je n'ai aucun contrôle sur othermachinela façon dont il est configuré; c'est un flux de travail établi sur lequel je suis entré lors de mon embauche.)

Ma première pensée était juste

ssh me@othermachine "sudo su - specialuser"

et ce genre de travaux, mais cela ne m'invite pas, le ^Ctue et me déconnecte, et je suppose que diverses autres choses sont probablement mauvaises aussi.

Après avoir lu la commande Run Remote ssh avec Full Login Shell, j'ai essayé quelques autres choses exotiques comme

ssh me@othermachine 'bash -l -c "sudo su - specialuser"'

et

ssh me@othermachine 'bash -l -c "sudo su - specialuser"; bash'

- ni l'un ni l'autre dont je m'attendais à travailler, et ils ne l'ont pas fait, mais j'ai pensé que je devrais les essayer pour être complet (et pour éviter les doublons) ils ont produit le même shell sans invite (le second avec un bonus sans invite supplémentaire pour l' meafter exit-ing de celui pour specialuser). Et j'ai essayé

ssh me@othermachine "sudo su - specialuser -c bash -l"

mais ça m'a juste

sudo: no tty present and no askpass program specified

De meilleures idées?

David Moles
la source
Qu'en est-il de l'ajout de la commande sudo ~/.profileaprès un court délai?
Alex
L'idée étant que dans le cas étrange que je ne veux pas, sudoje devrais frapper ^C? Si je ne peux rien trouver de mieux, je pourrais essayer.
David Moles
1
Vous pourriez su mepartir specialuser. Ou dans .profileou .bashrc, si vous ne suivez pas le sudoavec exit, votre premier exitvous ramènera à me, avec un second pour terminer la session. Ou même utiliser un fichier indicateur, donc sudoest précédé [ -f ~/.keep.me ] && del ~/.keep.meet suivi de [ \! -f ~/.keep.me ] && exit: vous n'avez alors besoin que d'un script ou d'un alias pour une commande meas :>~/.keep.me; exit. Maintenant , exitmettra fin à votre session et mesera revenir à votre session de connexion.
AFH
1
Veuillez envisager d'écrire dans votre version finale /bin/bashet pas simple bashpour des raisons de sécurité (pour éviter les chevaux de Troie ). Surtout s'il y a un sudoavant ...
Hastur

Réponses:

11

Cette ligne devrait fonctionner pour vous

ssh -t me@machine "sudo su - specialuser" 

Cette solution me donne une invite ou non en fonction du -tcommutateur

ssh -t me@machine "/bin/bash -l"   # Give me a prompt

ssh  me@machine "/bin/bash -l"     # Give me NO prompt
ssh  me@machine                    # Give me NO prompt

Notes de man ssh

-t
Force l'allocation de pseudo-tty. Cela peut être utilisé pour exécuter des programmes arbitraires sur écran sur une machine distante, ce qui peut être très utile, par exemple lors de la mise en œuvre de services de menu. Plusieurs options -t forcent l'allocation de tty, même si ssh n'a pas de tty local .

Hastur
la source
Cela fonctionne pour moi ... peut-il être fait via le paramètre ~ / .ssh / config spécifique à l'hôte, aussi?
hey
1
@où, oui, vous pouvez le faire avec RequestTTY force(ce qui équivaut à -t) et RemoteCommand sudo su - specialuser! Cependant, sachez que d'autres programmes utilisant SSH (comme scp, rsync, etc.) ne fonctionneront plus correctement pour cet hôte.
Robert Riedl