Muszę uruchomić skrypt powłoki (Windows / Linux) na zdalnym komputerze.
Mam skonfigurowane SSH zarówno na komputerze A, jak i B. Mój skrypt znajduje się na komputerze A, który uruchomi część mojego kodu na komputerze zdalnym, komputerze B.
Komputery lokalne i zdalne mogą być systemem Windows lub Unix.
Czy istnieje sposób, aby to zrobić, używając Plink / SSH?
shell
ssh
sysadmin
remote-execution
alpha_989
źródło
źródło
Odpowiedzi:
Jeśli Maszyna A jest oknem Windows, możesz użyć Plink (część PuTTY ) z parametrem -m, a on wykona skrypt lokalny na zdalnym serwerze.
Jeśli Maszyna A jest systemem uniksowym, możesz użyć:
Nie trzeba kopiować skryptu na zdalny serwer, aby go uruchomić.
źródło
-s
opcji jest zaletą ? ta strona podręcznika prowadzi mnie do przekonania, że przetworzy standardowe dane wejściowe po zakończeniu przetwarzania opcji, niezależnie od tego, czy-s
są używane, czy nie.sudo
, uruchomssh root@MachineB 'echo "rootpass" | sudo -Sv && bash -s' < local_script.sh
.HISTCONTROL=ignoreboth or ignorespace
aby działało)ssh root@MachineB ARG1="arg1" ARG2="arg2" 'bash -s' < local_script.sh
Kredyty w pełni przejdź do odpowiedzi @chubbsondubs poniżej.To jest stare pytanie i odpowiedź Jasona działa dobrze, ale chciałbym dodać to:
Można tego również używać z poleceniami su i poleceniami, które wymagają wkładu użytkownika. (zwróć uwagę na
'
uciekającego heredoka)Edycja: Ponieważ ta odpowiedź ciągle się powiększa, dodałbym jeszcze więcej informacji do tego wspaniałego zastosowania heredoc:
Możesz zagnieżdżać polecenia za pomocą tej składni, i to jedyny sposób, w jaki wydaje się działać zagnieżdżanie (w rozsądny sposób)
Możesz faktycznie rozmawiać z niektórymi usługami, takimi jak telnet, ftp itp. Pamiętaj jednak, że heredoc po prostu wysyła stdin jako tekst, nie czeka na odpowiedź między wierszami
Edycja: Właśnie dowiedziałem się, że możesz użyć wcięć wewnątrz kart, jeśli używasz
<<-END
!(Myślę, że to powinno działać)
Zobacz także http://tldp.org/LDP/abs/html/here-docs.html
źródło
<<'ENDSSH'
) ciągi nie zostaną rozwinięte, zmienne nie zostaną ocenione. Możesz także użyć<<ENDSSH
lub,<<"ENDSSH"
jeśli chcesz rozszerzenia.Expect
może być używany, gdy trzeba zautomatyzować interaktywne polecenia, takie jak FTP.Pseudo-terminal will not be allocated because stdin is not a terminal.
wiadomość.-t -t
Aby tego uniknąć, należy użyć ssh z parametrami . Zobacz ten wątek w SONie zapomnij także o zmianie zmiennych, jeśli chcesz je pobrać z hosta docelowego.
To mnie złapało w przeszłości.
Na przykład:
wypisuje / home / user2
podczas
drukuje / home / user
Inny przykład:
drukuje poprawnie „cześć”.
źródło
ssh user2@host 'bash -s' echo $HOME /home/user2 exit
for
pętlach działających wssh
sesji zmienna pętli nie może być zmieniona.ssh user2@host2 'echo hello world' | awk '{ print $1 }'
np. Uruchomienie skryptu Awk lokalnie. Jeśli zdalne polecenie generuje ogromną ilość danych wyjściowych, oczywiście chcesz uniknąć kopiowania wszystkiego z powrotem na lokalny serwer. Nawiasem mówiąc, pojedyncze cudzysłowy wokół polecenia zdalnego pozwalają uniknąć ucieczki.Jest to rozszerzenie odpowiedzi YarekT, aby połączyć wbudowane polecenia zdalne z przekazywaniem zmiennych ENV z komputera lokalnego do zdalnego hosta, aby można było sparametryzować skrypty po stronie zdalnej:
Uznałem to za wyjątkowo pomocne, utrzymując wszystko w jednym skrypcie, dzięki czemu jest bardzo czytelny i łatwy w utrzymaniu.
Dlaczego to działa ssh obsługuje następującą składnię:
W bash możemy określić zmienne środowiskowe, które mają zostać zdefiniowane przed uruchomieniem polecenia w jednym wierszu:
Ułatwia to definiowanie zmiennych przed uruchomieniem polecenia. W tym przypadku echo to nasze polecenie, które uruchamiamy. Wszystko przed echem definiuje zmienne środowiskowe.
Łączymy więc te dwie funkcje z odpowiedzią YarekT, aby uzyskać:
W tym przypadku ustawiamy ARG1 i ARG2 na wartości lokalne. Wysyłanie wszystkiego po user @ host jako komenda_zdalna. Gdy zdalna maszyna wykonuje polecenie ARG1 i ARG2, są ustawiane wartości lokalne, dzięki ocenie lokalnego wiersza poleceń, która definiuje zmienne środowiskowe na zdalnym serwerze, a następnie wykonuje polecenie bash -s przy użyciu tych zmiennych. Voila
źródło
ssh user@host "ARG1=\"$ARG1\" ARG2=\"$ARG2\"" 'bash -s' <<'ENDSSH'...
-s
jest użycie argumentów do skryptów pochodzących ze standardowego wejścia. To znaczy, równie dobrze możesz to pominąć, jeśli nie zamierzasz go używać. Jeśli go użyjesz, nie ma powodu, aby używać zmiennych środowiskowych:ssh user@host 'bash -s value1 value2' <<< 'echo "$@"'
Spowoduje to wyświetlenie monitu o podanie hasła, chyba że skopiowałeś klucz publiczny użytkownika hosta do pliku autoryzowanych_kluczy w katalogu głównym katalogu użytkownika .ssh. Pozwoli to na uwierzytelnianie bez hasła (jeśli zostanie zaakceptowane jako metoda uwierzytelniania w konfiguracji serwera ssh)
źródło
Zacząłem używać Fabric do bardziej wyrafinowanych operacji. Sieć szkieletowa wymaga języka Python i kilku innych zależności, ale tylko na komputerze klienckim. Serwer musi być tylko serwerem ssh. Uważam, że to narzędzie jest o wiele potężniejsze niż skrypty powłoki przekazywane do SSH i warte jest kłopotów z konfiguracją (szczególnie jeśli lubisz programować w Pythonie). Fabric obsługuje działające skrypty na wielu hostach (lub hostach niektórych ról), pomaga w wykonywaniu idempotentnych operacji (takich jak dodawanie wiersza do skryptu konfiguracyjnego, ale nie, jeśli już tam jest), i pozwala na budowę bardziej złożonej logiki (takiej jak Python język może zapewnić).
źródło
Spróbuj uruchomić
ssh user@remote sh ./script.unx
.źródło
źródło
Zakładając, że masz na myśli, że chcesz to zrobić automatycznie z „lokalnej” maszyny, bez ręcznego logowania się na „zdalnej” maszynie, powinieneś zajrzeć do rozszerzenia TCL znanego jako Oczekiwanie, jest ono zaprojektowane właśnie do tego rodzaju sytuacji. Podałem również link do skryptu do logowania / interakcji przez SSH.
https://www.nist.gov/services-resources/software/expect
http://bash.cyberciti.biz/security/expect-ssh-login-script/
źródło
Używam tego do uruchomienia skryptu powłoki na zdalnym komputerze (testowany na / bin / bash):
źródło
zdecydowanie zaleca się źródło pliku środowiska (.bashrc / .bashprofile / .profile). przed uruchomieniem czegoś na hoście zdalnym, ponieważ zmienne środowiskowe hosta docelowego i źródłowego mogą być niepoprawne.
źródło
jeśli chcesz wykonać polecenie takie jak to
temp=`ls -a` echo $temp
w `` spowoduje błędy.poniższe polecenie rozwiąże ten problem
ssh user@host ''' temp=`ls -a` echo $temp '''
źródło
Odpowiedź tutaj ( https://stackoverflow.com/a/2732991/4752883 ) działa świetnie, jeśli próbujesz uruchomić skrypt na zdalnym komputerze z systemem Linux za pomocą
plink
lubssh
. Będzie działać, jeśli skrypt ma wiele wierszylinux
.** Jednak jeśli próbujesz uruchomić skrypt wsadowy znajdujący się na
linux/windows
komputerze lokalnym , a twój komputer zdalny jest w stanieWindows
, i składa się z wielu wierszy przy użyciu **plink root@MachineB -m local_script.bat
nie zadziała.
Zostanie wykonana tylko pierwsza linia skryptu. Jest to prawdopodobnie ograniczenie
plink
.Rozwiązanie 1:
Aby uruchomić wielowierszowy skrypt wsadowy (zwłaszcza jeśli jest stosunkowo prosty i składa się z kilku wierszy):
Jeśli oryginalny skrypt partii jest następujący
możesz połączyć linie razem za pomocą separatora „&&” w następujący sposób w
local_script.bat
pliku: https://stackoverflow.com/a/8055390/4752883 :Po tej zmianie możesz uruchomić skrypt, jak wskazano tutaj przez @ JasonR.Coombs: https://stackoverflow.com/a/2732991/4752883 z:
Rozwiązanie 2:
Jeśli skrypt wsadowy jest stosunkowo skomplikowany, może być lepiej użyć skryptu wsadowego, który zawiera polecenie plink, a także następujące czynności, jak wskazano tutaj @Martin https://stackoverflow.com/a/32196999/4752883 :
źródło
Ten skrypt bash robi ssh na docelowym komputerze zdalnym i uruchamia komendę na komputerze zdalnym, nie zapomnij zainstalować expect przed uruchomieniem go (na komputerze Mac
brew install expect
)źródło
Możesz użyć Runoverssh :
-s
uruchamia skrypt lokalny zdalniePrzydatne flagi:
-g
użyj globalnego hasła dla wszystkich hostów (monit o jedno hasło)-n
użyj SSH zamiast sshpass, przydatny do uwierzytelniania z kluczem publicznymźródło
Najpierw skopiuj skrypt na maszynę B za pomocą scp
Następnie uruchom skrypt
Działa to, jeśli dałeś uprawnienia do wykonywania skryptu.
źródło