Polecenie scp: użycie i opcje, kopiowanie folderów i podawanie portu

Środowisko testoweRodzina RHELAlmaLinux 9.8OpenSSH 9.9p1Strona odbierająca Debian 12 · OpenSSH 9.2p1konto rootSprawdzono 2026-10-28

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.

🧭 Kierunek kopiowania scp i ścieżki zdalne
Diagram objaśniający
↔️ Kierunek kopiowania
$ scp report.txt user@203.0.113.10:~/scp-test/user@203.0.113.10:~/scp-test/report.txt ./downloads/-3 user@203.0.113.10:~/scp-test/report.txt user@198.51.100.20:~/scp-test/
źródło💻 Serwer uruchamiający poleceniereport.txt
➜
cel🖥️ Serwer zdalny203.0.113.10:~/scp-test/
źródło🖥️ Serwer zdalny203.0.113.10:~/scp-test/report.txt
➜
cel💻 Serwer uruchamiający polecenie./downloads/
źródło🖥️ Serwer zdalny A203.0.113.10:~/scp-test/report.txt
➜
Pośrednik💻 Serwer uruchamiający polecenie-3
➜
cel🖥️ Serwer zdalny B198.51.100.20:~/scp-test/
🧩 Postać ścieżki zdalnej
user konto do połączenia, 203.0.113.10 adres serwera lub domena, :~/scp-test/ a po dwukropku ścieżka na tym serwerze (tylda to folder domowy)
Gdy plik lokalny jest z przodu, a ścieżka zdalna za nim, wysyłasz. Jeśli ścieżka po dwukropku kończy się ukośnikiem, plik zapisuje się w tym folderze pod tą samą nazwą.
Gdy ścieżka zdalna jest z przodu, odbierasz. Odebrany plik trafia do ścieżki lokalnej podanej za nią.
Gdy źródło i cel to serwery zdalne, od OpenSSH 8.7 dane przechodzą przez serwer uruchamiający polecenie. To ta sama metoda co z -3.

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:00

Po 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:00

Jeś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.txt
report.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.

Symulator polecenia scpOpenSSH 9.9
[root@server work]#
Działa tylko w przeglądarce. Pliki po stronie zdalnej sprawdzisz na liście po lewej, a ↑↓ przywraca wcześniejsze polecenia.

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.gz
backup.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.

PoleceniePlikCzas wykonaniaPrędkość we wskaźniku postępu
scp backup.tar.gz20MB0,68 s53.6MB/s
scp -l 8000 backup.tar.gz20MB20.82 s996.5KB/s
scp access.log (3 razy)19MB0.79~0.89 s—
scp -C access.log (3 razy)19MB0.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 seconds

Wiersz [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

OpcjaZadanieWynik w tym artykule
-POkreśla port połączenia SSHPort 22: wysłanie report.txt zakończone, zamknięty port 2222: koniec z [Connection timed out]
-iOkreśla plik klucza prywatnego do uwierzytelniania kluczem publicznymWysłanie report.txt zakończone po wskazaniu ~/.ssh/id_ed25519
-rKopiuje pliki i podfoldery w folderzePo 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]
-pZachowuje czas modyfikacji, czas dostępu i uprawnienia źródłaCzas modyfikacji zachowany; po stronie odbierającej w tym artykule uprawnienie 600 zostało tylko w pliku wysłanym z -O -p
-CKompresuje dane w połączeniu SSHPrzy dzienniku 19MB między dwoma serwerami z tego artykułu wariant z opcją był nieco wolniejszy
-lUstawia górny limit prędkości transferu w Kbit/sZ -l 8000: 20MB przy 996.5KB/s, 20.82 sekundy
-vWypisuje przebieg od połączenia do transferu jako wiersze debug1Transfer SFTP potwierdzony wierszem [Sending subsystem: sftp]
-3Przesył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
-OPrzesyła starym protokołem SCPW danych wyjściowych -v pojawia się [Sending command: scp -v -t]; ścieżki ze spacjami wymagają dodatkowego ukośnika wstecznego
-oPrzekazuje do ssh opcję w formacie ssh_configCzas oczekiwania ustawiony na 10 sekund przez ConnectTimeout=10, potwierdzono [Connection timed out]

📎 Pozostałe opcje: według oficjalnego podręcznika

OpcjaZadanie
-qWyłącza wskaźnik postępu oraz ostrzeżenia i komunikaty diagnostyczne ssh
-JNajpierw łą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)
-FWskazuje inny plik jako plik konfiguracji użytkownika ssh (przekazywany bezpośrednio do ssh)
-4Wymusza użycie wyłącznie adresów IPv4
-6Wymusza 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:00

Dane 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.txt
scp -p report.txt user@203.0.113.10:~/scp-test/report-p.txt
report.txt                                    100%   14     4.7KB/s   00:00
scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txt
report.txt                                    100%   14     4.2KB/s   00:00
ssh 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.txt

report-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:00

Bez -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_ed25519

Nazwa 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:00

To 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.

Pozycjascprsync
Zakres transferuWszystkie wskazane pliki przy każdym uruchomieniuTylko 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 symbolicznePodąża za nimi i kopiuje plikiZ -a zostają dowiązaniami
Wymagania po stronie odbierającejDostęp SSH i serwer SFTPrsync 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 directory

Przy 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 closed

Gdy 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:00

Po 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 target

Wtedy 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:00

Jeś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.txt
report.txt                                    100%   14     5.6KB/s   00:00

Oficjalny 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

Jeśli istnieje plik o tej samej nazwie, zostanie nadpisany nowym bez pytania. Także gdy ten sam report.txt wysłano kilka razy do tego samego folderu, transfer przeszedł za każdym razem bez potwierdzenia. Dlatego pliki, które trzeba zachować, wysyłaj z inną nazwą na końcu ścieżki docelowej.

Gdy wstawisz * do ścieżki zdalnej i ujmiesz ją w pojedyncze cudzysłowy, odbierzesz wszystkie pliki z serwera zdalnego o pasującej nazwie. Przy odbieraniu report-*.txt z serwera zdalnego sześć pasujących plików przesłało się po kolei. Cudzysłowy sprawiają, że powłoka serwera uruchamiającego polecenie nie zinterpretuje * jako pierwsza.

Z -B scp działa w trybie wsadowym, który nie pyta o hasło ani frazę hasła. Według oficjalnego podręcznika w tym trybie nie można wpisać hasła, więc dla zadań automatycznych takich jak cron najpierw skonfiguruj uwierzytelnianie kluczem.

🧭 Polecane treści o poleceniach sieciowych 13 wpisów · 2 źródła
🗂️ Polecenia sieciowe
📄 Polecenie ip 📄 Polecenia netstat · ifconfig 📄 Polecenie nmtui
📄 Polecenie SSH 📄 Polecenie rsync 📄 Polecenie wget 📄 Polecenia rz · sz 📄 Polecenie scp
📄 Polecenie host 📄 Polecenie nslookup
📄 Polecenie iptables 📄 Polecenie firewall-cmd 📄 Polecenie certbot

ℹ️ 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 10   +   6   =