To jest kolejne pytanie: Jak używać ssh w skrypcie powłoki? pytanie. Jeśli chcę wykonać polecenie na zdalnym komputerze, który działa w tle na tym komputerze, w jaki sposób mogę zwrócić polecenie ssh? Kiedy próbuję po prostu wstawić znak ampersand (&) na końcu polecenia, po prostu się zawiesza. Dokładna forma polecenia wygląda następująco:
ssh user@target "cd /some/directory; program-to-execute &"
Jakieś pomysły? Należy zwrócić uwagę na to, że logowanie do komputera docelowego zawsze tworzy baner tekstowy i mam skonfigurowane klucze SSH , więc hasło nie jest wymagane.
/dev/null
.< /dev/null
znaczy? Dzięki.To był dla mnie najczystszy sposób: -
Jedyne, co działa po tym, to rzeczywiste polecenie na zdalnym komputerze
źródło
-n
nie jest potrzebne, jak-f
sugeruje-n
ssh -f
pozostawia proces ssh podłączony, tylko w tle. Rozwiązania / dev / null pozwalają ssh na szybkie rozłączenie, co może być preferowane.Przekieruj fd's
Wyjście musi zostać przekierowane, za pomocą
&>/dev/null
którego przekierowuje zarówno stderr, jak i stdout do / dev / null i jest synonimem>/dev/null 2>/dev/null
lub>/dev/null 2>&1
.Parantheses
Najlepszym sposobem jest użycie
sh -c '( ( command ) & )'
wszędzie tam, gdzie polecenie jest czymkolwiek.Nohup Shell
Możesz także użyć nohup bezpośrednio do uruchomienia powłoki:
Niezły start
Inną sztuczką jest użycie nicea do uruchomienia polecenia / powłoki:
źródło
nohup
i dlaczego i kiedy chcesz je wykorzystaćnice
? Myślę, że wiele by to dodało do tej odpowiedzi.Jeśli nie możesz / nie możesz pozostawić otwartego połączenia, możesz użyć ekranu , jeśli masz uprawnienia do jego zainstalowania.
Aby odłączyć sesję ekranu: ctrl-a d
Aby wyświetlić listę sesji ekranowych:
Aby ponownie dołączyć sesję:
Pamiętaj, że screen może również tworzyć wiele powłok w ramach każdej sesji. Podobny efekt można uzyskać dzięki tmux .
Aby odłączyć sesję tmux: ctrl-b d
Aby wyświetlić listę sesji ekranowych:
Aby ponownie dołączyć sesję:
Domyślny klucz kontrolny tmux, ' ctrl-b', jest nieco trudny w użyciu, ale istnieje kilka przykładowych konfiguracji tmux dostarczanych z tmux, które możesz wypróbować.
źródło
screen
?Chciałem tylko pokazać działający przykład, który możesz wyciąć i wkleić:
źródło
Najszybszym i najłatwiejszym sposobem jest użycie polecenia „at”:
źródło
at
zaakceptowano argumenty wiersza poleceń po czasie, a nie tylko z pliku.Myślę, że będziesz musiał połączyć kilka z tych odpowiedzi, aby uzyskać to, czego chcesz. Jeśli użyjesz nohup w połączeniu ze średnikiem i zawiniesz całość w cudzysłów, otrzymasz:
co wydaje mi się działać. Bez nohup nie musisz dołączać polecenia & do polecenia, aby je uruchomić. Ponadto, jeśli nie musisz czytać żadnych danych wyjściowych polecenia, możesz użyć
przekierować wszystkie dane wyjściowe do / dev / null.
źródło
To działało dla mnie razy:
źródło
Możesz to zrobić w ten sposób ...
źródło
Właściwie za każdym razem, gdy muszę uruchomić polecenie na skomplikowanym komputerze zdalnym, lubię umieścić polecenie w skrypcie na komputerze docelowym i po prostu uruchomić ten skrypt za pomocą ssh.
Na przykład:
A potem po prostu uruchamiam to polecenie na maszynie źródłowej:
źródło
Próbowałem zrobić to samo, ale z dodatkową złożonością próbowałem to zrobić z Javy. Tak więc na jednej maszynie z Javą próbowałem uruchomić skrypt na innej maszynie w tle (bez nohup).
Z wiersza poleceń oto, co zadziałało: (możesz nie potrzebować pliku „-i keyFile”, jeśli nie potrzebujesz go do ssh na hoście)
Zauważ, że w moim wierszu poleceń po „-c” jest jeden argument, który jest w cudzysłowie. Ale żeby zadziałał na drugim końcu, wciąż potrzebuje cytatów, więc musiałem umieścić w nim cytaty uciekające.
Z Java: oto, co zadziałało:
Minęło trochę prób i błędów, aby to działało, ale wydaje się, że teraz działa dobrze.
źródło
Wydawało mi się dość wygodne mieć zdalną sesję tmux przy użyciu następującej
tmux new -d <shell cmd>
składni:Spowoduje to uruchomienie nowej sesji na
elsewhere
hoście, a polecenie ssh na komputerze lokalnym powróci niemal natychmiast do powłoki. Następnie możesz ssh do zdalnego hosta itmux attach
do tej sesji. Zauważ, że nie ma nic o działającym lokalnym tmuxie, tylko zdalny!Ponadto, jeśli chcesz, aby sesja trwała po zakończeniu zadania, po prostu dodaj program uruchamiający powłokę po komendzie, ale nie zapomnij dołączyć cudzysłowu:
źródło
Powinno to uruchomić komendę i przypisać identyfikator procesu, który możesz po prostu -f YOUR-LOG.log, aby zobaczyć zapisane wyniki. możesz się wylogować w dowolnym momencie, a proces będzie kontynuowany
źródło
Możesz to zrobić bez nohup:
źródło
Myślę, że właśnie tego potrzebujesz: Najpierw musisz zainstalować
sshpass
na swoim komputerze. możesz napisać własny skrypt:źródło
Najpierw wykonaj tę procedurę:
Zaloguj się jako użytkownik A i wygeneruj parę kluczy uwierzytelniających. Nie wpisuj hasła:
Teraz użyj ssh, aby utworzyć katalog ~ / .ssh jako użytkownik b na B. (katalog może już istnieć, co jest w porządku):
Na koniec dołącz nowy klucz publiczny a do b @ B: .ssh / Author_keys i wprowadź hasło b po raz ostatni:
Od teraz możesz zalogować się do B jako b z A jako bez hasła:
to zadziała bez wprowadzania hasła
ssh b @ B "katalog cd / some /; program do wykonania &"
źródło