web-dev-qa-db-fra.com

Forcer SSH à utiliser un shell spécifique

Existe-t-il un moyen de forcer SSH à utiliser un shell particulier sur l'extrémité distante, quel que soit le shell par défaut de l'utilisateur?

J'ai essayé des solutions similaires à:

ssh Host.domain.com /bin/bash -c 'complicated, multi-line command'

mais malheureusement, le shell par défaut à l'extrémité distante est responsable de l'analyse de la partie "commande complexe à plusieurs lignes", et j'ai du mal à l'échapper suffisamment pour fonctionner à la fois pour les utilisateurs de Bash et C Shell.

29
plinehan

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

8
sysadmin1138

Utilisez un hérédoc:

ssh Host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF
16

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

Faites votre commande forcée pour que votre Shell souhaité soit appelé ...

Plus: Vous pouvez associer au plus une commande forcée à une touche donnée. Si vous avez besoin de plusieurs commandes forcées à des fins différentes, vous devez configurer différentes clés. (Bien sûr, vous pouvez mettre plusieurs choses dans un script, que vous appelez via une commande forcée. Mais sachez que les commandes forcées sont toujours exécuter pour un compte/clé donné si l'utilisateur se connecte, qu'il ait demandé quelque chose de différent à exécuter. Si vous voulez toujours honorer la commande d'origine demandée, regardez comment exploiter le $SSH_ORIGINAL_COMMAND variable ...)

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

10
Kurt Pfeifle

Vous pouvez utiliser le -t option pour forcer l'allocation d'un pseudo-tty pour le programme que vous souhaitez démarrer, comme si vous exécutiez le shell standard. Passez ensuite le Shell que vous voulez comme un vieil argument.

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

Voici bash

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

sh fonctionne aussi. Comme tout le reste vraiment.

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

Je ne sais pas s'il s'agit d'un shell de connexion, mais il existe des options pour que bash agisse comme un shell de connexion, de sorte que votre shell peut également l'avoir.

5
Fábio Santos

Étonnamment, je vois des résultats différents avec les éléments suivants:

exécuter en tiret:

ssh [email protected] /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" unexpected

vs bash:

ssh [email protected] '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

L'affichage de la commande entièrement citée fonctionne comme prévu.

1
Eric Woodruff

J'ai fait face à une situation similaire il y a quelque temps où j'avais besoin d'utiliser le coprocessus ksh pour sqlplus et je n'avais qu'un ssh à travers lequel les lectures et les écritures devaient avoir lieu.

Une façon de procéder consiste à diriger toutes vos commandes dépendantes sur une seule ligne (utilisez;) vers/usr/bin/ksh sur la machine distante. par exemple:

Host="user@Host"

db_conn="ora_user/passwd"

a="select * from dual;"

frmt="set heading off echo off feedback off verify off pagesize 0 termout off"

var=$(ssh ${Host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \$0}' /remote_dir/kshcmd.txt | /usr/bin/ksh")
0
aws