RDP Monster

Polecenie scp w Linuksie: kopiowanie plików na VPS i z VPS

Polecenie scp w Linuksie: kopiowanie plików na VPS i z VPS

Polecenie scp w Linuksie: składnia i podstawowe transfery

scp (secure copy) kopiuje pliki między maszynami przez SSH, więc użytkownik, klucz i port działające z ssh zadziałają też z scp. Schemat jest zawsze taki sam: scp [options] SOURCE DESTINATION, a strona zdalna zapisywana jest jako user@host:path. Potrzebne jest działające logowanie SSH; jeśli port 22 jeszcze nie odpowiada, najpierw włącz SSH w Ubuntu i zabezpiecz je.

1. Lokalnie na serwer (wysyłanie)

scp backup.tar.gz user@SERVER_IP:/home/user/
scp backup.tar.gz user@SERVER_IP:~/backups/renamed.tar.gz
scp *.conf user@SERVER_IP:~/nginx-conf/

Ścieżka zakończona ukośnikiem umieszcza plik w tym katalogu pod oryginalną nazwą; pełna ścieżka zmienia jego nazwę po przesłaniu. Przed miejscem docelowym można wymienić kilka plików lokalnych, o ile cel jest katalogiem, a ten katalog musi już istnieć: scp nie tworzy katalogów nadrzędnych.

2. Z serwera na komputer lokalny (pobieranie)

scp user@SERVER_IP:/var/log/nginx/access.log .
scp user@SERVER_IP:'/var/log/nginx/*.log' ./logs/

Kropka oznacza „tutaj, pod tą samą nazwą”. Zdalne symbole wieloznaczne bierz w cudzysłów, aby lokalna powłoka ich nie rozwinęła. Kopiowanie między dwoma serwerami też działa: scp -3 user@HOST_A:/data/dump.sql user@HOST_B:/data/ przepuszcza dane przez Twoją maszynę, więc tylko ona musi mieć dane logowania do obu serwerów.

3. Katalogi z opcją -r

scp -r ./site user@SERVER_IP:/var/www/
scp -r user@SERVER_IP:/etc/nginx ./nginx-backup

-r kopiuje katalog wraz z całą zawartością. Pierwsze polecenie tworzy /var/www/site na serwerze; drugie pobiera całe drzewo nginx do lokalnego folderu. Dowiązania symboliczne są kopiowane jako zwykłe pliki. To jeden z powodów, dla których rsync lepiej nadaje się do pełnych drzew systemowych.

Opcje scp, których naprawdę użyjesz: -P, -i, -C, -p

scp -P 2222 file.txt user@SERVER_IP:/home/user/        # non-default SSH port
scp -i ~/.ssh/id_ed25519 file.txt user@SERVER_IP:~/     # use a specific key
scp -C dump.sql user@SERVER_IP:~/                       # compress in transit
scp -rp ./site user@SERVER_IP:/var/www/                 # keep times and modes

Flaga portu to wielkie -P. Małe -p oznacza „zachowaj czasy modyfikacji, czasy dostępu i bity uprawnień”, a ponieważ samo ssh używa -p dla portu, mylenie ich to najczęstszy błąd przy scp. Aby nie powtarzać portu i klucza przy każdym wywołaniu, zdefiniuj hosta raz w ~/.ssh/config; scp, rsync i sftp czytają ten plik:

Host vps
    HostName SERVER_IP
    User user
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Dwie kolejne flagi: -l 8000 ogranicza transfer do 8000 Kbit/s (około 1 MB/s), a -v pokazuje, które klucze są oferowane, gdy uwierzytelnianie zawodzi. Od OpenSSH 9.0 scp używa pod spodem protokołu SFTP; składnia się nie zmieniła, ale sztuczki powłoki osadzone w zdalnej ścieżce (na przykład podstawianie poleceń) nie są już wykonywane na serwerze, a -O przywraca dawny protokół dla bardzo starych serwerów odrzucających nowy tryb.

rsync: kopie lustrzane, wznawiane transfery i wykluczenia

rsync kopiuje tylko to, co się zmieniło. Pierwsze uruchomienie działa jak scp -r; kolejne porównują obie strony i przesyłają wyłącznie różnice: nowe pliki, a w plikach zmienionych tylko zmodyfikowane bloki. To czyni go narzędziem do wdrożeń, kopii zapasowych i wszystkiego, co duże. Musi być zainstalowany po obu stronach (sudo apt install rsync); niektóre minimalne obrazy i kontenery go nie mają.

1. Codzienne polecenie

rsync -avz --progress ./site/ user@SERVER_IP:/var/www/site/
rsync -avz --progress user@SERVER_IP:/var/www/site/ ./site-backup/

