A maneira oficial de enviar variáveis de ambiente de cliente para servidor é através de SendEnv
e AcceptEnv
. O problema é que você precisa de acesso root no servidor para configurar AcceptEnv
. A maioria dos servidores está configurada para aceitar não ou apenas algumas variáveis predeterminadas.
Eu encontrei dois truques para enviar variáveis de ambiente de cliente para servidor, ambos funcionam sem precisar de acesso root no servidor.
enganar um:
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME bash
isso conectará ao servidor e executará o comando SSH_ORIGIN=$USERNAME@$HOSTNAME bash
, com $USERNAME
e $HOSTNAME
já substituídos no lado do cliente. em seguida, no lado do servidor, você pode processar ainda mais as informações contidas na variável SSH_ORIGIN
.
o -t
é necessário caso contrário, o bash será iniciado no servidor sem um tty (experimente, você verá).
uma ligeira modificação permitirá passar a informação de forma transitiva por uma cadeia ssh mais longa.
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME:$SSH_ORIGIN bash
discussão:
- o bash é iniciado como um shell interativo de não-login (
.profile
não é lido). - o bash é executado duas vezes (
.bashrc
é lido duas vezes). uma vez por sshd e uma vez pelo comando do usuário. - ele sempre iniciará o bash, ignorando seu shell padrão no servidor.
truque dois:
Primeiro você deve gerar uma chave ssh e transferi-la para ~/.ssh/authorized_keys
no servidor. em seguida, prefixar a linha com command="$SHELL"
. veja a página de manual do sshd para mais informações sobre isso.
conecte-se ao servidor ssh usando o comando:
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME
isto irá se conectar ao servidor, mas desta vez a atribuição da variável não será executada. em vez disso, a string é armazenada na variável de ambiente $SSH_ORIGINAL_COMMAND
. então o comando fornecido em ~/.ssh/authorized_keys
é executado. Quando você estiver no shell, poderá processar as informações contidas em $SSH_ORIGINAL_COMMAND
.
como acima, você pode tornar isso transitivo:
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME:$SSH_ORIGIN
discussão:
- ele iniciará o shell padrão no servidor.
- sempre iniciará o shell padrão no servidor. qualquer comando que você der ao comando ssh será ignorado e armazenado em
$SSH_ORIGINAL_COMMAND
. Se você quer executar um comando sobre o ssh, você pode usar uma chave ssh diferente ou ter seu arquivo init do shell para detectar e executar$SSH_ORIGINAL_COMMAND
.