Modifique as variáveis persistentes em um host do servidor remoto usando 'ssh' do host do cliente

0

Como o título diz, eu quero modificar variáveis de ambiente em um servidor remoto usando 'ssh'.

Minha primeira tentativa foi:

$ ssh mysvr -l sikaiwei "getId=$ORANGE; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; echo 'getId is '+$getId;"

Primeiro, eu não defini $ ORANGE no host do servidor, mas definido $ ORANGE como "1" no cliente, e eu tenho:

1
1
getId is +

Observe que o comando está captando o valor do cliente de $ ORANGE, e a atualização ( ORANGE+1 ) não está acontecendo.

Em seguida, removi a definição $ ORANGE no host do cliente, e definiu $ ORANGE no servidor, colocando um comando no meu .bash_profile . Mas

$ ssh mysvr -l sikaiwei "getId=$ORANGE; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; echo 'getId is '+$getId;"

resultou em



getId is +

Não é possível imprimir o valor de $ ORANGE que tentei inicializar no host do servidor! Então eu tentei isso:

$ ssh mysvr -l sikaiwei ". .profile; getId=$ORANGE; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; echo 'getId is '+$getId;"


getId is +

Ainda não funciona.

Eu tentei usar '..' (aspas simples) em vez de ".." (aspas duplas) como você disse, mas não imprime nada ...

$ ssh myth@mysvr 'echo orangeis $ORANGE'
orangeis 

Eu quero imprimir

 getId=1; echo 1; ORANGE=2; echo 2; …

em vez de

 getId=; echo ; ORANGE=1; echo ; …

Então, como posso usar o valor $ ORANGE do host do servidor em vez do valor do cliente?

Minha máquina servidor roda o Windows, mas instalei o Cygwin. Minha máquina cliente executa o Linux.

Edit: Eu encontrei parte do problema: eu estava definindo $ ORANGE em ~/.bash_profile no host do servidor, e eu posso obter valor de $ ORANGE usando "echo $ ORANGE" em um interativo shell (Cygwin), mas isso não afetava as strings de comando ssh . Por exemplo, não recebo nada quando o host do meu cliente usa

$ ssh sikaiwei@mysvr 'echo orange is $ORANGE'
orange is

Assim, não obtenho o valor de $ ORANGE que faço em uma sessão no servidor. O . .profile que adicionei não ajudou. Mas se eu

$ ssh sikaiwei@mysvr '. ~/.bash_profile;echo orange is $ORANGE'
orange is 4

Eu tenho o valor!

Ah, esqueci de mencionar: quero que essas variáveis no servidor sejam persistentes. Em outras palavras, se eu executar um comando ssh que altera o valor de $ ORANGE de 4 para 42, então eu quero que $ ORANGE seja 42 quando eu faço outro comando ssh .

    
por orange 19.12.2013 / 03:58

1 resposta

0

O problema é que as variáveis do shell (das quais variáveis de ambiente são um subconjunto ou variante) que são citadas entre aspas duplas ( "…" ) são processadas imediatamente. Então, se ORANGE estiver definido como 1 localmente, como você relata ter feito em sua primeira experiência , e você digita

… ssh … "getId=$ORANGE; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; …"

ssh está recebendo

getId=1; echo 1; ORANGE=2; echo 1; …

E, se ORANGE não estiver definido localmente, como você relata ter feito sua segunda experiência , ssh está recebendo

getId=; echo ; ORANGE=1; echo ; …

Para enviar o comando para o sistema remoto como você o digitou, complete com cifrões, então ele será processado pelo shell no sistema remoto, envolva-o entre aspas simples ( '…' ).

Por exemplo, se você disser

… ssh … 'echo orangeis $ORANGE'

então ssh está vendo

echo orangeis $ORANGE

e enviando para o sistema remoto. Isso faz com que o shell no sistema remoto seja enviado para

orangeis 

(com um espaço no final) porque você não fez nada para dar um valor a ORANGE (ou, se você fez alguma coisa, não funcionou).

Você diz

I want to print

  getId=1; echo 1; ORANGE=2; echo 1; …

que claramente não é o que você quer dizer. Se você quer dizer que quer imprimir

getId=1
1
2
  ︙

tente algo como

… ssh … 'ORANGE=1; getId="$ORANGE"; echo "getId=$getId"; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; …"


Você refinou sua pergunta (nos comentários) para indicar que deseja manipular as variáveis de shell / ambiente no servidor remoto e que os valores alterados persistem de uma sessão para outra . Para fazer isso, você precisará armazenar explicitamente os valores em algum lugar (no servidor). Uma maneira simples de salvar um valor é executar

echo "$ORANGE" > orange.txt

Você pode recuperar esse valor com um comando como

read ORANGE < orange.txt

ou

ORANGE=$(cat orange.txt)

Uma abordagem ligeiramente diferente seria salvar seu valor com

echo "ORANGE=\"$ORANGE\"" > value.sh

e, em seguida, recupere-o com

. value.sh

IMNSHO, não faz sentido usar seu .bash_profile para armazenar esses valores se você for modificá-los com frequência.

Observe que você deve usar >> para anexar a um arquivo e >| para sobrescrever um arquivo existente.

    
por 19.12.2013 / 04:42