Chcę mieć możliwość uruchomienia polecenia z mojego komputera za pomocą ssh i przejścia przez zmienną środowiskową $BUILD_NUMBER
Oto, czego próbuję:
ssh [email protected] '~/tools/myScript.pl $BUILD_NUMBER'
$BUILD_NUMBER
jest ustawiana na maszynie wykonującej wywołanie ssh, a ponieważ zmienna nie istnieje na zdalnym hoście, nie jest pobierana.
Jak przekazać wartość $BUILD_NUMBER
?
Odpowiedzi:
Jeśli użyjesz
ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"
zamiast
ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'
Twoja powłoka interpoluje
$BUILD_NUMBER
przed wysłaniem polecenia do zdalnego hosta.źródło
Zmienne w apostrofach nie są oceniane. Użyj cudzysłowów:
ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"
Powłoka rozwinie zmienne w cudzysłowach, ale nie w apostrofach. To zmieni się w żądany ciąg przed przekazaniem do
ssh
polecenia.źródło
(Ta odpowiedź może wydawać się niepotrzebnie skomplikowana, ale o ile wiem, jest łatwa do rozszerzenia i solidna w odniesieniu do białych znaków i znaków specjalnych).
Możesz przesyłać dane bezpośrednio przez standardowe wejście
ssh
polecenia iread
to ze zdalnej lokalizacji.W poniższym przykładzie
ssh
wiersz zakończony znakiem null, podając nazwę i wartość zmiennej.shh
poleceniu przechodzimy przez te wiersze, aby zainicjować wymagane zmienne.# Initialize examples of variables. # The first one even contains whitespace and a newline. readonly FOO=$'apjlljs ailsi \n ajlls\t éjij' readonly BAR=ygnàgyààynygbjrbjrb # Make a list of what you want to pass through SSH. # (The “unset” is just in case someone exported # an associative array with this name.) unset -v VAR_NAMES readonly VAR_NAMES=( FOO BAR ) for name in "${VAR_NAMES[@]}" do printf '%s %s\0' "$name" "${!name}" done | ssh [email protected] ' while read -rd '"''"' name value do export "$name"="$value" done # Check printf "FOO = [%q]; BAR = [%q]\n" "$FOO" "$BAR" '
Wynik:
FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]
Jeśli ich nie potrzebujesz
export
, powinieneś móc użyćdeclare
zamiastexport
.Bardzo uproszczona wersja (jeśli nie potrzebujemy rozszerzalność, pojedynczą zmienną procesu itp) wyglądałby następująco:
$ ssh [email protected] 'read foo' <<< "$foo"
źródło
Lista akceptowanych zmiennych środowiskowych na dysku SSHD domyślnie obejmuje
LC_*
. A zatem:LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN' 1.2.3
źródło
Możliwe jest również jawne przekazywanie zmiennych środowiskowych przez ssh. Wymaga konfiguracji po stronie serwera, więc nie jest to uniwersalna odpowiedź.
W moim przypadku chciałem przekazać klucz szyfrowania repozytorium kopii zapasowych do polecenia na serwerze kopii zapasowych bez przechowywania tego klucza, ale zwróć uwagę, że każda zmienna środowiskowa jest widoczna w
ps
! Rozwiązanie polegające na przekazaniu klucza na stdin również działałoby, ale uznałem je za zbyt kłopotliwe. W każdym razie, oto jak przekazać zmienną środowiskową przez ssh:Na serwerze przeprowadź edycję
sshd_config
pliku, zazwyczaj/etc/ssh/sshd_config
i dodajAcceptEnv
dyrektywę pasującą do zmiennych, które chcesz przekazać. Zobaczman sshd_config
. W moim przypadku chcę przekazać zmienne do kopii zapasowej Borg, więc wybrałem:Teraz na kliencie użyj
-o SendEnv
opcji wysyłania zmiennych środowiskowych. Poniższy wiersz polecenia ustawia zmienną środowiskową,BORG_SECRET
a następnie flaguje ją do wysłania do komputera klienckiego (wywoływanebackup
). Następnie działaprintenv
tam i filtruje dane wyjściowe pod kątem zmiennych BORG:źródło
LC_*
dozwolone zmienne do wysłania, więc po prostu użyj$LC_TvE_foo
lub$LC_BORG_SECRET
po prostu upewnij się, że nie "kolidujesz" z wbudowaną zmienną.Jak udzielono wcześniej, nie musisz ustawiać zmiennej środowiskowej na zdalnym hoście. Zamiast tego możesz po prostu wykonać meta-rozwinięcie na hoście lokalnym i przekazać wartość do hosta zdalnego.
ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'
Jeśli naprawdę chcesz ustawić zmienną środowiskową na zdalnym hoście i jej używać, możesz użyć
env
programussh [email protected] "env BUILD_NUMBER=$BUILD_NUMBER ~/tools/run_pvt.pl \$BUILD_NUMBER"
W tym przypadku jest to trochę przesada i uwaga
env BUILD_NUMBER=$BUILD_NUMBER
przeprowadza ekspansję meta na lokalnym hościeBUILD_NUMBER
zmienna środowiskowa będzie używana przezzdalną powłokę
źródło
Wyjdź ze zmiennej, aby uzyskać dostęp do zmiennych poza sesją ssh: ssh [email protected] "~ / tools / myScript.pl \ $ BUILD_NUMBER"
źródło
'$FOO'
jest równoważne"\$FOO"
. pytanie brzmiało „jak przekazać zmienną powłoki za pomocą SSH?”. Jak już stwierdził @PatrickTrentin, nie jest to poprawna odpowiedź, ponieważBUILD_NUMBER
zmienna środowiskowa nie jest ustawiana zdalnie.