Polecenie scp: użycie i opcje, kopiowanie folderów i podawanie portu
scp to narzędzie do kopiowania, którego używasz do wymiany plików z serwerem, z którym łączysz się przez SSH. Gdy wysyłasz plik poleceniem scp, tak jak w cp najpierw podajesz źródło, a potem miejsce docelowe. Gdy wysłaliśmy pliki i foldery z serwera AlmaLinux 9 na serwer Debian 12 i pobraliśmy je z powrotem, transfer odbył się przez protokół SFTP, a plik 20MB dotarł w niecałą 1 sekundę.
Wszystkie poniższe dane wyjściowe to dokładny wynik działania scp z OpenSSH 9.9 na koncie root po stronie wysyłającej. Na przykładowe wartości zmieniono tylko adresy serwerów i nazwy kont.
1️⃣ Użycie scp i ścieżki zdalne
Przed ścieżką na serwerze zdalnym dopisz [konto@adres serwera:]. Ścieżka bez dwukropka jest traktowana jako ścieżka na serwerze, na którym uruchamiasz polecenie, więc to strona z dwukropkiem decyduje, czy wysyłasz, czy odbierasz.
Wysyła report.txt z bieżącego folderu do folderu scp-test w katalogu domowym serwera zdalnego.
scp report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.1KB/s 00:00Po zakończeniu transferu w jednym wierszu pojawiają się nazwa pliku, postęp, rozmiar, prędkość i czas trwania. Ten wskaźnik postępu pojawia się tylko przy uruchomieniu w terminalu. Dlatego gdy przekierujesz dane wyjściowe do pliku, w pliku nic nie zostanie.
Przy odbieraniu podaj najpierw ścieżkę zdalną, a potem lokalną ścieżkę zapisu.
scp user@203.0.113.10:~/scp-test/report.txt ./downloads/report.txt 100% 14 2.7KB/s 00:00Jeśli ścieżka docelowa kończy się nazwą pliku, a nie folderem, plik zapisuje się pod tą nazwą. Po wysłaniu poniższym poleceniem w folderze po stronie odbierającej report.txt miał nazwę report-1028.txt.
scp report.txt user@203.0.113.10:~/scp-test/report-1028.txtreport.txt 100% 14 4.6KB/s 00:00🔲 Symulator polecenia scp
W symulatorze poniżej możesz sam wpisać polecenia wysyłania, odbierania i kopiowania folderów oraz sprawdzić dane wyjściowe każdej opcji.
2️⃣ Opcje polecenia scp
Opcje wpisuj zaraz po scp, przed źródłem. -P określająca port to wielka litera, a mała -p zachowuje czasy i uprawnienia, więc pomylenie wielkości liter uruchamia inne działanie.
-l ustawia górny limit prędkości transferu w Kbit/s. Bez opcji plik 20MB przesłał się w niecałą 1 sekundę.
scp backup.tar.gz user@203.0.113.10:~/scp-test/backup.tar.gz 100% 20MB 53.6MB/s 00:00-l 8000 to około 1,000KB na sekundę. Przy wysłaniu tego samego pliku z -l 8000 wskaźnik postępu pokazał 996.5KB/s, a transfer trwał 20 sekund.
scp -l 8000 backup.tar.gz user@203.0.113.10:~/scp-test/backup-l.tar.gzbackup.tar.gz 100% 20MB 996.5KB/s 00:20-C kompresuje dane w połączeniu SSH tą samą metodą co gzip. Plik dziennika 19MB z powtarzającymi się zdaniami wysłano po trzy razy i między tymi dwoma serwerami wariant z -C okazał się nieco wolniejszy.
| Polecenie | Plik | Czas wykonania | Prędkość we wskaźniku postępu |
|---|---|---|---|
| scp backup.tar.gz | 20MB | 0,68 s | 53.6MB/s |
| scp -l 8000 backup.tar.gz | 20MB | 20.82 s | 996.5KB/s |
| scp access.log (3 razy) | 19MB | 0.79~0.89 s | — |
| scp -C access.log (3 razy) | 19MB | 0.84~0.97 s | — |
Czas wykonania to czas od uruchomienia polecenia przez połączenie do końca transferu. Podręcznik ssh również wyjaśnia, że kompresja pomaga na wolnych łączach, a w szybkich sieciach spowalnia transfer.
-v wypisuje przebieg od połączenia do transferu jako wiersze debug1, więc służy do szukania przyczyny, gdy połączenie się nie udaje lub zatrzymuje się na uwierzytelnianiu. Dane wyjściowe są długie, dlatego przez grep wybrano tylko wiersze uwierzytelniania i transferu.
scp -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending subsystem: sftp
Transferred: sent 2536, received 3248 bytes, in 0.1 secondsWiersz [Sending subsystem: sftp] oznacza, że scp wysłał plik protokołem SFTP. Od OpenSSH 9.0 scp domyślnie używa SFTP. Z -O transfer idzie starym protokołem SCP, a w tym samym miejscu pojawia się [Sending command: scp -v -t].
scp -O -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending command: scp -v -t ~/scp-test/
Sending file modes: C0600 14 report.txt
Transferred: sent 2328, received 3036 bytes, in 0.1 seconds📌 Główne opcje: wyniki z tego artykułu
| Opcja | Zadanie | Wynik w tym artykule | |
|---|---|---|---|
| -P | Określa port połączenia SSH | Port 22: wysłanie report.txt zakończone, zamknięty port 2222: koniec z [Connection timed out] | |
| -i | Określa plik klucza prywatnego do uwierzytelniania kluczem publicznym | Wysłanie report.txt zakończone po wskazaniu ~/.ssh/id_ed25519 | |
| -r | Kopiuje pliki i podfoldery w folderze | Po stronie odbierającej foldery css i images zostają w pierwotnej strukturze; bez opcji transfer nie dochodzi do skutku przez błąd [not a regular file] | |
| -p | Zachowuje czas modyfikacji, czas dostępu i uprawnienia źródła | Czas modyfikacji zachowany; po stronie odbierającej w tym artykule uprawnienie 600 zostało tylko w pliku wysłanym z -O -p | |
| -C | Kompresuje dane w połączeniu SSH | Przy dzienniku 19MB między dwoma serwerami z tego artykułu wariant z opcją był nieco wolniejszy | |
| -l | Ustawia górny limit prędkości transferu w Kbit/s | Z -l 8000: 20MB przy 996.5KB/s, 20.82 sekundy | |
| -v | Wypisuje przebieg od połączenia do transferu jako wiersze debug1 | Transfer SFTP potwierdzony wierszem [Sending subsystem: sftp] | |
| -3 | Przesyła dane między dwoma serwerami zdalnymi przez serwer uruchamiający polecenie (domyślnie od OpenSSH 8.7) | Wysłanie report.txt zakończone przy dwóch folderach tego samego serwera jako źródle i celu | |
| -O | Przesyła starym protokołem SCP | W danych wyjściowych -v pojawia się [Sending command: scp -v -t]; ścieżki ze spacjami wymagają dodatkowego ukośnika wstecznego | |
| -o | Przekazuje do ssh opcję w formacie ssh_config | Czas oczekiwania ustawiony na 10 sekund przez ConnectTimeout=10, potwierdzono [Connection timed out] |
📎 Pozostałe opcje: według oficjalnego podręcznika
| Opcja | Zadanie | |
|---|---|---|
| -q | Wyłącza wskaźnik postępu oraz ostrzeżenia i komunikaty diagnostyczne ssh | |
| -J | Najpierw łączy się z hostem pośrednim, a stamtąd ustawia przekazywanie TCP do celu końcowego (skrót ustawienia ProxyJump, wiele przeskoków rozdziela się przecinkami) | |
| -F | Wskazuje inny plik jako plik konfiguracji użytkownika ssh (przekazywany bezpośrednio do ssh) | |
| -4 | Wymusza użycie wyłącznie adresów IPv4 | |
| -6 | Wymusza użycie wyłącznie adresów IPv6 |
3️⃣ Kopiowanie folderów przez scp i zachowanie czasów
Gdy podasz folder bez opcji, scp wypisze błąd, że to nie jest zwykły plik, i nie wykona transferu.
scp site-files user@203.0.113.10:~/scp-test/scp: local "site-files" is not a regular file
scp: failed to upload file site-files to ~/scp-test/Z -r kopiowane są pliki i podfoldery w folderze.
scp -r site-files user@203.0.113.10:~/scp-test/logo.png 100% 48KB 4.7MB/s 00:00
style.css 100% 15 5.0KB/s 00:00
index.html 100% 15 5.2KB/s 00:00Dane wyjściowe pokazują tylko nazwy plików. W danych wyjściowych find po stronie odbierającej foldery css i images znalazły się w site-files w pierwotnej strukturze.
ssh user@203.0.113.10 'cd ~/scp-test && find site-files'site-files
site-files/images
site-files/images/logo.png
site-files/index.html
site-files/css
site-files/css/style.css-r podąża za dowiązaniami symbolicznymi w folderze i kopiuje pliki źródłowe, więc do folderów, w których dowiązania mają pozostać dowiązaniami, lepiej nadaje się rsync -a.
-p zachowuje czas modyfikacji, czas dostępu i uprawnienia źródła. Przed wysłaniem pliku report.txt ustawiono mu czas modyfikacji 1 października 2026 00:00 (UTC) i uprawnienia 600. Strefa czasowa serwera odbierającego to UTC, dlatego ls po stronie wysyłającej także uruchomiono z TZ=UTC.
TZ=UTC ls -l report.txt-rw------- 1 root root 14 Oct 1 00:00 report.txtscp -p report.txt user@203.0.113.10:~/scp-test/report-p.txtreport.txt 100% 14 4.7KB/s 00:00scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txtreport.txt 100% 14 4.2KB/s 00:00ssh user@203.0.113.10 'ls -l ~/scp-test/report.txt ~/scp-test/report-p.txt ~/scp-test/report-Op.txt'-rw------- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-Op.txt
-rw-rw-r-- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-p.txt
-rw-rw-r-- 1 user user 14 Oct 28 06:17 /home/user/scp-test/report.txtreport-p.txt wysłany z -p i report-Op.txt wysłany z -O -p zachowały pierwotny czas, a report.txt wysłany bez opcji zapisał się z czasem wysłania. Na serwerze odbierającym pliki wysłane przez SFTP nawet z -p zapisały się z uprawnieniami 664, a 600 zachował tylko plik wysłany starym protokołem SCP (-O).
Dlatego w plikach, których uprawnienia mają być takie same jak w źródle, po wysłaniu sprawdź uprawnienia przez ls -l po stronie odbierającej.
4️⃣ Podawanie portu i pliku klucza w scp
Na serwerach, z którymi nie połączysz się domyślnym portem 22 i domyślnym kluczem, przed wysłaniem podaj port i klucz samodzielnie. -P określa port połączenia SSH, a -i plik klucza prywatnego do uwierzytelniania kluczem publicznym.
Poniżej przykład z bezpośrednim podaniem portu 22 i pliku klucza. Na serwerze ze zmienionym portem wpisz ten numer zamiast 22.
scp -P 22 -i ~/.ssh/id_ed25519 report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.3KB/s 00:00Bez -i, tak jak ssh, scp używa po kolei kluczy o domyślnych nazwach w ~/.ssh (id_rsa, id_ecdsa, id_ed25519 itd.).
Jeśli często wysyłasz na ten sam serwer, zapisz alias w ~/.ssh/config, a w scp wpisuj tylko alias.
Host myserver
HostName 203.0.113.10
User user
Port 22
IdentityFile ~/.ssh/id_ed25519Nazwa z wiersza Host staje się aliasem, a cztery wiersze pod nią zastępują adres serwera, konto, port i plik klucza. Polecenie z samym aliasem zakończyło się takim samym jednowierszowym wynikiem jak przy pełnym adresie i kluczu.
scp report.txt myserver:~/scp-test/report.txt 100% 14 4.2KB/s 00:00-P, -i i aliasy korzystają wprost z ustawień połączenia ssh, więc tworzenie klucza i rejestrowanie go na serwerze też przebiega tak samo jak przy łączeniu się przez polecenie SSH.
5️⃣ Kopiowanie między serwerami przez scp
Nawet gdy źródło i cel to serwery zdalne, wystarczy jeden wiersz scp. Od OpenSSH 8.7 dane są przesyłane przez serwer uruchamiający polecenie, a ta metoda to -3. Oficjalne informacje o wydaniu podają jako powód zmiany domyślnej metody to, że na serwerze źródłowym nie trzeba trzymać danych uwierzytelniających serwera docelowego.
Poniższy pomiar wykonano z dwoma folderami tego samego serwera jako źródłem i celem. Jeśli serwer docelowy jest inny, zmień tylko konto i adres na końcu.
scp -3 user@203.0.113.10:~/scp-test/report.txt user@203.0.113.10:~/scp-test/copy3/report.txt 100% 14 2.5KB/s 00:00To tak, jakby centrala odbierała dokumenty między dwoma oddziałami i wysyłała je dalej.
Dawną metodę, w której serwer źródłowy wysyła bezpośrednio do serwera docelowego, wybiera się przez -R. Wymaga ona, by serwer źródłowy mógł łączyć się z serwerem docelowym bez hasła. Od OpenSSH 10.6 użycie -R pokazuje ostrzeżenie o planowanym wycofaniu, a kolejne wersje mają ignorować tę opcję i kopiować metodą -3.
6️⃣ Porównanie scp i rsync
Do jednorazowego wysłania kilku plików wystarczy scp, a do wielokrotnego synchronizowania tego samego folderu lub wznawiania przerwanego transferu lepsze jest polecenie rsync. scp przy każdym uruchomieniu wysyła od nowa wszystkie wskazane pliki, a rsync porównuje źródło z celem i przesyła tylko zmienione pliki.
| Pozycja | scp | rsync |
|---|---|---|
| Zakres transferu | Wszystkie wskazane pliki przy każdym uruchomieniu | Tylko pliki zmienione względem źródła |
| Zachowanie częściowo odebranych plików (--partial) | ❌ | ✅ |
| Usuwanie plików, których nie ma w źródle (--delete) | ❌ | ✅ |
| Dowiązania symboliczne | Podąża za nimi i kopiuje pliki | Z -a zostają dowiązaniami |
| Wymagania po stronie odbierającej | Dostęp SSH i serwer SFTP | rsync zainstalowany po obu stronach |
7️⃣ Komunikaty błędów polecenia scp i rozwiązania
Gdy scp się nie powiedzie, przyczyna pojawia się od razu w pierwszym wierszu danych wyjściowych. We wszystkich trzech przypadkach, w których celowo wywołano błąd brakującym plikiem, uprawnieniami zapisu i złym portem, przyczyna była w pierwszym wierszu, a kod wyjścia ani razu nie wyniósł 0.
🔲 No such file or directory
Gdy spróbujesz odebrać plik, którego nie ma po stronie zdalnej, zostanie wypisane [No such file or directory] wraz ze ścieżką.
scp user@203.0.113.10:~/scp-test/nofile.txt ./downloads/scp: ~/scp-test/nofile.txt: No such file or directoryPrzy wysyłaniu ten sam błąd pojawia się, gdy nie ma folderu docelowego. scp nie tworzy brakujących folderów, więc najpierw uruchom przez ssh mkdir -p i utwórz folder.
scp report.txt user@203.0.113.10:~/scp-test/nodir/sub/scp: dest open "scp-test/nodir/sub/": No such file or directory
scp: failed to upload file report.txt to ~/scp-test/nodir/sub/🔲 Permission denied
Gdy folder po stronie odbierającej nie ma uprawnienia zapisu, po [dest open] następuje [Permission denied]. Poniżej wynik wysłania do folderu readonly z uprawnieniami 555.
scp report.txt user@203.0.113.10:~/scp-test/readonly/scp: dest open "scp-test/readonly/report.txt": Permission denied
scp: failed to upload file report.txt to ~/scp-test/readonly/Jeśli przed [Permission denied] stoi [konto@adres serwera:], a w nawiasie jest metoda uwierzytelniania, np. publickey, połączenie odrzucono na etapie uwierzytelniania. Ten tekst to format, którego program ssh używa przy nieudanym uwierzytelnianiu, więc najpierw sprawdź plik klucza podany przez -i i klucz publiczny zarejestrowany na serwerze.
🔲 Connection timed out
Gdy numer portu jest błędny albo zapora blokuje ten port i nie ma odpowiedzi, scp czeka na połączenie i kończy z [Connection timed out]. Poniżej wynik wysłania na zamknięty port 2222 przy 10 sekundach oczekiwania.
scp -P 2222 -o ConnectTimeout=10 report.txt user@203.0.113.10:~/scp-test/ssh: connect to host 203.0.113.10 port 2222: Connection timed out
scp: Connection closedGdy pojawi się ten błąd, najpierw sprawdź, czy numer podany w -P jest taki sam jak port SSH serwera.
🔲 Spacje i tylda (~) w ścieżkach
Przy dzisiejszym scp, który przesyła przez SFTP, wystarczy raz ująć ścieżkę zdalną ze spacjami w pojedyncze cudzysłowy.
scp report.txt 'user@203.0.113.10:~/scp-test/my files/'report.txt 100% 14 4.7KB/s 00:00Po dodaniu -O do tego samego polecenia i wysłaniu starym protokołem SCP nastąpił błąd [ambiguous target]. W starym protokole SCP zdalna powłoka interpretuje bowiem ścieżkę jeszcze raz.
scp -O report.txt 'user@203.0.113.10:~/scp-test/my files/'scp: ambiguous targetWtedy wstaw ukośnik wsteczny przed spacją, aby także zdalna powłoka czytała to jako jedno słowo.
scp -O report.txt 'user@203.0.113.10:~/scp-test/my\ files/'report.txt 100% 14 4.5KB/s 00:00Jeśli ścieżka po dwukropku zaczyna się bez ukośnika i tyldy, jest traktowana względem folderu domowego konta zdalnego.
scp report.txt user@203.0.113.10:scp-test/report-rel.txtreport.txt 100% 14 5.6KB/s 00:00Oficjalny podręcznik zaleca użycie -O, gdy stary serwer SFTP nie potrafi zamienić ścieżki zaczynającej się od tyldy na folder domowy. Wtedy ścieżka względem folderu domowego bez tyldy, jak wyżej, też zapisze plik w tym samym miejscu.
🔢 FAQ & polecane treści











ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.