Jak mogę uruchomić skrypt natychmiast po połączeniu przez SSH?

24

Zacząłem zadawać to pytanie, ale odpowiedziałem na nie, gdy miałem je otwarte. Zamierzam opublikować to pytanie, sprawdzić moje rozwiązanie i pozostawić je otwarte na inne potencjalne rozwiązania.

<historia>

Jestem użytkownikiem tmux i vim. Lubię zdalną pracę z vimem, ponieważ nie muszę się martwić, że maszyny deweloperskie Ubuntu przestaną działać, gdy film flash wywoła u mnie panikę jądra. Uruchomienie tmux oznacza, że ​​otwarte pliki czekają na mnie po ponownym uruchomieniu i mogę kontynuować od miejsca, w którym przestałem. Miałem problemy z uruchomieniem vima w sesji tmux, kiedy łączę się tak:

ssh example.com -t 'tmux attach'

Pojawiają się problemy z UTF-8, które nie pojawiają się podczas normalnego tworzenia powłoki i ręcznego dołączania do sesji tmux.

</ backstory>

Dlatego chcę metody wielokrotnego uruchamiania przy logowaniu ssh, która nie wpływa na żadną z innych rzeczy, które skonfigurowałem w moim .zshrc(lub twoim, .bashrcjeśli nadal używasz bash), które mogą być wymagane w moim środowisku programistycznym, co nie pojawiają się, gdy od czasu do czasu pracuję lokalnie na bardzo wspomnianej maszynie.

Connrs
źródło

Odpowiedzi:

13

Po uruchomieniu ssh example.comdemon ssh uruchamia dla ciebie powłokę logowania, a powłoka logowania odczytuje twoją ~/.profile( ~/.bash_profilelub ~/.zprofilelub w ~/.loginzależności od powłoki logowania). Po określeniu polecenia do uruchomienia zdalnego (z lub bez -t) demon ssh uruchamia zwykłą powłokę, więc .profilenie można go odczytać. Zaradzić:

ssh example.com -t '. /etc/profile; . ~/.profile; tmux attach'

Większość demonów ssh jest skonfigurowanych tak, aby odmawiać przesyłania zmiennych środowiskowych, z wyjątkiem LC_*. Jeśli example.compozwala na to demon ssh , możesz nadużyć LC_*zmiennej niestandardowej , aby automatycznie uruchomić tmux - umieść to w ~/.profile:

if [ -n "$LC_tmux_session" ] && tmux has -t "$LC_tmux_session"; then
  exec tmux attach -t "$LC_tmux_session"
elif [ -n "${LC_tmux_session+1}" ] && tmux has; then
  exec tmux attach
fi

następnie zaloguj się za pomocą LC_tmux_session= ssh example.comlub LC_tmux_session=session_name ssh example.com.

Ta odpowiedź zawiera więcej informacji na temat przekazywania zmiennych środowiskowych przez ssh.

Gilles „SO- przestań być zły”
źródło
Przyczyną, dla której nie używam, nie ssh example.com -t 'tmux attach'jest to, że mam problemy z ładowaniem środowiska, ale dlatego, że miałem problemy z wyświetlaniem znaków UTF-8; ten problem nie występuje podczas łączenia w tradycyjny sposób. Dlatego to pytanie dotyczy uruchamiania skryptów natychmiast po połączeniu przez SSH.
Connrs
Uwielbiam jednak twoje rozwiązanie. Eleganckie
połączono
@connrs: Czy masz problemy z UTF-8 nawet po uruchomieniu .profile? Zakładam, że problem był spowodowany niepoprawnie ustawionymi ustawieniami narodowymi na komputerze docelowym, które zostały naprawione /etc/profilelub .profilenaprawione. Problem z ustawieniami regionalnymi można prawdopodobnie rozwiązać za pomocą dodatkowych informacji.
Gilles „SO- przestań być zły”
Chciałem wrócić do biura, żeby to sprawdzić. Masz całkowitą rację, pozyskiwanie profilu / etc / wyzwala prawidłowe zachowanie. Naprawdę rozwiązałeś problem, który zmotywował mnie do zadania tego bardziej ogólnego pytania
Connrs,
6

Wcześniej doradzałem ustawienie PermitUserEnvironment yesi dodanie zmiennej środowiskowej ~/.ssh/environmentdo momentu, aż Eli Heady włączy się z lepszą sugestią w komentarzach poniżej.

