Oficjalnym sposobem wysyłania zmiennych środowiskowych z klienta na serwer jest SendEnv
i AcceptEnv
. Problem polega na tym, że do skonfigurowania potrzebujesz dostępu do roota na serwerze AcceptEnv
. Większość serwerów jest skonfigurowana tak, aby nie przyjmować żadnych określonych zmiennych lub tylko kilka z nich.
Znalazłem dwie sztuczki, aby przesłać zmienne środowiskowe z klienta na serwer, obie działają bez potrzeby dostępu do konta root na serwerze.
sztuczka pierwsza:
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME bash
to połączy się z serwerem, a następnie wykona polecenie SSH_ORIGIN=$USERNAME@$HOSTNAME bash
, z $USERNAME
i $HOSTNAME
już zastąpione po stronie klienta. następnie po stronie serwera możesz dalej przetwarzać informacje zawarte w zmiennej SSH_ORIGIN
.
-t
potrzebna jest inaczej bash zostanie uruchomiony na serwerze bez tty (spróbuj go widać).
niewielka modyfikacja pozwoli na tranzyt informacji w dłuższym łańcuchu ssh.
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME:$SSH_ORIGIN bash
dyskusja:
- bash jest uruchamiany jako interaktywna powłoka niezalogowana (
.profile
nie jest czytana).
- bash jest uruchamiany dwukrotnie (
.bashrc
jest odczytywany dwukrotnie). raz przez sshd i raz przez polecenie użytkownika.
- zawsze zacznie bash, ignorując domyślną powłokę na serwerze.
sztuczka druga:
najpierw musisz wygenerować klucz ssh i przenieść go ~/.ssh/authorized_keys
na serwer. następnie dodaj linię za pomocą command="$SHELL"
. zobacz stronę man sshd, aby uzyskać więcej informacji na ten temat.
połącz się z serwerem ssh za pomocą polecenia:
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME
połączy się to z serwerem, ale tym razem przypisanie zmiennej nie zostanie wykonane. zamiast tego ciąg jest przechowywany w zmiennej środowiskowej $SSH_ORIGINAL_COMMAND
. następnie ~/.ssh/authorized_keys
wykonywane jest polecenie podane w . gdy znajdziesz się w powłoce, możesz przetwarzać informacje zawarte w $SSH_ORIGINAL_COMMAND
.
jak wyżej, możesz zrobić to przechodnie:
ssh -t server SSH_ORIGIN=$USERNAME@$HOSTNAME:$SSH_ORIGIN
dyskusja:
- uruchomi domyślną powłokę na serwerze.
- zawsze uruchomi domyślną powłokę na serwerze. każde polecenie, które podasz ssh, zostanie zignorowane i zapisane w
$SSH_ORIGINAL_COMMAND
. jeśli chcesz wykonać polecenie za pomocą ssh, możesz użyć innego klucza ssh lub mieć plik inicjujący powłoki w celu wykrycia i wykonania $SSH_ORIGINAL_COMMAND
.