scp or rsync directly within the Linux environment. These tools handle the SSH protocol natively, allowing you to transfer data securely without needing to mount Windows drives on the remote side. This approach works regardless of whether the target is accessible via local network or through a tunnel like Tailscale.
Understanding the Network Path
The core challenge in this scenario is that your WSL instance runs inside a virtualized Linux kernel on Windows. The remote server only accepts connections initiated from the Windows host's network stack. Therefore, you cannot simply use a standard IP address if that address is internal to the WSL virtual adapter. You must ensure that the destination IP or hostname resolves correctly from the perspective of the WSL networking layer.
If the remote machine is on the same local network as your Windows PC, you should use the Windows host's local IP address. If the remote machine is behind a firewall or NAT, you might need a VPN or a service like Tailscale. For detailed guidance on connecting to local machines, see How to connect to a local machine from WSL?. This ensures you are targeting the correct network interface that bridges WSL and your physical hardware.
Using SCP for Simple Transfers
The scp (Secure Copy Protocol) command is part of the OpenSSH suite, which is pre-installed in most modern WSL distributions. It is ideal for copying single files or small directories. The syntax mirrors the standard Unix cp command but requires specifying the remote user and host.
scp /path/to/local/file username@remote-host:/path/to/destination/
In this command, replace /path/to/local/file with the absolute path inside your WSL filesystem. Note that you cannot use Windows-style paths like C:\Users\Name directly here unless you access them via /mnt/c/.... Replace username with your account name on the remote server and remote-host with either the IP address or domain name. If the remote server uses a non-standard SSH port, add -P port_number to the command.
You will be prompted for the password of the remote user. Once authenticated, the file transfers over an encrypted channel. This method is straightforward but lacks the resume capability of rsync, meaning interrupted transfers must start over.
Using Rsync for Robust Synchronization
For larger files, multiple files, or when network stability is a concern, rsync is the superior choice. It supports incremental transfers, meaning it only copies changes rather than entire files every time. It also provides progress bars and bandwidth limiting options.
rsync -avz /path/to/source/ username@remote-host:/path/to/destination/
The flags used here serve specific purposes: -a preserves attributes like permissions and timestamps, -v enables verbose output so you can monitor progress, and -z compresses data during transfer to speed up slow connections. Ensure the source directory ends with a slash if you want to copy the contents into the destination folder, rather than creating a new folder named after the source.
If you encounter errors related to extended attributes or protocol streams, refer to resources on troubleshooting rsync issues. For example, check Troubleshooting Rsync Error: Protocol Data Stream (Code 12) on Windows 10 and Raspberry Pi if you face stream corruption issues. Similarly, Rsync backup failing on xattr addresses permission-related failures common in mixed environments.
Handling Non-Standard Access Methods
Sometimes the remote machine cannot be reached directly via standard SSH due to firewalls or lack of public IPs. In such cases, you might use a VPN client running on Windows, or a peer-to-peer tool like Tailscale. WSL can typically route traffic through these tunnels if they bind to the Windows host network adapter.
If you are using Wireguard or similar VPNs, ensure that the WSL instance has access to the virtual network interface created by the VPN software. You may need to configure routing tables manually if DNS resolution fails. See SSH Remotely to Server Running Wireguard VPN Client Connection for details on configuring network routes for remote access.
Another alternative is to set up an SSH server on Windows itself, though this is generally less secure and more complex to manage. Instead, relying on the native SSH client within WSL to reach the external host is the recommended practice. If you need to verify connectivity, use ping or nc (netcat) to test port accessibility before attempting file transfers.
Authentication and Security Best Practices
Entering passwords repeatedly is inefficient and insecure. Configure SSH keys for passwordless authentication. Generate a key pair in WSL using ssh-keygen and copy the public key to the remote server using ssh-copy-id. This allows both scp and rsync to run automatically in scripts without human intervention.
ssh-keygen -t ed25519
ssh-copy-id username@remote-host
Ensure that the remote server’s SSH configuration (/etc/ssh/sshd_config) allows public key authentication. Disable password login if possible to prevent brute-force attacks. Always keep your WSL distribution updated to benefit from the latest security patches in the OpenSSH client.
Frequently Asked Questions
Why does scp fail with "Host key verification failed"?
This error occurs because the remote host's fingerprint is not yet trusted by your WSL instance. You can resolve this by deleting the existing entry in ~/.ssh/known_hosts or by accepting the key prompt during the first connection. Always verify the fingerprint out-of-band to prevent man-in-the-middle attacks.
Can I use Windows paths like C:\Users directly in rsync?
No, rsync operates within the Linux filesystem context. You must convert Windows paths to their WSL equivalents, such as /mnt/c/Users. Using raw Windows paths will result in "No such file or directory" errors because the Linux kernel does not recognize NTFS drive letters natively.
What if the remote server is behind a NAT and has no public IP?
You need a tunneling solution such as a site-to-site VPN, Cloudflare Tunnel, or Tailscale. These tools create a virtual network interface that makes the remote machine reachable as if it were on the same LAN. Ensure your WSL instance can ping the virtual IP assigned by the tunneling service.
How do I limit bandwidth usage during transfer?
Both scp and rsync support bandwidth limiting. With rsync, use the --bwlimit=KBPS flag followed by the desired kilobytes per second. For scp, you can pipe the output through trickle or ionice if available, though rsync is generally easier to throttle effectively.
Is it safer to use SCP or SFTP for interactive transfers?
Both use the SSH protocol and provide equal encryption strength. SCP is simpler for scripting and one-off commands, while SFTP offers an interactive shell for navigating remote directories. For automated backups, rsync over SSH is preferred due to its efficiency and resumability capabilities.