Normalnie, jeśli przekażesz polecenie ssh w ten sposób
ssh [email protected] 'some-command.sh'
Otrzymujesz nieinteraktywną sesję i ssh kończy się, gdy tylko polecenie (lub skrypt lub cokolwiek innego) zostanie uruchomione. Jak mogę uzyskać sesję interaktywną, a jednocześnie uruchomić polecenie, które określiłem na moim komputerze lokalnym? Na przykład chciałbym móc otworzyć ekran i zrestartować określoną sesję ekranu:
ssh [email protected] 'screen -r 12345'
ale nie jest to dozwolone, zwracając błąd „Musi być podłączony do terminala”. co, jak zakładam, oznacza w zasadzie „należy wywołać to polecenie z interaktywnej powłoki”.
Jako kolejny przykład używam mnóstwa maszyn w pracy, które często wymagają ode mnie korzystania ze wspólnego konta, aby mieć prawa do robienia pewnych rzeczy (tak, wiem: zły pomysł, ale nie obwiniaj mnie, nie ustawiłem rzeczy, które sposób) i zwykle mają domyślną powłokę ksh. Chciałbym się zalogować, przełączyć na bash (lub zsh) i pobrać plik .bash_profile (lub .zshrc) z mojego konta. Byłoby to łatwe, gdybym mógł ustanowić interaktywną sesję ssh i przekazać polecenie zdalnej maszynie, aby uruchomiło się po zalogowaniu.
Mam na myśli bardzo nieprzyzwoite (i niesprawdzone) rozwiązanie, które opublikuję, ale mam nadzieję, że ktoś zna lepszy sposób.
AKTUALIZACJA: dla tych, którzy nie zdawali sobie z tego sprawy, nie planuję robić tego wszystkiego ręcznie, więc powiedzenie mi, aby otworzyć sesję interaktywną, a następnie zrobić to ręcznie, w rzeczywistości nic nie rozwiązuje.
2. AKTUALIZACJA: Próbuję jeszcze raz wyjaśnić: próbuję uruchomić (dowolne) polecenia na serwerze (programowo określone na kliencie), ale potem mam otwartą sesję interaktywną, na którą wpływ mają wszystkie polecenia programowe.
echo "command" | ssh user@remote_host
Odpowiedzi:
Możesz wypróbować następującą komendę, aby uruchomić bash i uzyskać własny profil podczas ssh:
źródło
-t
Przełącznik rozwiązuje problemu pytającego jest zscreen
również.ssh -t www.dev "echo 'hi there'"
, połączenie zostanie natychmiast zamknięte po wykonaniu polecenia.Opierając się na odpowiedzi dogbane, kompletne rozwiązanie wygląda następująco:
Tutaj używam
-t
do wymuszenia alokacji pseudoterminalu, która jest wymagana dla interaktywnej powłoki. Następnie wykonuję dwa polecenia na serwerze: najpierw to, co chciałem zrobić przed otwarciem powłoki interaktywnej (w moim przypadku zmiana katalogu na określony folder), a następnie samą powłokę interaktywną. bash widzi, że ma pseudo-terminal i reaguje interaktywnie.Pojedyncze cudzysłowy zapewniają, że cała rzecz jest przekazywana do zdalnego serwera jako polecenie uruchamiane przez domyślną powłokę.
Jeszcze raz dziękuję dogbane za dostarczenie niezbędnej wskazówki
-t
. Kiedyś rozwiązywałem ten problemexpect
, którym jest na pewno zabicie myszy armatą. (:źródło
Wypróbuj to rozwiązanie.
Logowanie jest interaktywne, a twoje polecenie jest przekazywane tak, jakbyś wpisał je w interaktywnym wierszu poleceń. Sesja kończy się tak, jakbyś wpisał
źródło
ssh
.-t
lub własnego pliku bash. +1Użyj ssh -X, aby użyć cmd termIO.
Ponadto - możesz połączyć swoje cmd jak „ssh 'source ~ / .bashrc && cd && do” ”
źródło
dlaczego nie zainstalować Odłącz na zdalnym systemie i użyj:
źródło
detach
,ls
nie przechowuje sesję otwartą i odłączać bez drukowania wyjściels
ale to nadal prowadzony.Odpowiedź laggingreflex jest bliska ... Zmieniłbym to w następujący sposób:
Niestety, prawdopodobnie nie spodoba ci się sposób, w jaki to działa, ponieważ „cat” buforuje wiersze, które wypisuje na standardowe wyjście ... Jeśli stworzymy skrypt o nazwie „echo-cat”, który wygląda mniej więcej tak:
uzyskamy ten sam wynik bez buforowania:
To prawdopodobnie zbliży Cię do celu ...
źródło
To jest kludgey i niesprawdzone, ale myślę, że powinno działać.
Utwórz skrypt o nazwie (np.) Zdalny starter, który pobiera cytowany argument po argumencie użytkownik @ host:
Skrypt ten powinien najpierw zapisać cytowane polecenie (bez cudzysłowów) w pliku o nazwie (np.)
.onetime
Na zdalnym komputerze, a następnie uruchomić zwykłe polecenie ssh, tym razem nie przekazując żadnego polecenia do uruchomienia na zdalnym komputerze. (Jeśli uruchamiasz ssh uż[email protected] z poziomu skryptu, może działać uruchomienie exec ssh uż[email protected]).Aby to zadziałało, komputer zdalny musi
.onetime
pobierać źródła z pliku .bash_profile lub .zshrc lub cokolwiek innego. Po uruchomieniu.onetime
powinien zostać usunięty.onetime
, aby plik nie był uruchamiany następnym razem, gdy wykonujesz regularne logowanie.źródło