Chciałbym zrobić coś takiego ssh example.com 'ls'
Jednak na stronie ssh:
Jeśli podano polecenie, jest ono wykonywane na zdalnym hoście zamiast powłoki logowania.
Tak więc dzieje się tak, że ls
wyświetla swoje wyjście, a następnie ssh wychodzi.
Nie mogę zrozumieć, jak otworzyć pełną powłokę logowania, a następnie uruchomić polecenie w tej powłoce. Pozostawienie otwartej powłoki po uruchomieniu polecenia. Jakbym ręcznie wykonał następujące czynności:
localhost$ ssh example.com
example.com$ ls
/folder1
/folder2
example.com$ _
Jakieś pomysły?
ssh example.com 'ls;bash'
?Odpowiedzi:
Po prostu powiedz bash, aby wykonał,
ls
a następnie sam w powłoce logowaniaźródło
screen
. W przeciwnym razie wydaje się, że robi to, co próbowałem zrobić.-t
Wymuś alokację pseudoterminalową. Można to wykorzystać do uruchamiania dowolnych programów ekranowych na zdalnym komputerze. Jest nieco bardziej odpowiedni niżbash -i
.exec
Nie jest tworzony nowy proces.-l
szuka ~ / .bash_profile, ~ / .bash_login i ~ / .profile, w tej kolejności oraz odczytuje i wykonuje polecenia z ... Bez tego prawdopodobnie nie można uruchomić skryptów / poleceń z katalogu ~ / bin, ponieważ ten kod z ~ / .profile nie zostanie wykonane bez-l
flagi:źródło
bash
aby na to pozwolić.exec bash
lubexec $SHELL
W swoim komentarzu do odpowiedzi fons mówisz, że nie działa podczas używania
screen
.Czy mógłbyś to rozwinąć? Patrząc na kod źródłowy openssh, sshd wykonuje polecenie, wywołując
Tak więc, na przykład, jeśli domyślna powłoka jest
screen
, to nie będzie działać dobrze, bo wszystko, coscreen
„s-c
flag prostu nadpisuje ITS.scrreenrc
. Tak więc naprawdę nie ma możliwości wysłania poleceń do ekranu, jeśli jest to domyślna powłoka. Będziesz musiał uruchomić screen jako polecenie wydane ssh, ale z domyślną powłoką, która nie jest screenem .Jeśli to właśnie próbujesz zrobić, myślę, że wszystko stanie się naprawdę dziwne, ponieważ
screen
zamknie także okna za pomocą nieinteraktywnych programów, więc będziesz musiał zrobić podobną sztuczkę jak fony, ale o jeden poziom głębiej. SO, z np. / Bin / bash (a nie screen) jako domyślną powłoką Coś takiego:Który powinien - wziąć głęboki oddech - ssh do hosta, uruchomić bash -c z poleceniem screen, co spowoduje utworzenie nowego okna. Gdyby to okno właśnie otworzyło ls, skończyłoby się, a ekran skończyłby się, więc używamy sztuczki fonsa w nowym oknie ekranu .
Myślę, że to zadziała, jeśli to właśnie próbowałeś zrobić;)
źródło
screen
w tej sytuacji, polega na tym, że zwykle ładuję go zexec screen -RR
mojego.profile
. Oznacza to, żebash -l
próbuje załadować ekran, który zrzuca resztę. wygląda na to, że mogę to obejść, usuwając „-l” zarówno w rozwiązaniach twoich, jak i @fons (twoje wtedy mnie zostawiascreen
). Ale to trochę dziwne.Wiele opcji -t wymusza alokację tty, nawet jeśli ssh nie ma lokalnego tty:
źródło