Perintah scp Linux: Salin File ke dan dari VPS (rsync, sftp)
- 14 November 2026
- 09.00
- Oleh Adrien Roche
- Tutorial

Perintah scp di Linux: sintaks dan transfer dasar
scp (secure copy) menyalin file antar mesin melalui SSH, jadi user, kunci, dan port yang berfungsi untuk ssh juga berfungsi untuk scp. Polanya selalu scp [options] SOURCE DESTINATION, dan sisi mana pun yang berada di remote ditulis user@host:path. Dibutuhkan login SSH yang berfungsi; jika port 22 belum merespons, aktifkan SSH di Ubuntu dan perkuat keamanannya lebih dulu.
1. Lokal ke remote (unggah)
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/
Path yang diakhiri garis miring meletakkan file di dalam direktori itu dengan nama aslinya; path lengkap mengganti namanya saat tiba. Beberapa file lokal bisa ditulis sebelum tujuan selama tujuannya berupa direktori, dan direktori itu harus sudah ada: scp tidak membuat direktori induk.
2. Remote ke lokal (unduh)
scp user@SERVER_IP:/var/log/nginx/access.log .
scp user@SERVER_IP:'/var/log/nginx/*.log' ./logs/
Tanda titik berarti "di sini, dengan nama yang sama". Beri tanda kutip pada wildcard remote agar shell lokal Anda tidak memperluasnya. Remote ke remote juga bisa: scp -3 user@HOST_A:/data/dump.sql user@HOST_B:/data/ mengalirkan salinan melalui mesin Anda, jadi hanya mesin Anda yang perlu kredensial untuk kedua server.
3. Direktori dengan -r
scp -r ./site user@SERVER_IP:/var/www/
scp -r user@SERVER_IP:/etc/nginx ./nginx-backup
-r menyalin sebuah direktori beserta seluruh isinya. Perintah pertama membuat /var/www/site di server; yang kedua mengunduh seluruh pohon nginx ke folder lokal. Symlink disalin sebagai file biasa, salah satu alasan rsync lebih cocok untuk pohon sistem yang utuh.
Opsi scp yang benar-benar dipakai: -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
Flag port ditulis dengan huruf besar -P. Huruf kecil -p berarti "pertahankan waktu modifikasi, waktu akses, dan bit mode", dan karena ssh sendiri memakai -p untuk port, tertukar keduanya adalah kesalahan scp paling umum. Agar tidak mengulang port dan kunci di setiap perintah, definisikan host sekali di ~/.ssh/config; scp, rsync, dan sftp semuanya membacanya:
Host vps
HostName SERVER_IP
User user
Port 2222
IdentityFile ~/.ssh/id_ed25519
Dua flag lagi: -l 8000 membatasi transfer pada 8.000 Kbit/dtk (sekitar 1 MB/dtk), dan -v menunjukkan kunci mana yang ditawarkan saat autentikasi gagal. Sejak OpenSSH 9.0, scp berjalan di atas protokol SFTP; sintaksnya tidak berubah, tetapi trik shell yang disisipkan di dalam path remote (misalnya command substitution) tidak lagi dijalankan di server, dan -O mengembalikan protokol lama untuk server sangat tua yang menolak mode baru.
rsync: mirror, transfer yang bisa dilanjutkan, dan pengecualian
rsync hanya menyalin yang berubah. Jalannya yang pertama mirip scp -r; jalannya berikutnya membandingkan kedua sisi dan mengirim hanya selisihnya: file baru, dan untuk file yang berubah hanya blok yang dimodifikasi. Itulah yang menjadikannya alat untuk deployment, backup, dan apa pun yang berukuran besar. rsync harus terpasang di kedua sisi (sudo apt install rsync); beberapa image minimal dan container tidak menyertakannya.
1. Perintah sehari-hari
rsync -avz --progress ./site/ user@SERVER_IP:/var/www/site/
rsync -avz --progress user@SERVER_IP:/var/www/site/ ./site-backup/
-a (archive) setara dengan -rlptgoD: rekursif, menjaga symlink tetap symlink, mempertahankan izin, waktu, grup, pemilik, dan file perangkat; kepemilikan hanya dipertahankan bila sisi penerima berjalan sebagai root. -v menampilkan daftar file, -z mengompresi, --progress menampilkan setiap file.
Garis miring di akhir itu penting. ./site/ berarti "isi dari site"; ./site berarti "direktori itu sendiri", yang akan membuat /var/www/site/site. Kalau ragu, tambahkan -n (--dry-run) dan baca daftar filenya sebelum ada yang ditulis.
2. Mirror dengan --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 menghapus file di tujuan yang sudah tidak ada di sumber. Mirror sungguhan membutuhkannya, dan itu pula yang mengubah garis miring yang salah menjadi direktori yang terhapus, jadi lakukan dry-run sekali untuk setiap perintah --delete yang baru.
3. Mengecualikan file
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/
Pola bersifat relatif terhadap akar transfer; garis miring di depan mengunci posisinya, sehingga /config.php hanya mengecualikan file di tingkat teratas. --exclude-from membaca satu pola per baris.
4. Melanjutkan transfer yang terputus, port dan kunci khusus
rsync -avP -e 'ssh -p 2222 -i ~/.ssh/id_ed25519' ./disk.img user@SERVER_IP:/backup/
-P adalah singkatan dari --partial --progress: jika koneksi terputus, file parsial dipertahankan dan menjalankan ulang perintah yang sama akan melanjutkan dari titik berhenti. Opsi SSH diteruskan lewat -e, dan di sini portnya memakai huruf kecil -p karena itu flag milik ssh, bukan rsync; entri Host di ~/.ssh/config menghapus seluruh string -e tersebut.
sftp: transfer interaktif lewat login SSH yang sama
sftp memberi Anda prompt bergaya FTP di atas SSH, praktis untuk menjelajah sebelum menyalin.
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
Perintah yang diawali l bekerja di mesin Anda (lcd, lls, lpwd); sisanya bekerja di server. put -r dan get -r menyalin direktori, reget dan reput melanjutkan file yang terputus, dan !command menjalankan perintah shell lokal tanpa keluar dari sesi. sftp -b commands.txt user@SERVER_IP memutar ulang berkas berisi perintah-perintah ini untuk cron job.
Menyalin file dari Windows: scp di PowerShell dan WinSCP
Windows 10 (versi 1809 ke atas) dan Windows 11 menyertakan klien OpenSSH, jadi scp, sftp, dan ssh tersedia di PowerShell dengan flag yang sama seperti di Linux:
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
Kunci disimpan di C:\Users\you\.ssh\ bersama known_hosts, dan ssh-keygen -R SERVER_IP juga berfungsi di sana. Path relatif setelah cd menghindari kebingungan antara huruf drive dan nama host. rsync tidak disertakan; cara paling bersih untuk memakainya adalah lewat WSL: wsl rsync -avz /mnt/c/Users/you/site/ user@SERVER_IP:/var/www/site/.
Untuk antarmuka grafis, WinSCP adalah pilihan biasa: mendukung SFTP dan SCP, menyediakan tampilan dua panel dengan drag-and-drop, dan perintah Synchronize-nya kurang lebih melakukan apa yang dilakukan rsync --delete. WinSCP mengharapkan kunci dalam format .ppk milik PuTTY dan menawarkan konversi saat Anda memilih kunci OpenSSH. Untuk apa pun yang dideploy berulang kali, satu baris scp atau rsync di dalam skrip lebih mudah ditinjau dan diotomatiskan.
scp vs rsync vs sftp: mana yang dipakai
| Tugas | Alat terbaik | Alasan |
|---|---|---|
| Satu file, sekali saja | scp | Perintah terpendek, tanpa instalasi |
| Sebuah direktori, salinan pertama | scp -r atau rsync -a | Hasilnya setara |
| Deploy atau backup berulang | rsync | Hanya data yang berubah yang dikirim |
| Mirror dengan penghapusan | rsync --delete | scp tidak bisa menghapus file |
| Melanjutkan file besar | rsync -P atau reget di sftp | scp mengulang dari nol |
| Menjelajah, lalu memilih file | sftp atau WinSCP | Daftar interaktif |
| Ribuan file kecil | rsync atau tar lewat ssh | Overhead per file mendominasi scp |
| Windows tanpa WSL | scp di PowerShell atau WinSCP | Tidak ada rsync bawaan |
Patokan sederhana: scp bila perintahnya bisa Anda ketik dari ingatan, rsync begitu Anda tahu akan menjalankannya dua kali.
Tips kecepatan yang benar-benar terasa
- Kompresi tidak gratis.
-C(scp) dan-z(rsync) mengecilkan teks, dump SQL, dan log, tetapi memboroskan CPU pada arsip tarball, gambar, dan video. Jikatopmenunjukkansshdmentok di 100% selama transfer, lepaskan flag itu. - Gabungkan banyak file kecil. Perjalanan bolak-balik per file mendominasi saat Anda mengirim pohon source code; satu aliran lebih cepat:
tar czf - ./site | ssh user@SERVER_IP 'tar xzf - -C /var/www/'. - Coba cipher lain pada koneksi cepat. Ketika proses ssh sendiri yang menjadi hambatan,
scp -c aes128-gcm@openssh.commemanfaatkan instruksi AES yang ada di hampir semua CPU modern. - Lindungi transfer panjang. Jalankan di dalam
tmuxatauscreenagar sesi yang terputus tidak mematikan proses penyalinan, atau gunakanrsync -Plalu jalankan ulang. - Verifikasi dan batasi laju.
sha256sum filedi kedua sisi harus cocok;scp -lataursync --bwlimitmenjaga agar backup tidak menghabiskan bandwidth aplikasi.
Izin, kepemilikan, dan error yang sering muncul
Permission denied pada path tujuan
scp: /var/www//html/: Permission denied berarti login berhasil tetapi user tersebut tidak bisa menulis di sana. Salin ke direktori home Anda lalu sudo mv filenya, berikan kepemilikan target kepada user (sudo chown -R user:user /var/www/site), atau pada rsync tambahkan --rsync-path="sudo rsync", yang berfungsi bila user login punya sudo tanpa password, seperti disiapkan di membuat user dengan hak sudo di Linux. Mengunggah sebagai root menghindari error itu tetapi meninggalkan file milik root yang tidak bisa ditulis web server: jalankan sudo chown -R www-data:www-data /var/www/site setelahnya.
Permission denied (publickey)
Server menolak autentikasi. Periksa nama user, paksa kuncinya dengan -i, tambahkan -v; di VPS, sudo journalctl -u ssh -n 30 menyebutkan alasannya.
Remote host identification has changed
Wajar setelah instalasi ulang atau perubahan IP: host key tidak lagi cocok dengan ~/.ssh/known_hosts. Jika Anda memang membangun ulang server, jalankan ssh-keygen -R SERVER_IP lalu sambung kembali. Jika tidak, cari tahu penyebabnya sebelum mengetikkan password di mana pun.
No such file or directory
scp tidak membuat direktori induk: jalankan ssh user@SERVER_IP 'mkdir -p /var/www/site' lebih dulu. rsync hanya membuat komponen direktori terakhir (--mkpath, rsync 3.2.3+, membuat direktori induk).
rsync: command not found, atau protocol data stream (code 12)
rsync tidak ada di salah satu sisi; jalankan sudo apt install rsync di sana lalu coba lagi.
Skrip yang diunggah tidak mau dijalankan
File yang berasal dari Windows tidak punya bit eksekusi dan sering membawa akhiran baris CRLF, yang menghasilkan bad interpreter: No such file or directory. Perbaiki keduanya dengan chmod +x deploy.sh dan sed -i 's/\r$//' deploy.sh; sisi shebang dibahas di apa itu file .sh dan bagaimana bash menjalankannya. Satu klasik terakhir: scp file.txt user@SERVER_IP tanpa titik dua setelah host adalah penyalinan lokal yang diam-diam membuat file bernama user@SERVER_IP.
Semua ini mengandaikan sebuah server yang Anda akses lewat SSH sebagai root atau user sudo, di mana batasnya adalah transfer itu sendiri, bukan kuota. VPS Linux dari rdp.monster adalah mesin semacam itu: akses root penuh, CPU dan RAM dedicated, bandwidth tanpa batas (fair-use), tanpa KYC, menerima kripto, mulai $8.99 per bulan, dan server online sekitar 10 detik setelah pembayaran dikonfirmasi, sehingga hal pertama yang Anda jalankan di atasnya bisa langsung berupa scp dari langkah pertama.
Pertanyaan yang sering ditanyakan
Apakah perintah scp sudah usang?
scp memindahkan file lewat SFTP. Perintah, flag, dan sintaks user@host:path-nya tidak berubah, jadi skrip yang ada tetap berfungsi; hanya ekspansi shell di dalam path remote yang berperilaku berbeda, dan -O mengembalikan protokol lama untuk server yang membutuhkannya. Untuk otomatisasi baru, rsync atau sftp lebih mumpuni, tetapi scp sendiri tetap layak untuk penyalinan sekali jalan.Bisakah saya memakai scp dengan password alih-alih kunci SSH?
PasswordAuthentication yes, scp meminta password dan penyalinan berjalan; tidak ada flag untuk mengirim password lewat baris perintah, dan alat seperti sshpass yang melakukannya meninggalkan jejak di riwayat shell Anda. Server yang diperkuat biasanya menonaktifkan login password, sehingga scp gagal dengan Permission denied (publickey) sampai Anda memasang kunci dengan ssh-copy-id. Kunci juga yang memungkinkan skrip berjalan tanpa pengawasan.Apakah scp menimpa file yang sudah ada tanpa bertanya?
-n (--dry-run) mencetak apa yang akan berubah, --ignore-existing membiarkan file yang sudah ada, --update melewati file yang lebih baru di tujuan, dan --backup --backup-dir=DIR menyimpan versi yang diganti. Untuk apa pun yang tak tergantikan, salin ke direktori baru lalu tukar setelahnya.Bagaimana cara menyalin file langsung antara dua server VPS?
rsync -avz /data/ user@OTHER_IP:/data/ (atau scp -r) agar data tidak melewati koneksi rumah Anda. Cara itu menuntut server pertama menyimpan kunci yang diterima server kedua. Jika Anda enggan menaruh kunci di server, scp -3 user@HOST_A:/path user@HOST_B:/path menyalin lewat mesin Anda memakai kredensial lokal saja, dengan konsekuensi semuanya diunduh lalu diunggah sekali.Adrien Roche, Editor Infrastruktur & Hosting
Insinyur sistem yang sudah 10+ tahun mengelola server Windows Server dan Linux. Adrien mengurus dokumentasi infrastruktur rdp.monster dan menulis panduan kami tentang RDP, hosting VPS, administrasi server, jaringan, dan tool privasi.




