Oczywiście, możesz ustawić zmienną środowiskową wewnątrz polecenia, jednakże będziesz musiał uważać na cytowanie: pamiętaj, że twoja powłoka będzie parsować twój lokalny wiersz poleceń, a następnie zdalna powłoka będzie się posługiwać łańcuchem, który otrzyma.
Jeśli chcesz, by zmienna miała taką samą wartość na serwerze jak na kliencie, spróbuj opcji SendEnv
:
ssh -o SendEnv=MYVAR server.example.com mycommand
Wymaga to jednak wsparcia ze strony serwera. W OpenSSH, nazwa zmiennej musi być autoryzowana w /etc/sshd_config
.
Jeśli serwer zezwala tylko na pewne określone nazwy zmiennych, możesz to obejść; na przykład wspólna konfiguracja pozwala na LC_*
i możesz zrobić co następuje:
ssh -o SendEnv=LC\_MYVAR server.example.com 'MYVAR=$LC\_MYVAR; unset LC\_MYVAR; export MYVAR; mycommand'
Jeśli nawet LC_*
nie jest opcją, możesz przekazać informacje w zmiennej środowiskowej TERM
, która jest zawsze kopiowana (może jednak istnieć limit długości). Nadal będziesz musiał się upewnić, że zdalna powłoka nie ogranicza zmiennej TERM
do oznaczania znanego typu terminala. Przekaż opcję -t
do ssh jeśli nie uruchamiasz zdalnej powłoki interaktywnej.
env TERM="extra information:$TERM" ssh -t server.example.com 'MYVAR=${TERM%:\*}; TERM=${TERM##\*:}; export MYVAR; mycommand'
Inną możliwością jest zdefiniowanie zmiennej bezpośrednio w poleceniu:
ssh -t server.example.com 'export MYVAR="extra information"; mycommand'
W ten sposób, jeśli przekazujemy zmienną lokalną:
ssh -t server.example.com 'export MYVAR='"'$LOCALVAR'"'; mycommand'
Należy jednak uważać na problemy z cytowaniem: wartość zmiennej będzie interpolowana bezpośrednio do snippetu powłoki wykonywanego po stronie zdalnej. Ostatni przykład powyżej zakłada, że $LOCALVAR
nie zawiera żadnych pojedynczych cudzysłowów ('
).