Czy można używać poleceń Unixa, aby cp pliku z mojego podkatalogu na komputer zdalny za pośrednictwem SSH?


17

Mam serię plików oprogramowania pobranych do mojego podkatalogu ~/Downloadsna moim komputerze osobistym. Używam również bash, aby połączyć się zdalnie z komputerem za pomocą ssh.

Czy można przenieść ten plik sshna komputer zdalny?


Pytanie dotyczy pojedynczego pliku ( this file) i wielu plików ( a series of software files), najlepsze rozwiązanie zależy od tego, czy masz jeden plik czy wiele plików.
— user2768,

Odpowiedzi:


42

Możesz użyć scp do tego celu. Jest to bezpieczny sposób przesyłania plików przy użyciu protokołu SSH.

Na przykład, aby skopiować plik o nazwie yourfile.txtz ~/Downloadskomputera zdalnego, użyj:

scp ~/Downloads/yourfile.txt your_username@remotehost.edu:/some/remote/directory

Możesz zobaczyć więcej przykładów tutaj .


5
Myślę, że rsyncmoże również działać, teraz, gdy o tym myślę
— ShanZhengYang,

1
rsync jest zbyt skomplikowany, jeśli chodzi o jedną lub jedną rękę pełną plików ...
— Paebbels,

14
@Paebbels Wręcz przeciwnie, zamień scppowyżej na rsynci powinno działać dobrze.
— 8bittree,

Zwykle używam rsyncdo wszystkiego, nawet pojedynczych plików, ponieważ „po prostu działa” w prostych przypadkach i może być znacznie bardziej wydajny w innych przypadkach. W przypadku korzystania albo scpczy rsyncna niczym nie już sprężonym i / lub zaszyfrowany, należy pamiętać, aby włączyć opcję docisku ( -Cdo scp, -zlub --compressza rsync). W rzeczywistości włączam to przez przyzwyczajenie - bardzo rzadko zdarza się sytuacja, w której wszystko to spowalnia (być może, jeśli używasz powolnego urządzenia małej mocy o ograniczonej mocy CPI, takiego jak rPi).
— David Spillett,

37

Chociaż scpjest to z pewnością odpowiednie narzędzie do tego, jeśli z jakiegoś powodu nie możesz go użyć, możesz zrobić coś takiego z lokalnego komputera, aby skopiować, powiedzmy, strukturę katalogów na maszynę zdalną:

tar -c . | ssh <remote> tar -x

Spowoduje to tarbieżący katalog na komputerze lokalnym i zapisanie tego, tardo stdoutktórego zostanie następnie przekazany potokiem do sshpolecenia, w którym wykona polecenie zdalne w celu rozpakowania pliku, z którego czytastdin

Edytowane w celu odzwierciedlenia komentarza Dietrich Epp o -f -tym, że jest domyślny zarówno na końcach tworzenia, jak i ekstrakcji, więc nie jest konieczne precyzyjne określenie.


7
Prawdopodobnie będziesz chciał dodać -C basedirargument, aby tarwyodrębnić gdzieś indziej niż katalog domowy, jeśli to robisz.
— Dougal,

17

Jeśli chcesz to zrobić częściej niż rzadko, sugeruję zamontowanie zdalnego systemu plików, sshfsjeśli używasz systemu uniksowego obsługującego FUSE (Linux, * BSD, Mac OS X). Utwórz katalog w katalogu domowym, powiedzmy, o nazwie ~ / remote-server:

    $ mkdir ~/remote-server

Następnie zamontuj zdalny system plików za pomocą sshfs. Zamień „yourserver.com” na nazwę hosta zdalnego komputera, a „name zdalnego katalogu” na katalog używany w systemie zdalnym.

    $ sudo sshfs username@yourserver.com:/name/of/remote/directory ~/remote-server/

Po wykonaniu tej czynności zdalny katalog jest częścią systemu plików i można na nim używać wszystkich zwykłych narzędzi, w tym cp:

    $ cp ~/Downloads/your-files ~/remote-server

Jeśli jeszcze tego nie zrobiłeś sshfs, powinieneś być w stanie zainstalować go na swoim komputerze za pomocą menedżera pakietów (poszukaj pakietów o nazwach sshfslub fuse-sshfs). Aby uzyskać więcej informacji, możesz przeczytać samouczek online .

