Copying, moving, cloning WordPress is easiest and fastest by the command line using SSH – especially for large sites it is the best and often essential! You can use this method on any Linux system which contains
rsync like CentOS (cPanel), Plesk, Ubuntu and debian systems on VPS, dedicated servers or even containers like docker or LXD and LXC.
Easy rsync Commands to Copy WordPress Sites via SSH
We are going to cover a few different ways to use rsync to copy files from one VPS or dedicated server to another.
- Copy local files to remote
- Copy remote files to local path
- Specifying an SSH key for rsync in case you are copying from cPanel
- Specifying a non-standard SSH Port
- Specifying an SSH key and non-standard SSH port
Copy Local to Remote
The basic syntax for the rsync command is this
rsync -avz /source/path/ /destination/path/ --info=progress2
rsync -avz /var/www/vhosts/staging.engineering.com/httpdocs/ [email protected]:/var/www/engineer.wpbullet.me/ --info=progress2
Note that if you do not keep the trailing slash in the source directory, it will copy the
httpdocs directory so it ends up in
/var/www/engineer.wpbullet.me/httpdocs instead of all of the contents of the
httpdocs folder ending up in
/var/www/engineer.wpbullet.me. Generally you want to keep the trailing slashes to avoid confusion.
If you want to copy the symlinks you can use the
--copy-link option and exclusions can be done with the
This example is actually for a local to local copy!
rsync -avz ./ /var/www/lottosocial.hatchster.com/ --copy-links --exclude=wp-config.php --info=progress2
Copy Remote to Local
If you want to copy remote files to your local Linux server
rsync -avz [email protected]:/absolute/path/on/remote/ /local/destination/path/ --info=progress2
rsync -avz [email protected]:/var/www/engineer.wpbullet.me/ /var/www/vhosts/staging.engineeringexpress.com/httpdocs/ --info=progress2
Copy Local Path to Remote Path Using Specific Ports
If the remote SSH server daemon is not running on the standard port 22 you can change that with the
-e flag that passes different SSH command argument to
Copy remote path
public_html using port 2222 and copy it to
rsync -avz -e 'ssh -p 2222' [email protected]:~/public_html/ /tmp/live/ --info=progress2
Copy Local Files to Remote Server Using Specific SSH Key
Basic idea is to use the
-e flag again to pass special modifications to the
rsync -avz -e 'ssh -i sshkey' use[email protected]:path/ /target/path/ --info=progress2
If specifying a key use this command, it is copying the remote path folder
public_html to the local folder
rsync -avz -e 'ssh -i key' [email protected]:~/public_html/ /tmp/live/ --info=progress2
Now we can combine the SSH key and non-standard SSH port
Specific Private SSH Key and Custom SSH Port
Plenty of hosts change the standard SSH port to something else for security through obscurity since so many bots just attempt the standard SSH port 22.
For example WPEngine use port 2222, we can combine the key and port customizations inside of the same
So in this working example we use an SSH key called
key located in the current folder with SSH port
2222 on remote server
rsync -avz -e 'ssh -i key -p 2222' [email protected]:~/public_html/ /tmp/live/ --info=progress2
In this example we are using Siteground and their custom port 18765.
rsync -avz -e 'ssh -i key -p 18765' [email protected]:~/public_html/ /tmp/live/ --info=progress2
Troubleshooting rsync Errors
Common error is that the permissions are too liberal for
rsync to proceed.
ECDSA key fingerprint is SHA256:5IQref44tLXy8FeTRFDUwdA6bXotmTB79flkG8CGnXc. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[22.214.171.124]:18765' (ECDSA) to the list of known hosts. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0644 for 'key' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. Load key "key": bad permissions Permission denied (publickey). rsync: connection unexpectedly closed (0 bytes received so far) [Receiver] rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.1]
You can usually fix this error by making permissions exclusive for your user
chmod 600 key
rsync versions have to match! Check your
rsync version with this command
Make sure the version matches on both the local and remote server, here it is version
rsync version 3.1.2 protocol version 31 Copyright (C) 1996-2015 by Andrew Tridgell, Wayne Davison, and others. Web site: http://rsync.samba.org/ Capabilities: 64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints, socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace, append, ACLs, xattrs, iconv, symtimes, prealloc rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the GNU General Public Licence for details.
Hopefully this helps you copy your WordPress sites much more efficiently!
This last command is here because sometimes I forget a trailing slash
Copy all files * from current directory to directory above
rsync * ../ -avzh --info=progress2
Sources for this tutorial below as always 🙂