-a (archive) rozwija się do -rlptgoD: rekurencja, zachowanie dowiązań symbolicznych, uprawnień, czasów, grupy, właściciela i plików urządzeń; właściciel zostaje zachowany tylko wtedy, gdy strona odbierająca działa jako root. -v wypisuje pliki, -z kompresuje, --progress pokazuje postęp każdego pliku.

Końcowy ukośnik ma znaczenie. ./site/ oznacza „zawartość katalogu site”; ./site oznacza „sam katalog”, co utworzyłoby /var/www/site/site. W razie wątpliwości dodaj -n (--dry-run) i przeczytaj listę plików, zanim cokolwiek zostanie zapisane.

2. Kopia lustrzana z --delete

rsync -avzn --delete ./site/ user@SERVER_IP:/var/www/site/   # dry run first
rsync -avz --delete ./site/ user@SERVER_IP:/var/www/site/

--delete usuwa z celu pliki, których nie ma już w źródle. Prawdziwa kopia lustrzana tego wymaga, ale to również ta opcja zamienia błędny końcowy ukośnik w wyczyszczony katalog, więc każde nowe polecenie z --delete uruchom raz w trybie próbnym.

3. Wykluczanie plików

rsync -avz --exclude='node_modules/' --exclude='.git/' --exclude='*.log' ./app/ user@SERVER_IP:/srv/app/
rsync -avz --exclude-from='.rsyncignore' ./app/ user@SERVER_IP:/srv/app/

Wzorce są względne wobec katalogu głównego transferu; początkowy ukośnik je zakotwicza, więc /config.php wyklucza tylko plik z najwyższego poziomu. --exclude-from czyta jeden wzorzec na wiersz.

4. Wznowienie przerwanego transferu, własny port i klucz

rsync -avP -e 'ssh -p 2222 -i ~/.ssh/id_ed25519' ./disk.img user@SERVER_IP:/backup/

-P to skrót od --partial --progress: jeśli połączenie padnie, częściowy plik zostaje zachowany, a ponowne uruchomienie tego samego polecenia kontynuuje transfer od miejsca przerwania. Opcje SSH przekazuje się przez -e i tutaj port to małe -p, bo to flaga ssh, a nie rsync; wpis Host w ~/.ssh/config pozwala pominąć cały ciąg -e.

sftp: interaktywne transfery przez to samo logowanie SSH

sftp daje wiersz poleceń w stylu FTP działający przez SSH, wygodny do przeglądania plików przed kopiowaniem.

sftp -P 2222 -i ~/.ssh/id_ed25519 user@SERVER_IP
sftp> ls -l /var/www
sftp> lcd ~/Downloads
sftp> get /var/log/syslog
sftp> put -r ./site /var/www/
sftp> reget backup.iso
sftp> bye

Polecenia zaczynające się od l działają na Twojej maszynie (lcd, lls, lpwd), pozostałe na serwerze. put -r i get -r kopiują katalogi, reget i reput wznawiają przerwany plik, a !command uruchamia lokalne polecenie powłoki bez opuszczania sesji. sftp -b commands.txt user@SERVER_IP odtwarza plik z takimi poleceniami w zadaniach cron.

Kopiowanie plików z Windows: scp w PowerShellu i WinSCP

Windows 10 (od wersji 1809) i Windows 11 mają wbudowanego klienta OpenSSH, więc scp, sftp i ssh są dostępne w PowerShellu z tymi samymi flagami co w Linuksie:

cd C:\Users\you\Projects
scp -P 2222 -i $HOME\.ssh\id_ed25519 .\site.zip user@SERVER_IP:/home/user/
scp -r user@SERVER_IP:/var/www/site $HOME\Downloads

Klucze znajdują się w C:\Users\you\.ssh\ obok known_hosts, a ssh-keygen -R SERVER_IP działa również tam. Ścieżki względne po cd pozwalają uniknąć pomyłek między literą dysku a nazwą hosta. rsync nie jest dołączony; najprościej zdobyć go przez WSL: wsl rsync -avz /mnt/c/Users/you/site/ user@SERVER_IP:/var/www/site/.

Jeśli wolisz interfejs graficzny, zwykłym wyborem jest WinSCP: obsługuje SFTP i SCP, oferuje dwupanelowy widok z przeciąganiem plików, a jego polecenie Synchronize robi mniej więcej to co rsync --delete. Oczekuje kluczy w formacie .ppk z PuTTY i proponuje konwersję klucza OpenSSH przy jego wyborze. Przy wdrożeniach powtarzanych regularnie jednolinijkowe scp lub rsync w skrypcie łatwiej sprawdzić i zautomatyzować.

scp, rsync czy sftp: co wybrać

