70 votes

Choix du Shell que SSH utilise ?

Comment puis-je définir le Shell qui est utilisé lorsqu'un utilisateur se connecte en SSH à un serveur. Par exemple, je ne supporte pas BASH et je dois utiliser ZSH, comment puis-je faire en sorte que ZSH soit chargé avec mon profil ( .zsh_profile ) lorsque je me connecte à l'ordinateur.

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 ?

58voto

mjt Points 541

En supposant que vous travaillez sous Linux, vous pouvez utiliser la commande chsh commandement.

chsh -s /bin/ksh foo
chsh -s /bin/bash username

29voto

jyoti proy Points 123

Si vous ne pouvez pas changer votre Shell par défaut, ssh -t user@host 'zsh -l' travaux.

En -t force l'allocation d'un pseudo-tty, et l'option -l génère un login Shell .

14voto

man chsh change Shell, ne fonctionne pas toujours

Sinon, vous pouvez coller exec /bin/zsh dans votre login bash script.ceci remplacera l'instance bash par votre script.

Ou vous pouvez faire ssh host "zsh -l"

14voto

Safor Points 85

Editez /etc/passwd (si vous avez les droits, ou demandez à votre administrateur système) pour changer votre Shell par défaut.

10voto

Je ne suis pas sûr que vous puissiez mettre votre local .zshrc sur le serveur distant, (c'est à dire sans l'y stocker de façon permanente), cela fonctionne pour moi pour changer mon login Shell sur le serveur distant.

Puisque c'est un compte partagé, je peux utiliser zsh seulement pour moi avec cette méthode.

Ajoutez ceci à votre ~/.ssh/config dans votre machine locale.

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

Il existe peut-être des moyens détournés d'accomplir ce que vous cherchez, comme ci-dessous.

AVERTISSEMENT Cela n'apporte aucune garantie et ne semble pas "sage", cependant j'ai réussi à mettre mon fichier local sur le serveur et à le sourcer dans le login Shell en utilisant ceci.

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 cela fonctionne-t-il ?

  • RemoteCommand définit ce qui doit être exécuté du côté distant.
  • LocalCommand définit ce qui doit être exécuté sur le serveur local, qui est utilisé pour copier votre fichier local sur le serveur distant pour le sourcer. Le problème, c'est que cela ne se produit qu'après une connexion "réussie" avec l'hôte distant.

C'est-à-dire :

  1. Votre connexion à distance doit être ouverte et vivante
  2. Votre Shell distant n'a pas encore le fichier, donc il doit attendre jusqu'à ce que le fichier soit là, ergo sleep
  3. Vos utilisations locales sftp pour mettre votre fichier sur le serveur distant, le serveur distant se réveille à partir de sleep et source vos scripts.

C'est super hackish, j'aimerais savoir s'il existe une meilleure méthode.

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

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