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.