ZadanieNajlepsze narzędzieDlaczego
Jeden plik, jednorazowoscpNajkrótsze polecenie, nic do instalowania
Katalog, pierwsza kopiascp -r lub rsync -aRównoważny efekt
Powtarzalne wdrożenia lub kopie zapasowersyncPrzesyłane są tylko zmienione dane
Kopia lustrzana z usuwaniemrsync --deletescp nie potrafi usuwać plików
Wznowienie dużego plikursync -P lub reget w sftpscp zaczyna od zera
Przeglądanie i wybór plikówsftp lub WinSCPInteraktywne listowanie
Tysiące małych plikówrsync lub tar przez sshW scp dominuje narzut na plik
Windows bez WSLscp w PowerShellu lub WinSCPBrak natywnego rsync

Zasada praktyczna: scp, gdy polecenie potrafisz napisać z pamięci; rsync, gdy tylko wiesz, że uruchomisz je drugi raz.

Wskazówki dotyczące prędkości, które naprawdę działają

  • Kompresja nie jest darmowa. -C (scp) i -z (rsync) zmniejszają tekst, zrzuty SQL i logi, ale marnują CPU na archiwa, obrazy i wideo. Jeśli top pokazuje sshd na 100% podczas transferu, zrezygnuj z tej flagi.
  • Łącz wiele małych plików. Przy wysyłaniu drzewa źródeł dominują opóźnienia na każdy plik; jeden strumień jest szybszy: tar czf - ./site | ssh user@SERVER_IP 'tar xzf - -C /var/www/'.
  • Wypróbuj inny szyfr na szybkich łączach. Gdy wąskim gardłem jest sam proces ssh, scp -c aes128-gcm@openssh.com korzysta z instrukcji AES obecnych w niemal każdym nowoczesnym procesorze.
  • Zabezpiecz długie transfery. Uruchamiaj je w tmux lub screen, aby zerwana sesja nie przerwała kopiowania, albo używaj rsync -P i uruchamiaj ponownie.
  • Weryfikuj i ograniczaj pasmo. sha256sum file po obu stronach powinno dać ten sam wynik; scp -l lub rsync --bwlimit nie pozwoli, by kopia zapasowa zagłodziła aplikację.

Uprawnienia, własność plików i typowe błędy

Permission denied w ścieżce docelowej

scp: /var/www//html/: Permission denied oznacza, że logowanie się powiodło, ale ten użytkownik nie może tam pisać. Skopiuj pliki do katalogu domowego i przenieś je przez sudo mv, nadaj użytkownikowi własność katalogu docelowego (sudo chown -R user:user /var/www/site) albo w rsync dodaj --rsync-path="sudo rsync", co działa, gdy użytkownik logowania ma sudo bez hasła, tak jak przy tworzeniu użytkownika z uprawnieniami sudo w Linuksie. Wysyłanie jako root omija błąd, ale zostawia pliki należące do root, do których serwer WWW nie może pisać: użyj potem sudo chown -R www-data:www-data /var/www/site.

Permission denied (publickey)

Serwer odrzucił uwierzytelnianie. Sprawdź nazwę użytkownika, wymuś klucz przez -i, dodaj -v; na VPS przyczynę wskaże sudo journalctl -u ssh -n 30.

Remote host identification has changed

Spodziewane po ponownej instalacji lub zmianie IP: klucz hosta nie pasuje już do ~/.ssh/known_hosts. Jeśli faktycznie przebudowałeś serwer, uruchom ssh-keygen -R SERVER_IP i połącz się ponownie. Jeśli nie, ustal przyczynę, zanim gdziekolwiek wpiszesz hasło.

No such file or directory

scp nie tworzy katalogów nadrzędnych: uruchom najpierw ssh user@SERVER_IP 'mkdir -p /var/www/site'. rsync tworzy tylko ostatni człon ścieżki (--mkpath, rsync 3.2.3+, tworzy katalogi nadrzędne).

rsync: command not found lub protocol data stream (code 12)

Brakuje rsync po jednej ze stron; zainstaluj go tam przez sudo apt install rsync i spróbuj ponownie.

Wysłane skrypty, które nie chcą się uruchomić

Pliki pochodzące z Windows nie mają bitu wykonywalności i często zawierają zakończenia wierszy CRLF, co daje bad interpreter: No such file or directory. Napraw oba przez chmod +x deploy.sh i sed -i 's/\r$//' deploy.sh; kwestię shebanga omawia czym jest plik .sh i jak bash go uruchamia. Na koniec klasyk: scp file.txt user@SERVER_IP bez dwukropka po nazwie hosta to kopia lokalna, która po cichu tworzy plik o nazwie user@SERVER_IP.

Wszystko to zakłada serwer, do którego łączysz się przez SSH jako root lub użytkownik z sudo, gdzie ograniczeniem jest sam transfer, a nie limit ruchu. VPS z Linuksem od rdp.monster to właśnie taka maszyna: pełny dostęp root, dedykowany procesor i RAM, nielimitowany transfer (fair-use), bez KYC, płatności kryptowalutami, od $8.99 miesięcznie, a serwer jest online około 10 sekund po potwierdzeniu płatności, więc pierwszą rzeczą, jaką na nim uruchomisz, może być scp z pierwszego kroku.