To, nawiasem mówiąc, mój ulubiony sposób zarządzania plikami na zdalnych serwerach. Zwykle utrzymuję w ten sposób jeden serwer produkcyjny i dwa serwery programistyczne i używam z nimi normalnego przepływu pracy przeglądania plików.


A następnie sprawdź, które opcje sshfs pomogą ci jak najlepiej wykonać swoją pracę. Np. Zaczynając od mapowania identyfikatora użytkownika / grupy -o idmap={none,user,file},gid=<remote_user_group_ID>,allow_otheri -Cdo kompresji, jeśli słabe pasmo. Jak tylko zadziała dobrze, osobiście dodaję aliasy dla poleceń, aby szybko zamontować odległe systemy plików na ssh. @Benjamin_Staton Nie użyłbym tutaj sudo ani roota, przynajmniej bez odpowiedniego mapowania użytkowników / grup.
— tuk0z

9

Po raz pierwszy nie ma prawdziwej różnicy między scp(kopiowanie ssh) a rsync.

Przy kolejnych uruchomieniach rsync nie kopiuje plików, które już istnieją.

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a dla wszystkich plików
  • -v za pełne
  • -H za „po prostu znajdź dowiązania symboliczne i rób to, co należy”
  • następnie ścieżki źródłowe i docelowe. Możesz użyć symboli wieloznacznych w źródle lub po prostu zsynchronizować cały katalog.

Inne przydatne flagi to:

  • --delete aby usunąć pliki w miejscu docelowym, których już nie ma w źródle.
  • --dry-run do testowania - bardzo przydatny w połączeniu z --delete.

Spowoduje to również użycie sshkluczy do zalogowania się bez hasła, jeśli masz je skonfigurowane.

Pod koniec cyklu rsyncpokaże ci, ile razy szybciej było po zrobieniu zwykłej kopii od nowa.


1
-Hjest faktycznie dla twardych linków, zatrzymuje wysyłanie tej samej treści dwa lub więcej razy, gdy jest ona połączona z więcej niż jednym miejscem w źródłowej strukturze katalogów (ale może sprawić, że proces będzie mniej wydajny dla dużych struktur katalogów). nie ma to wpływu na dowiązania symboliczne, ale niektóre opcje zawarte w -a/ --archivedo wpływają na sposób przetwarzania dowiązań symbolicznych.
— David Spillett,

4

Aby dodać do powyższych odpowiedzi. Czasami nie jestem pewien co do odległej ścieżki. W takich przypadkach używam sftpnajpierw do przejścia do wymaganej lokalizacji, a następnie użyj polecenia get lub put, aby faktycznie pobrać lub załadować plik.

Jeśli chcesz również zachować synchronizację, a nawet chcesz uruchomić lokalnie jakiś plik, który znajduje się na zdalnym komputerze, sshfsdziała świetnie.


-1

Robię coś bardzo podobnego z ssh. Stworzyłem niestandardowe narzędzie do kompilacji dla Visual Studio i po prostu mam VS uruchomić polecenie ssh, które kopiuje mój kod na komputer docelowy, a następnie kompiluje go na tym komputerze docelowym.

ssh userB @ hostB 'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand ”

Zwróć uwagę na użycie pojedynczego cudzysłowu i średnika. Pierwszy z nich zawiera polecenia do hosta B za pośrednictwem ssh, a drugi pozwala na uruchamianie wielu poleceń systemowych hostB w jednym poleceniu ssh z hosta A.

Aby to zadziałało, musisz skonfigurować klucze ssh na swoim komputerze startowym, abyś mógł być użytkownikiem A @ hostA i zalogować się na hostB jako użytkownik B. Proces tworzenia publicznego klucza ssh dla userA @ hostA jest dobrze udokumentowany. Jeśli nie utworzysz klucza publicznego na hoście A dla użytkownika A i skopiujesz ten klucz na hoście B jako użytkownik B, będziesz zmuszony wprowadzić hasło za każdym razem - co rujnuje radość z automatyzacji.


Czy każdy, kto głosował negatywnie, może skomentować, dlaczego głosował negatywnie? Głosy w dół są pozbawione znaczenia bez informacji zwrotnych. Odpowiedziałem na konkretne pytanie PO z odpowiedzią, która bezpośrednio dotyczy. Nie wprowadzam nowych technologii ani nie sugeruję alternatywnych tras. Dlaczego? może OP nie chce korzystać z alternatywnych tras.
— Andrew
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.