Czy mogę wykonać niektóre polecenia podczas rozpoczynania sesji ssh przed przejściem do trybu interaktywnego?
13
Kiedy zaczynam sesję ssh za pomocą polecenia ssh, wydaje mi się, że mam dwie opcje - domyślną sesję interaktywną z domyślną env i rozpoczynając od katalogu domowego - lub wykonać dowolne polecenie, ale nieinteraktywnie (nawet takie sztuczki ssh "command; command; bash -i -l"wydają się nie robić zbyt wiele dobrego). Dość często chcę interaktywnej sesji, ale przed tym coś się dzieje - zwykle zmiana katalogu, a czasem dostosowanie środowiska systemowego. Te rzeczy będą się różnić w zależności od sesji, więc nie mogę ich po prostu przykleić .bashrc.
Odpowiadam sam, ponieważ w końcu odkryłem tajemnicę. Ani -topcja ssh, ani -lopcja dla bashnie doprowadzą do samodzielnego zalogowania się do powłoki - ale w połączeniu działają.
ssh [email protected] -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'zmienia katalog, ustawia zmienne środowiskowe, a następnie uruchamia prawidłową powłokę logowania (jedyną różnicą, jaką do tej pory znalazłem, jest to, że /etc/motdnie jest wyświetlany w ten sposób - zwykle sshjest loginto odpowiedzialność lub odpowiedzialność, a nie bash- poza tym, że wszystko wydaje się pracować idealnie, a wszystkie zmienne środowiskowe są identyczne).
Te zmiany środowiska / katalogu następują po ssh, więc nie są ograniczone przez PermitUserEnvironmentpowiązane ustawienia (dokładnie zgodnie z planem), ale przed .bashrc/ .profileget. Ma to wady i zalety - trudniej jest po prostu przesłonić coś, co jest ustawione ze skryptów inicjujących bash, jak PS1, ale łatwiej jest spakować dokładnie odpowiednie wartości w sshwierszach poleceń i .profilewykonać ciężkie podnoszenie.
A jeśli jest to naprawdę konieczne, naprawdę łatwo jest wywołać bash, aby wykonać coś po .profilewierszu poleceń ssh [email protected] -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'- bardzo brzydkie, gdy tak to ułożysz, ale te alternatywne .profilepliki można wcześniej przygotować. (o ile wiem, bashma kilka lokalizacji kandydatów do .profileskryptu i wykona pierwszą znalezioną - . filenie ma takich automatycznych awarii, więc musisz sprawdzić, gdzie jest twoja normalność, profilejeśli chcesz to zrobić)
Wspaniale, dzięki za to! Chciałem znaleźć sposób na zalogowanie się na konto użytkownika zaraz po ssh'ing, a opcja „-t” sprawiła, że działało. Bez tej opcji twoja powłoka nie ma monitu, nie ma historii poleceń, umiera z SIGINT itp.
Ashoat
Ta odpowiedź jest naprawdę pomocna, ale brakuje ci kilku ;s od pierwszego ciągu logowania ssh. Nie pozwoli mi edytować twojej odpowiedzi, ponieważ nie zmieniam wystarczająco. Mam to do pracy ssh [email protected] -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'. Myślę, że to właśnie zamierzałeś.
Rob Kwasowski,
2
Edytuj .bashrc i dołącz ustawienia środowiska specyficzne dla SSH w:
if [ $SSH_TTY ]; then
...
fi
Umożliwi to dodanie ustawień specjalnie dla sesji SSH. „Oczywiście, jeśli wszystko, czego chcesz, to ustawić na początku dowolne zmienne środowiskowe, które różnią się w zależności od sesji, nie wiem, jak sprawić, by maszyna zgadywała je dla Ciebie oprócz pisania ich ... bez względu na wszystko, ty” Potrzebuję jakiegoś testowalnego warunku, na którym opiera się wybór ustawień.
Dodatkowo ssh odczytuje ~ / .ssh / environment i dodaje do środowiska wiersze formatu „VARNAME = wartość”, jeśli plik istnieje i użytkownicy mogą zmieniać swoje środowisko. Aby uzyskać więcej informacji, zobacz opcję PermitUserEnvironment w sshd_config (5).
który mówi:
PermitUserEnvironment
Określa, czy ~ / .ssh / environment i environment = opcje w ~ / .ssh / Author_keys są przetwarzane przez sshd (8). Domyślne ustawienie to „nie”. Włączenie przetwarzania środowiska może umożliwić użytkownikom ominięcie ograniczeń dostępu w niektórych konfiguracjach przy użyciu mechanizmów takich jak LD_PRELOAD.
Ta funkcja może być używana do warunkowego wykonywania instrukcji na twoim pilocie ~/.bashrcprzy użyciu ifstruktury zaproponowanej przez Mickeya .
;
s od pierwszego ciągu logowania ssh. Nie pozwoli mi edytować twojej odpowiedzi, ponieważ nie zmieniam wystarczająco. Mam to do pracyssh [email protected] -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'
. Myślę, że to właśnie zamierzałeś.Edytuj .bashrc i dołącz ustawienia środowiska specyficzne dla SSH w:
Umożliwi to dodanie ustawień specjalnie dla sesji SSH. „Oczywiście, jeśli wszystko, czego chcesz, to ustawić na początku dowolne zmienne środowiskowe, które różnią się w zależności od sesji, nie wiem, jak sprawić, by maszyna zgadywała je dla Ciebie oprócz pisania ich ... bez względu na wszystko, ty” Potrzebuję jakiegoś testowalnego warunku, na którym opiera się wybór ustawień.
źródło
Ze strony podręcznika
ssh
:który mówi:
Ta funkcja może być używana do warunkowego wykonywania instrukcji na twoim pilocie
~/.bashrc
przy użyciuif
struktury zaproponowanej przez Mickeya .źródło
Po prostu uruchom w ten sposób:
ssh -t yourdomain 'cd /yourpath; bash'
-t
: aby pojawił się monit; bash
: aby zwrócił kontrolę pomimo wykonania polecenia (tutajcd
) i wyjścia z sesji sshźródło