Strona główna » Blog » Polecenie scp w Linuksie: kopiowanie plików na VPS i z VPS
Polecenie scp w Linuksie: kopiowanie plików na VPS i z VPS
- 14 listopada 2026
- 09:00
- Autor: Adrien Roche
- Tutoriale

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ć
| Zadanie | Najlepsze narzędzie | Dlaczego |
|---|---|---|
| Jeden plik, jednorazowo | scp | Najkrótsze polecenie, nic do instalowania |
| Katalog, pierwsza kopia | scp -r lub rsync -a | Równoważny efekt |
| Powtarzalne wdrożenia lub kopie zapasowe | rsync | Przesyłane są tylko zmienione dane |
| Kopia lustrzana z usuwaniem | rsync --delete | scp nie potrafi usuwać plików |
| Wznowienie dużego pliku | rsync -P lub reget w sftp | scp zaczyna od zera |
| Przeglądanie i wybór plików | sftp lub WinSCP | Interaktywne listowanie |
| Tysiące małych plików | rsync lub tar przez ssh | W scp dominuje narzut na plik |
| Windows bez WSL | scp w PowerShellu lub WinSCP | Brak 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ślitoppokazujesshdna 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.comkorzysta z instrukcji AES obecnych w niemal każdym nowoczesnym procesorze. - Zabezpiecz długie transfery. Uruchamiaj je w
tmuxlubscreen, aby zerwana sesja nie przerwała kopiowania, albo używajrsync -Pi uruchamiaj ponownie. - Weryfikuj i ograniczaj pasmo.
sha256sum filepo obu stronach powinno dać ten sam wynik;scp -llubrsync --bwlimitnie 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 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?
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?
-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?
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.




