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 sur 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 du shell Bash et C.
ssh
bash
shell
command-line-interface
plinehan
la source
la source
Réponses:
Je ne pense pas que cela 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).
la source
Utilisez un hérédoc:
la source
cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash
. Ainsi, au lieu d'une étape, vous avez deux étapes: étape 1 copiez votre script dans un fichier, étape 2cat
le script versssh
.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ée sur le serveur (dans le fichier ~ / .ssh / authorized_keys 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 clé 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écutées 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 la
$SSH_ORIGINAL_COMMAND
variable ...)Renseignez-vous sur les "commandes forcées" via Google .
la source
/etc/sshrc
.Vous pouvez utiliser l'
-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 argument ancien simple.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.
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, donc votre shell pourrait l'avoir aussi.
la source
Étonnamment, je vois des résultats différents avec les éléments suivants:
exécuter en tiret:
vs bash:
L'affichage de la commande entièrement citée fonctionne comme prévu.
la source
sh -c "$*"
. Ainsi, vous courezsh -c "/bin/bash -c echo <(cat)"
; laecho
commande elle-même est le seul argument transmis à-c
, et<(cat)
est un argument distinct tout à fait.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:
la source