Otwórz .zlogin(bash: .bash_profileitp.) I wprowadź następujące informacje:

if [[ "$SSH_CONNECTION" != "" && "$MY_SSH_CONNECTION" != "yes" ]]; then
    while true; do
        echo -n "Do you want to attach to a tmux session? [y/n]"
        read yn
        case $yn in
            [Yy]* ) MY_SSH_CONNECTION="yes" tmux attach; break;;
            [Nn]* ) break;;
            * ) echo "Please answer y/n";;
        esac
    done
fi

Inspiracja pochodzi z: Jak poprosić o dane wejściowe w skrypcie powłoki systemu Linux?

Zauważ, że użyłem tego .zloginpliku, ale możesz go użyć .zshrc, ale lubię dbać o porządek w plikach dot. Oddziela je, aby móc używać go na innych komputerach.

Zastąp pytanie pytaniem odpowiednim dla siebie i zastąp tym, MY_SSH_CONNECTION="yes" tmux attachco chcesz uruchomić w tym momencie.

Zwróć uwagę, jak skrypt ustawia się MY_SSH_CONNECTION="yes"przed tmux attachprzekazaniem go do tmux, ponieważ otworzy on również powłokę, która uzyska dostęp do tego samego skryptu powyżej i zapobiegnie jakiejkolwiek rekurencji.

Connrs
źródło
2
Użycie PermitUserEnvironment nie będzie możliwe w niektórych środowiskach ze względu na potencjalne konsekwencje dla bezpieczeństwa. SSH ustawia zmienną $ SSH_CONNECTION, która może być używana zamiast $ SSH_LOGIN w twoim .zlogin, eliminując potrzebę używania ~ / .ssh / environment. Coś takiego if [[ "$SSH_CONNECTION" != "" ]]powinno to zrobić.
Eli Heady
3

Sam dodaję to do moich plików .bash_profile:

if [ -z "$STY" ]; then
    reattach() { exec screen -A -D -RR ${1:+"$@"} ; }
fi
if [ -t 0 ]; then
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

To daje mi trochę czasu na przerwanie ponownego przyłączania się lub tworzenie sesji ekranowej. Nie działa w formatach „ssh system command” (które nie wywołują profilu ~ /.*). Funkcja powłoki jest skonfigurowana do ponownego przyłączenia, jeśli przerwam.

Arcege
źródło
Świetny! Udało mi się to *, wprowadzając zamiast tego bashrc, a następnie w każdym nowym oknie ekranu - po zmianie na .profile działało dobrze.
Hugo,
0

Możesz rozważyć uruchomienie

ssh remotehost -t screen -DR

i uruchom tam swoją sesję terminalową. Następnie możesz odłączyć ( ^A^D) i podłączyć ponownie później (również od innego klienta). Sprawi, że problem z nieinteraktywną inicjalizacją zniknie, ponieważ screen zachowuje pełne interaktywne sesje terminali (opcjonalnie również powłoki logowania, man screen(1) lub ^A?)

sehe
źródło
Jak wspomniano w moim pytaniu, używam tmux zamiast ekranu GNU do zarządzania moimi sesjami. A po załadowaniu -t 'tmux attach'mam problemy z vimem, które nie występują normalnie. Dlatego prawdziwe pytanie dotyczy uruchamiania skryptów w ssh connect zamiast zarządzania ekranem / sesją. Przepraszam, że nie
wyraziłem się
Przykro mi, wspomniałeś o Tmuxie, ale to nic dla mnie nie znaczyło. Dziękujemy za wspomnienie o nowym narzędziu!
dniu
0

Mówiąc konkretnie o sprawach UTF-8, jeśli dodasz

SendEnv LANG

I $LANGjest ustawiony na coś en_US.UTF-8na lokalnym końcu, a twój sshd na zdalnym końcu pozwala na SendEnvdyrektywę (z AcceptEnvin sshd_config), tmux na drugim końcu powinien to honorować. Przez jakiś czas miałem ten problem i trudno było go rozwiązać.

Chris W.
źródło
0

Jeśli chcesz, aby działał przy każdym połączeniu, możesz po prostu dodać tmux attachna dole swojego ~/.profilekomputera zdalnego.

linie są rozmyte
źródło