Passer des définitions de variables à des shells spécifiques dans ssh

Je voudrais ssh à une machine avec un paramètre prédéfini, en particulier dans zsh.

Pour ce faire, j'ai essayé de faire ce qui suit auprès du client (inspiré par cette réponse ):

$ ssh -t machine@domain "STARTUP_OPTION='A'; exec /path/to/zsh;" 

et puis j'ai le suivant .zshrc dans le server:

 if [ "$STARTUP_OPTION" = "A" ]; then echo "Logging in with A" fi 

Cela ne semble pas fonctionner. Comment puis-je me connecter avec un shell spécifique en passant la valeur d'une variable shell dans le shell distant?

Par défaut, la seule variable d'environnement transmise via une connection SSH est TERM . Vous pouvez y ranger des informations, mais vous devez être sûr qu'il sera déballé du côté server. Le client peut transmettre d'autres messages, mais le server doit être configuré pour les accepter avec une directive AcceptEnv dans /etc/sshd_config . Sous Debian et la plupart des dérivés (Ubuntu, Mint, …) toutes les variables dont le nom commence par LC_ sont également acceptées par le server SSH. Ces variables sont classiquement utilisées pour les parameters régionaux, mais vous pouvez utiliser l'une des vôtres pour passer autre chose. Si votre server le permet, vous pouvez simplement écrire

 LC_STARTUP_OPTION=A ssh 

Une autre possibilité consiste à exécuter une command basée sur la key d'authentification de l'user (ceci ne nécessite que le contrôle de ~/.ssh/authorized_keys , pas la configuration de sshd).

Si vous n'êtes pas en mesure de transmettre des variables d'environnement, vous pouvez le définir sur la command line, puis exécuter un shell interactif, comme vous l'avez fait. Comme vous exécutez un nouveau shell (nécessaire parce que vous ne pouvez pas spécifier une command initiale à exécuter et get un shell interactif), il doit s'agir d'une variable d'environnement et non d'une variable de shell.

 ssh -t machine@domain 'export STARTUP_OPTION="A"; exec /path/to/zsh' 

Encore une autre approche consiste à alimenter certaines données vers le shell via son input standard, puis redirect l'input standard vers le terminal.

 ssh -t localhost 'echo "echo foo; exec </dev/tty" | exec zsh -i' stdin: is not a tty stty: standard input: Inappropriate ioctl for device ~% 

Malgré les messages d'erreur concernant l'impossibilité d'initialiser le terminal, zsh semble faire face correctement à la partie interactive de la session.

Vous pouvez export la définition de variable afin que la définition de variable soit héritée par le process zsh :

 $ export foo=bar $ exec zsh $ echo $foo bar 

Ou utilisez env :

 $ exec env foo=bar zsh $ echo $foo bar