Najczęściej zadawane pytania

Czy polecenie scp jest przestarzałe?

scp nie zostało usunięte, ale od OpenSSH 9.0 przesyła dane protokołem SFTP, ponieważ pierwotny protokół scp uznano za przestarzały.
Twórcy OpenSSH określili pierwotny protokół scp/rcp jako przestarzały i trudny do zabezpieczenia, a od OpenSSH 9.0 (2022) polecenie scp przenosi pliki przez SFTP. Samo polecenie, jego flagi i składnia user@host:path pozostają bez zmian, więc istniejące skrypty nadal działają; inaczej zachowuje się jedynie rozwijanie w powłoce wewnątrz ścieżek zdalnych, a -O przywraca dawny protokół dla serwerów, które go potrzebują. Do nowej automatyzacji lepiej nadają się rsync lub sftp, ale samo scp w zupełności wystarcza do jednorazowych kopii.

Czy mogę używać scp z hasłem zamiast klucza SSH?

Tak, jeśli serwer nadal dopuszcza uwierzytelnianie hasłem; scp poprosi o nie dokładnie tak samo jak ssh.
scp korzysta z tego samego uwierzytelniania, którego dla danego hosta użyłoby ssh. Jeśli sshd ma PasswordAuthentication yes, scp poprosi o hasło i kopiowanie się rozpocznie; nie ma flagi pozwalającej podać hasło w wierszu poleceń, a narzędzia takie jak sshpass zostawiają je w historii powłoki. Zabezpieczone serwery zwykle wyłączają logowanie hasłem. Wtedy scp kończy się błędem Permission denied (publickey), dopóki nie zainstalujesz klucza przez ssh-copy-id. To właśnie klucze pozwalają skryptom działać bez nadzoru.

Czy scp nadpisuje istniejące pliki bez pytania?

Tak: scp i rsync po cichu zastępują pliki w miejscu docelowym, więc w razie wątpliwości podejrzyj efekt przez rsync --dry-run.
scp nadpisuje każdy istniejący plik o tej samej nazwie w miejscu docelowym, bez pytania i bez opcji pominięcia. rsync również nadpisuje, ale tylko wtedy, gdy źródło się różni, i daje kontrolę: -n (--dry-run) wypisuje, co zostałoby zmienione, --ignore-existing nie rusza istniejących plików, --update pomija pliki nowsze w miejscu docelowym, a --backup --backup-dir=DIR zachowuje zastąpione wersje. Przy danych nie do odtworzenia kopiuj do świeżego katalogu i podmieniaj go dopiero potem.

Jak skopiować pliki bezpośrednio między dwoma serwerami VPS?

Uruchom rsync lub scp na jednym serwerze, kierując transfer na drugi, albo użyj scp -3, aby przepuścić kopię przez własny komputer.
Najszybsza droga to transfer serwer–serwer: połącz się przez ssh ze źródłowym VPS i uruchom rsync -avz /data/ user@OTHER_IP:/data/ (albo scp -r), aby dane nie przechodziły przez Twoje łącze domowe. Wymaga to, by pierwszy serwer miał klucz akceptowany przez drugi. Jeśli wolisz nie umieszczać kluczy na serwerach, scp -3 user@HOST_A:/path user@HOST_B:/path kopiuje przez Twoją maszynę wyłącznie na Twoich lokalnych danych logowania, kosztem jednokrotnego pobrania i wysłania całości.

Adrien Roche, Redaktor ds. infrastruktury i hostingu

Inżynier systemowy z ponad 10-letnim doświadczeniem w administrowaniu serwerami Windows i Linux. Adrien prowadzi dokumentację infrastruktury rdp.monster i pisze nasze poradniki o RDP, hostingu VPS, administracji serwerami, sieciach i narzędziach prywatności.

Zarejestruj się w naszym programie resellerskim

Twoje dane

Jeśli masz pytania, napisz do nas, klikając tutaj !
Imię i nazwisko(Wymagane)
Podaj swój adres e-mail. Musisz mieć konto na dashboard.rdp.monster !

Twoja firma

Podaj adres swojej strony, jeśli ją masz
Napisz w kilku słowach, jak zamierzasz sprzedawać usługi swoim klientom. Na przykład: rozmowy z ludźmi na forach.

Używamy plików cookie!

Używamy plików cookie, aby ulepszać przeglądanie strony, pokazywać spersonalizowane reklamy lub treści i analizować ruch. Klikając „Akceptuję”, zgadzasz się na używanie przez nas plików cookie.