Skrypt powłoki z komputera lokalnego, aby wykonać polecenie na komputerze zdalnym, a następnie kontynuuj na komputerze lokalnym

10

Problem polega na tym: chcę skopiować pliki ze zdalnego komputera.

Szukam sposobu na napisanie skryptu powłoki, który połączyłby się ze zdalnym komputerem, uzyskał lokalizację zapisanego pliku, gdy tylko odłączę lokalizację od zdalnego serwera i użyję scp z komputera lokalnego z uzyskaną lokalizacją do skopiuj plik.

W szczególności chcę wiedzieć, jak ze skryptu, chciałbym połączyć się ze zdalnym komputerem, wykonywać zadania na tym komputerze. Odłącz i kontynuuj wykonywanie lokalne.

gnsr
źródło

Odpowiedzi:

15

Rozwiązanie 1:

remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path

Działa to poprzez podłączenie do komputera zdalnego, uruchomienie niektórych poleceń i skopiowanie danych wyjściowych do zmiennej na komputerze lokalnym. Powiedz, zdalnie wyświetlając ścieżkę pliku, przechwytując go lokalnie.

Rozwiązanie 2:

ssh user@host "determine_path; cat filename" >local_filename

Działa to poprzez wyszukiwanie i wysyłanie pliku bezpośrednio ze zdalnego i przekierowywanie go do pliku lokalnie. To pomija scp. Wymaga to, aby kroki poprzedzające „cat” nie miały danych wyjściowych (które można rozwiązać za pomocą &> / dev / null).

Mark Griffin
źródło
1
+1 za pokazanie, jak rozwiązać cały problem za pomocą jednego połączenia, zamiast osobnego ssh + scp.
Peter Cordes,
Wszystkie odpowiedzi są pomocne, ale ta w szczególny sposób rozwiązuje mój problem
gnsr
20

Możesz napisać skrypt w następującym formacie:

command1
command2
...
ssh user@machine command3
...
command4
command5

Musisz skonfigurować klucze SSH, aby były command3wykonywane bez pytania o hasło.

Khaled
źródło
2
należy zauważyć, że będzie to synchroniczne. Gdy ssh user@remote command3działa, command4nie można rozpocząć
aaaaa mówi, że przywróć Monikę
3
@ aaaaaa, chyba że zrobiłeśssh user@machine command3 &
Izaak
3
@Isaac tak, mam na myśli to, że albo może być pożądane zachowanie, ale powinna to być świadoma decyzja
aaaaa mówi o przywróceniu Moniki
2

Zakładam, że masz już pewne pojęcie o tym, jak zidentyfikujesz plik, który chcesz skopiować, i że możesz lub już napisałeś skrypt lub zestaw poleceń, które będą działać na zdalnej maszynie, która dokonuje tej identyfikacji .

Ponadto założę również, że te polecenia wypisują na standardowym wyjściu pełną ścieżkę do pliku lub względną ścieżkę do pliku, względem katalogu domowego użytkownika SSH używanego do kopiowania. W moim przykładzie nazwa skryptu to „getfilepath.sh”, chociaż nie musi to być skrypt powłoki, może to być jakiś inny plik wykonywalny lub nawet seria poleceń.

# Script to be executed on local machine.

# put any leading local commands here.

FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .

# put any trailing local commands here.

W powyższym kodzie notacja „$ ()” jest sposobem na przechwycenie standardowego wyjścia polecenia jako zmiennej powłoki. Jest to dość standardowe, ale jeśli używasz powłoki, która jej nie rozumie, możesz zamiast tego otoczyć polecenie „tykającymi znakami wstecznymi”, które są znakami akcentującymi po lewej stronie klawisza 1 na większości klawiatur amerykańskich.

Jeremy Impson
źródło
0

być może możliwe jest uruchomienie zaplanowanego zadania na zdalnym komputerze, który wykona całą pracę.

Zapobiegnie to podłączeniu się do zdalnego komputera podczas wyszukiwania lokalizacji plików, które chcesz skopiować.

Robię to:

linia poleceń uruchamia zaplanowane zadanie, które w moim przypadku wykonuje skrypt wsadowy.

schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"

Z poważaniem

Denyo
źródło