Choisir le shell utilisé par SSH?

32

Comment définir le shell qui est utilisé lorsqu'un utilisateur SSHs sur un serveur. Par exemple, je ne supporte pas BASH et j'ai besoin d'utiliser ZSH, comment puis-je faire en sorte que ZSH soit chargé avec mon profil ( .zsh_profile) lorsque je ssh sur la machine.

Je ne veux pas non plus avoir à passer un tas de paramètres avec ssh, ne puis-je pas définir le shell par défaut?

JP Silvashy
la source

Réponses:

35

En supposant que vous exécutez sous Linux, vous pouvez utiliser la chshcommande.

chsh -s /bin/ksh foo
chsh -s /bin/bash username
Dominic Barnes
la source
4
Veuillez noter que le chemin vers le binaire doit être dans /etc/shellspour que le shell soit sélectionnable.
Kimvais
Ubuntu 16.04 n'a pas cette commande.
david.perez
@ david.perez Oui, c'est le cas, dans le passwdpackage .
dessert
Cela ne fonctionne pas lorsque l'authentification est gérée via LDAP
Daniel Kats
11

man chsh change de shell, ne fonctionne pas toujours

Alternativement, vous pouvez coller exec /bin/zshdans votre script de connexion bash. Cela remplacera l'instance bash par votre shell.

Ou vous pouvez faire ssh host "zsh -l"


la source
Pourquoi le -1 (15 caractères ...)?
Noufal Ibrahim
c'est un minusculeL
driftcatcher
1
ssh -test requis pour obtenir un ATS pour les dernières options. Par défaut, si une commande (comme zsh -l) est fournie, OpenSSH ferait un shell sans connexion, qui n'allouerait pas de TTY pour vous, et -lne changerait pas cela (car il est exécuté après la connexion).
Franklin Yu
8

Modifiez / etc / passwd (si vous en avez les droits ou demandez à votre administrateur système) de changer votre shell par défaut.

Valentin Rocher
la source
Pour une raison quelconque, les utilisateurs que j'ai créés récemment n'avaient pas de shell par défaut. Cela a fonctionné pour moi. Merci.
mimoralea
2
Merci cette réponse est super. Je n'avais pas d'obus ici non plus. J'ai trouvé la ligne myusername: x: 1000: 1000 :: / home / myusername: et ajouté / bin / bash à la fin. Déconnectez-vous et ma session ssh utilise bash :)
Stewart Evans
6

Si vous ne pouvez pas changer votre shell par défaut, ça ssh -t user@host 'zsh -l'marche.

L' -tindicateur force une allocation pseudo-tty, et l' -lindicateur génère un shell de connexion .

marque
la source
4

Je ne sais pas comment vous pouvez mettre votre local .zshrcsur un serveur distant (c'est-à-dire sans le stocker de manière permanente là-bas), cela fonctionne pour moi de changer mon shell de connexion sur le serveur distant.

Puisqu'il s'agit d'un compte partagé, je ne peux l'utiliser zshque pour moi avec cette méthode.

Ajoutez ceci à votre ~/.ssh/configfichier sur votre machine locale.

Host yourServer
    HostName <IP, FQDN or DNS resolvable name>
    IdentityFile ~/.ssh/<your keyfile>
    RemoteCommand zsh -l
    RequestTTY force
    User <yourUsername>

Il pourrait y avoir un moyen hackeux d'accomplir ce que vous recherchez, comme ci-dessous.

AVERTISSEMENT Ceci n'est livré avec aucune garantie et ne semble pas «sage», mais j'ai réussi à mettre mon fichier local sur le serveur et à le source dans le shell de connexion en utilisant cela.

Host someHost
    HostName someIP
    IdentityFile ~/.ssh/somekey.pem
    RemoteCommand zsh -l -c 'sleep 1; source /tmp/somefile; zsh'
    PermitLocalCommand yes
    LocalCommand bash -c 'sftp %r@%h <<< "put /tmp/somefile /tmp/somefile"'
    RequestTTY force
    User someUser

Comment ça marche?

  • RemoteCommand définit ce qui doit être exécuté sur le côté distant.
  • LocalCommanddéfinit ce qui doit être exécuté sur local, qui est utilisé pour copier votre fichier local sur un serveur distant pour le sourcer. Voici le hic, cela ne se produit qu'après une connexion «réussie» à l'hôte distant.

Sens:

  1. Votre connexion à la télécommande doit être ouverte et vivante
  2. Votre shell distant n'a pas encore le fichier, il doit donc attendre que le fichier soit là, ergo sleep
  3. Vos utilisations locales sftppour placer votre fichier sur un serveur distant, le serveur distant se réveille sleepet source vos scripts.

C'est super hackish, j'aimerais savoir s'il y a une meilleure façon aussi.

Mise à jour: Cela peut être utilisé à la place d'un temps de sommeil «long»:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

sdkks
la source