Mam już skonfigurowanego agenta ssh i mogę uruchamiać polecenia na serwerze zewnętrznym w skrypcie Bash, wykonując takie czynności jak:
ssh blah_server "ls; pwd;"
Teraz naprawdę chciałbym uruchomić wiele długich poleceń na serwerze zewnętrznym. Umieszczenie wszystkich tych znaków w cudzysłowie byłoby dość brzydkie i naprawdę wolałbym unikać wielokrotnego ssh'owania, aby tego uniknąć.
Czy jest więc sposób, aby to zrobić za jednym razem w nawiasach? Szukam czegoś w stylu:
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
Zasadniczo będę zadowolony z każdego rozwiązania, o ile będzie ono czyste.
Edytować
Aby to wyjaśnić, mówię o tym, że jest to część większego skryptu bash. Inni ludzie mogą potrzebować poradzić sobie ze skryptem, więc chciałbym go utrzymać w czystości. Nie chcę mieć skryptu bash z jedną linią, która wygląda następująco:
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
ponieważ jest wyjątkowo brzydki i trudny do odczytania.
ssh
wywołaniem?scp
,ssh
i uruchomić. Myślę, że to będzie najczystszy sposób.Odpowiedzi:
Co powiesz na dokument Bash Here :
Aby uniknąć problemów wspomnianych przez @Globalz w komentarzach, możesz (w zależności od tego, co robisz na zdalnej stronie) uniknąć zamiany pierwszego wiersza na
Pamiętaj, że w dokumencie Tutaj możesz zastępować zmienne, ale możesz mieć problemy z cytowaniem. Na przykład, jeśli cytujesz „limit string” (tj.
EOF
Powyżej), nie możesz wykonywać podstawień zmiennych. Ale bez cytowania łańcucha limitu zmienne są podstawiane. Na przykład, jeśli zdefiniowałeś$NAME
powyżej w skrypcie powłoki, możesz to zrobići utworzyłby plik w miejscu docelowym
otherhost
z nazwą tego, do czego został przypisany$NAME
. Obowiązują również inne zasady dotyczące cytowania skryptów powłoki, ale są zbyt skomplikowane, aby przejść tutaj.źródło
Edytuj skrypt lokalnie, a następnie potokuj go do ssh, np
gdzie
commands-to-execute-remotely.sh
wygląda jak twoja lista powyżej:źródło
( echo $mycmd $myvar ; ...) | ssh myhost
przesyłającego potoki do ssh, tj. - podobnie jak w przypadku użycia cat, wiesz dokładnie, co dzieje się w strumieniu poleceń ssh. I oczywiście podpowłoka w skrypcie może być wielowierszowa dla czytelności - patrz linuxjournal.com/content/bash-sub-shellscommands-to-execute-remotely.sh
?$localvar
do interpretacji zmiennej zdefiniowanej lokalnie,\$remotevar
do zdalnej interpretacji zmiennej zdefiniowanej zdalnie,\$(something with optionnal args)
aby uzyskać wynik działania czegoś na zdalnym serwerze. Przykład, że możesz ssh przez 1 (lub, jak pokazano tutaj, wiele poleceń ssh):echo " for remotedir in /*/${localprefix}* ; do cd \"\$remotedir\" && echo \"I am now in \$(pwd) on the remote server \$(hostname) \" ; done " | ssh user1@hop1 ssh user2@hop2 ssh user@finalserver bash
ssh blah_server < commands-to-execute-remotely.sh
?Aby dopasować swój przykładowy kod, możesz zawinąć swoje polecenia w pojedyncze lub podwójne polecenia qoute. Na przykład
źródło
Widzę dwa sposoby:
Najpierw utwórz gniazdo kontrolne w ten sposób:
i uruchom swoje polecenia
W ten sposób możesz napisać polecenie ssh bez ponownego łączenia się z serwerem.
Drugim byłoby dynamiczne wygenerowanie skryptu,
scp
uruchomienie go i uruchomienie.źródło
Można to również zrobić w następujący sposób. Umieść swoje polecenia w skrypcie, nazwijmy go polecenia-inc.sh
Zapisz plik
Teraz uruchom go na zdalnym serwerze.
Nigdy dla mnie nie zawiodło.
źródło
bash -s
potrzebny?#!/bin/bash
naprawdę jest używany?ssh user@remote < /path/to/commands-inc.sh
(wydaje mi się, że działa). Sądzę, że twoja wersja zapewnia, że używamybash
powłoki, a nie jakiejkolwiek innej powłoki - taki jest cel, prawda?Umieść wszystkie polecenia w skrypcie i można go uruchomić tak jak
źródło
bash -s
?man
stronIf the -s option is present, or if no arguments remain after option processing, then commands are read from the standard input. This option allows the positional parameters to be set when invoking an interactive shell.
bash
całkowicie zrezygnować z polecenia, tjssh remote-user@remote-host <./remote-commands.sh
. Próbowałem swoich sił i wydawało się, że to działa, ale nie jestem pewien, czy to w jakiś sposób jest wadliwe.SSH i uruchamianie wielu poleceń w Bash.
Oddziel polecenia średnikami w ciągu, przekazywane do echa, wszystkie przesyłane do polecenia ssh. Na przykład:
źródło
Dla każdego, kto potknie się tutaj, jak ja - udało mi się uciec przed średnikiem i znakiem nowej linii:
Pierwszy krok: średnik. W ten sposób nie łamiemy polecenia ssh:
Wymieniono zdalny katalog hosts / home (zalogowany jako root), podczas gdy
wymieniono bieżący katalog roboczy.
Następny krok: zerwanie linii:
To ponownie wyświetlało zdalny katalog roboczy - ulepszone formatowanie:
Jeśli naprawdę ładniejszy niż tutaj dokument lub cytaty wokół linii przerywanych - cóż, nie ja decyduję ...
(Używając bash, Ubuntu 14.04 LTS.)
źródło
ssh host "echo test && ls"
Wysłane odpowiedzi przy użyciu ciągów wielowierszowych i wielu skryptów bash nie działały dla mnie.
Oto funkcjonalny sposób ssh i uruchamiania wielu poleceń przy zachowaniu lokalnego kontekstu.
źródło
Nie jestem pewien, czy najczystszy z długich poleceń, ale z pewnością najłatwiejszy:
źródło
Działa to dobrze przy tworzeniu skryptów, ponieważ nie musisz dołączać innych plików:
źródło
-s
flagę, cytuję go , być może uda ci się zastąpić pierwszą linię ... i nie byłem w stanie uciec od zwykłego wywołania bashu, którego ledwie pamiętam.Najłatwiejszym sposobem skonfigurowania systemu do domyślnego korzystania z pojedynczych sesji ssh z multipleksowaniem.
Można to zrobić, tworząc folder dla gniazd:
A następnie dodając następujące elementy do konfiguracji .ssh:
Teraz nie musisz modyfikować żadnego kodu. Pozwala to na wiele wywołań ssh i scp bez tworzenia wielu sesji, co jest przydatne, gdy zachodzi potrzeba większej interakcji między komputerami lokalnymi i zdalnymi.
Dzięki odpowiedzi @ terminus, http://www.cyberciti.biz/faq/linux-unix-osx-bsd-ssh-multiplexing-to-speed-up-ssh-connections/ oraz https://en.wikibooks.org / wiki / OpenSSH / Cookbook / Multiplexing .
źródło