2010-07-13 16:59:57 +0000 2010-07-13 16:59:57 +0000
95
95

Hoe kan ik bij ssh'ing een omgevingsvariabele op de server instellen die van sessie tot sessie verandert?

Wanneer ik ssh in een server oproep, hoe kan ik dan een omgevingsvariabele doorgeven van de client naar de server? Deze omgevingsvariabele verandert tussen verschillende invocaties van ssh, dus ik wil niet elke keer dat ik een ssh call doe, $HOME/.ssh2/environment overschrijven. Hoe kan ik dit doen?

Antwoorden (8)

116
116
116
2010-07-13 19:25:13 +0000

Natuurlijk kun je de omgevingsvariabele binnen het commando instellen, maar je moet voorzichtig zijn met citeren: vergeet niet dat je shell je lokale commandoregel gaat parsen, en dan zal de shell op afstand de string die hij ontvangt gaan proberen.

Als je wilt dat een variabele op de server dezelfde waarde krijgt als op de client, probeer dan de SendEnv optie:

ssh -o SendEnv=MYVAR server.example.com mycommand

Dit vereist echter ondersteuning van de server. Met OpenSSH moet de naam van de variabele geautoriseerd worden in /etc/sshd_config.

Als de server alleen bepaalde specifieke variabelennamen toestaat, kun je daar omheen werken; een gebruikelijke opstelling laat bijvoorbeeld LC_* door, en je kunt het volgende doen:

ssh -o SendEnv=LC\_MYVAR server.example.com 'MYVAR=$LC\_MYVAR; unset LC\_MYVAR; export MYVAR; mycommand'

Als zelfs LC_* geen optie is, kun je informatie doorgeven in de TERM omgevingsvariabele, die altijd wordt gekopieerd (er kan echter een lengte limiet zijn). Je moet er nog steeds voor zorgen dat de shell op afstand de TERM variabele niet beperkt tot een bekend terminaltype. Geef de -t optie door aan ssh als je geen interactieve shell op afstand start.

env TERM="extra information:$TERM" ssh -t server.example.com 'MYVAR=${TERM%:\*}; TERM=${TERM##\*:}; export MYVAR; mycommand'

Een andere mogelijkheid is om de variabele direct in het commando te definiëren:

ssh -t server.example.com 'export MYVAR="extra information"; mycommand'

Dus, als je een lokale variabele doorgeeft:

ssh -t server.example.com 'export MYVAR='"'$LOCALVAR'"'; mycommand'

Pas echter op voor citeerproblemen: de waarde van de variabele wordt direct geïnterpoleerd in de shell snippet die aan de andere kant wordt uitgevoerd. Het laatste voorbeeld hierboven gaat ervan uit dat $LOCALVAR geen enkele aanhalingsteken bevat (').

12
12
12
2012-02-03 17:09:54 +0000

Als u de doelhost kunt beheren, kunt u sshd zo configureren dat uw lokale omgevingsvariabelen worden doorgegeven aan de doelhost.

Van de sshd_config man pagina:

PermitUserEnvironment
     Specifies whether ~/.ssh/environment and environment= options in
     ~/.ssh/authorized_keys are processed by sshd. The default is
     "no". Enabling environment processing may enable users to bypass
     access restrictions in some configurations using mechanisms such
     as LD_PRELOAD.

sshd configuratie staat meestal op /etc/ssh/sshd_config

6
6
6
2010-07-13 17:52:27 +0000

Dus, op je client, heb je een omgevingsvariabele, en je wilt dat die beschikbaar is voor het commando op afstand? Ik denk niet dat er een manier is om ssh het op magische wijze te laten doorgeven, maar je kunt waarschijnlijk iets als dit doen. In plaats van, laten we zeggen:

ssh remote.host my_command

Je kunt dit doen:

ssh remote.host env ENV_VAR=$ENV_VAR my_command
4
4
4
2019-06-12 10:45:04 +0000

Op je lokale client, in je ~/.ssh/config kun je SetEnv toevoegen, bijv.

Host myhost
  SetEnv FOO=bar

Opmerking: Controleer man ssh_config.

Zorg er dan op de server voor dat de client bepaalde omgevingsvariabelen mag doorgeven in je /etc/ssh/sshd_config config bestand:

AcceptEnv LANG LC_* FOO BAR*

Note: Controleer man sshd_config.

3
3
3
2018-05-14 14:36:55 +0000

Het antwoord van @emptyset (dat bij mij niet werkte) leidde me naar dit antwoord:

Je kunt dit commando toevoegen aan je ~/.ssh/authorized_keys bestand:

command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>

export VARIABLE=<something> sloot onmiddellijk af, en de SSH verbinding werd gesloten (waardoor ik van de server werd afgesloten), terwijl /usr/bin/env ... $SHELL je standaard shell zal draaien met een gewijzigde omgeving.

1
1
1
2010-07-13 17:15:31 +0000

U kunt proberen een aangepast commando op te roepen, ervan uitgaande dat u ssh login zonder wachtwoord hebt ingesteld. Bewerk op de server uw ~/.ssh/authorized_keys entry die overeenkomt met de sleutel van uw client:

command="export VARIABLE=<something>" ssh-rsa <key>

Kijk op deze link in de sectie Forced Command voor een beetje meer details.

1
1
1
2015-08-28 16:55:01 +0000

Ik maakte een aangepaste build van OpenSSH voor een apparaat met een cramfs in de home directory en /etc (Cram FS is alleen-lezen) dus ~/.ssh/environment zou niet werken zonder de hele FS opnieuw te bouwen en dit waren in het veld ingezette apparaten (Embedded Systems vandaar het gebruik van CRAMFS). U kunt in sshd_config de locatie van het authroized_keys bestand opgeven maar om de een of andere reden werkt environment= alleen voor omgevingsvariabelen in ~/.ssh/authroized_keys. Het bewerken van /etc/profile was geen optie en ik moest ssh laden in een niet-standaard directory. In session.c na de child_set_env(… “MAIL”…) voeg je gewoon de enviroment variabelen toe die je nodig hebt (Dit is een hack, ik weet het…) maar voor het geval iemand hardcoded envs nodig heeft voor een sessie als je compileert vanaf broncode kun je dit doen. TGI-FLOSS

0
0
0
2019-04-11 17:12:11 +0000

slechts één eenvoudig commando :

ssh -t your_host_or_ip 'export some_var_name=whatever_you_want; bash'