Passando definições de variáveis para shells específicos no ssh

1

Eu gostaria de fazer o ssh em uma máquina com uma configuração pré-definida, especificamente em zsh.

Para fazer isso, tentei fazer o seguinte do cliente (inspirado por esta resposta ):

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

e depois tenho o seguinte .zshrc no servidor:

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

Isso não parece funcionar. Como posso logar com um shell específico ao passar o valor para uma variável de shell no shell remoto?

    
por Amelio Vazquez-Reina 07.10.2015 / 01:50

2 respostas

6

Por padrão, a única variável de ambiente transmitida por uma conexão SSH é TERM . Você pode empacotar informações lá, mas você precisa ter certeza de que ele será descompactado no lado do servidor. O cliente pode transmitir outras mensagens, mas o servidor precisa ser configurado para aceitá-las com uma diretiva AcceptEnv em /etc/sshd_config . Sob o Debian e a maioria dos derivados (Ubuntu, Mint,…) todas as variáveis cujo nome começa com LC_ também são aceitas pelo servidor SSH. Essas variáveis são convencionalmente usadas para configurações de localidade, mas você pode usar uma das suas próprias para passar outra coisa. Se o seu servidor permitir, você pode simplesmente escrever

LC_STARTUP_OPTION=A ssh

Outra possibilidade é execute um comando baseado na chave de autenticação do usuário (isso requer apenas o controle de ~/.ssh/authorized_keys , não a configuração do sshd).

Se você não for capaz de transmitir variáveis de ambiente, você pode configurá-lo na linha de comando e executar um shell interativo, como você está fazendo. Como você está executando um novo shell (isso é necessário porque você não pode especificar um comando inicial para executar e obter um shell interativo), isso precisa ser uma variável de ambiente, não uma variável de shell.

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

Ainda outra abordagem é alimentar alguns dados para o shell através de sua entrada padrão e, em seguida, redirecionar a entrada padrão para o 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
~% 

Apesar das mensagens de erro sobre não ser capaz de inicializar o terminal, o zsh parece lidar adequadamente com a parte interativa da sessão.

    
por 07.10.2015 / 04:19
3

Você poderia export a definição da variável, para que a definição da variável seja herdada pelo zsh process:

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

Ou use env :

$ exec env foo=bar zsh
$ echo $foo           
bar
    
por 07.10.2015 / 01:55

Tags