63 votes

Forcer SSH à utiliser un shell spécifique

Existe-t-il un moyen de forcer SSH à utiliser un shell particulier à l'extrémité distante, peu importe quel shell par défaut l'utilisateur utilise ?

J'ai essayé des solutions similaires à :

ssh host.domain.com /bin/bash -c 'commande compliquée, sur plusieurs lignes'

mais malheureusement le shell par défaut sur l'extrémité distante est responsable de l'interprétation de la partie "commande compliquée, sur plusieurs lignes", et j'ai du mal à l'échapper suffisamment pour que cela fonctionne à la fois pour les utilisateurs de Bash et de C shell.

56voto

SuperOli Points 860

Vous pouvez utiliser l'option -t pour forcer l'allocation d'un pseudo-tty pour le programme que vous souhaitez démarrer, comme si vous exécutiez l'interpréteur de commandes standard. Ensuite, transmettez l'interpréteur de commandes souhaité en tant qu'argument ordinaire.

Avec cette technique, vous pouvez non seulement utiliser n'importe quel interpréteur de commandes installé, mais vous pouvez également ouvrir vim et d'autres programmes qui nécessitent un TTY, à partir d'une seule commande. Ce qui est pratique si vous écrivez un script shell qui vous connecte quelque part et ouvre un fichier sur vim, ou htop ou autre chose.

Voici bash

me@my-machine $ ssh root@myhost -t bash
root@myhost:~# 

sh fonctionne aussi. Tout comme n'importe quoi d'autre en réalité.

me@my-machine $ ssh root@myhost -t sh
# 

Je ne suis pas sûr s'il s'agit d'un interpréteur de commandes d'ouverture de session, mais il existe des options pour faire en sorte que bash agisse comme un interpréteur de commandes d'ouverture de session, donc votre shell pourrait avoir cela aussi.

19voto

David Points 344

Utiliser un heredoc :

ssh host.domain.com /bin/bash << EOF
grosses commandes moches
beaucoup d'entre eux
EOF

16voto

sysadmin1138 Points 129885

Je ne crois pas que cela soit possible, du moins avec des systèmes basés sur openssh. Si vous en avez la possibilité, une meilleure solution pourrait être de sftp un fichier shell, puis de l'exécuter avec la méthode que vous avez postée. Cela aurait l'avantage de minimiser la quantité d'échappement nécessaire, mais laisserait un fichier derrière qui devrait être supprimé (peut-être comme dernière étape du script).

12voto

Kurt Pfeifle Points 1716

Utilisez des connexions basées sur des clés, pas sur des mots de passe. Ensuite, vous pouvez ajouter une (liste de) "commande(s) forcée(s)" à votre clé ssh publique (dans le champ "options" en cas de SSH1) qui est installée sur le serveur (dans le fichier ~/.ssh/authorized_keys pour SSH1, ~/.ssh2/authorization pour SSH2).

Faites en sorte que votre commande forcée appelle votre shell désiré...

Plus : Vous ne pouvez associer au maximum qu'une commande forcée à une clé donnée. Si vous avez besoin de plusieurs commandes forcées à des fins différentes, vous devez configurer des clés différentes. (Bien sûr, vous pouvez mettre plusieurs choses dans un seul script, que vous appelez via la commande forcée. Mais sachez que les commandes forcées sont toujours exécutées pour un compte/clé donné si l'utilisateur se connecte, indépendamment s'il a demandé quelque chose de différent à exécuter. Si vous souhaitez quand même honorer la commande originale demandée, regardez comment exploiter la variable $SSH_ORIGINAL_COMMAND...)

Renseignez-vous sur les "commandes forcées" via Google.

2voto

Étonnamment, je vois des résultats différents avec ce qui suit :

exécution dans dash :

ssh eric@172.17.1.241 /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" inattendu

contre bash :

ssh eric@172.17.1.241 '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

Montrant que la commande entièrement entre guillemets fonctionne comme prévu.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X