How To Use tar Command Through Network Over SSH Session

How do I use tar command over secure ssh session running on Linux or Unix-like system? How do I extract tar archive via SSH based network connection?

The GNU version of the tar archiving utility (and other old versions of tar) can be used through the network over ssh session. Do not use telnet/nc command due to insecure conection. You can use Unix/Linux pipes to create archives. Let us see some examples of how to use the tar command over ssh securely to create archives on Linux, BSD/macOS or Unix-like system.

Syntax for using tar command over ssh

The syntax is as follows to ssh into box and run the tar command:
ssh user@box tar czf - /dir1/ > /destination/file.tar.gz
OR
ssh user@box 'cd /dir1/ && tar -cf - file | gzip -9' >file.tar.gz
The following command backups /wwwdata directory to dumpserver.nixcraft.in (IP 192.168.1.201) host over ssh session:
# tar zcvf - /wwwdata | ssh user@dumpserver.nixcraft.in "cat > /backup/wwwdata.tar.gz"
OR
# tar zcvf - /wwwdata | ssh vivek@192.168.1.201 "cat > /backup/wwwdata.tar.gz"
Sample outputs:

tar: Removing leading `/' from member names
/wwwdata/
/wwwdata/n/nixcraft.in/
/wwwdata/c/cyberciti.biz/
....
..
...
Password:

In this example archive /data2/ with gpg:
$ tar zcf - /data2/ | gpg -e | ssh vivek@nas03 'cat - > data2-dd-mm-yyyy.tar.gz.gpg'
Please note that you may get an error that read as follows with ssh command when using with sudo or any other command that needs a pseudo-terminal allocation:
sudo: sorry, you must have a tty to run sudo
To avoid this problem pass the -t option to the ssh command:
# tar zcvf - /wwwdata | ssh -t vivek@192.168.1.201 "sudo cat > /backup/wwwdata.tar.gz"

Use of tar command over ssh sessions

Copying from the remote machine (server1.cyberciti.biz) to local system is as follows:
$ cd /path/local/dir/
$ ssh vivek@server1.cyberciti.biz 'tar zcf - /some/dir' | tar zxf -

Linux system hard drive backup/mirror using tar and ssh

Let us copy the entire hard disk drive named /dev/sdvf from local machine to the remote AWS EC2 cloud backup server:
# dd if=/dev/sdvf | ssh backupimg@vpc-aws-mumbai-backup-001 'dd of=prod-disk-hostname-sdvf-dd-mm-yyyy.img'
To restore a local drive from the image on the server, reverse the command:
One can restore a local hard disk drive from the image stored on the remote AWS EC2 cloud backup server as follows:
# ssh backupimg@vpc-aws-mumbai-backup-001 'dd if=prod-disk-hostname-sdvf-dd-mm-yyyy.img' | dd of=/dev/sdvf

Moving data to a new Linux system

The problem with scp and other command copying the directory structure is that Symbolic links, special devices, sockets, named pipes, and other stuff not copied. Hence, we use tar over ssh. For example, copy all data from nuc-box. Open the terminal on x230 laptop and run the ssh command along with tar command:
$ ssh vivek@nuc-box 'tar czf - /home/vivek' | tar xvzf - -C /home/vivek

Use tar command through network over SSH session for tape device

The default first SCSI tape drive under Linux is /dev/st0. You can read more about tape drives naming convention used under Linux here. You can also use dd command for clarity purpose:
# tar cvzf - /wwwdata | ssh root@192.168.1.201 "dd of=/backup/wwwdata.tar.gz"
It is also possible to dump backup to remote tape device:
# tar cvzf - /wwwdata | ssh root@192.168.1.201 "cat > /dev/nst0"
One can can use mt command to rewind tape and then dump it using cat command:
# tar cvzf - /wwwdata | ssh root@192.168.1.201 $(mt -f /dev/nst0 rewind; cat > /dev/nst0)$

How to extract tar over ssh

The syntax is pretty simple:
$ cat my-data.tar.gz | ssh user@server1.cyberciti.biz "tar zxvf -"
cat my-data.tar.gz | ssh user@server1.cyberciti.biz "cd /path/to/dest/; tar zxvf -"

In this example, restore tar backup over ssh session from the remote machine to local dir:
# cd /
# ssh root@192.168.1.201 "cat /backup/wwwdata.tar.gz" | tar zxvf -

If you wish to use above command in cron jobs or scripts then consider SSH keys to get rid of the passwords.

How to tar over SSH with progress bar

The pv command allows you to see the progress of data through a pipeline. So the syntax is:
$ cd /dir/to/backup/
$ tar zcf - . | pv | ssh vivek@server1.cyberciti.biz "cat > /backups/box42/backup-dd-mm-yyyy.tgz"
$ cd /tmp/data/
$ tar zcf - . | \
pv | \
ssh vivek@centos7 "cat > /tmp/data.tgz"

Some more examples of tar over ssh:

$ tar cvjf - * | ssh vivek@nixcraft "(cd /dest/; tar xjf -)"
$ tar cvzf - mydir/ | ssh vivek@backupbox "cat > /backups/myfile.tgz"
$ tar cvzf - /var/www/html | ssh vivek@server1.cyberciti.biz "dd of=/backups/www.tar.gz"
$ ssh vivek@box2 "cat /backups/www.tar.gz" | tar xvzf -
$ tar cvjf - * | ssh root@home.nas02 "(cd /dest/; tar xjf - )"

Make sure you read the tar command/ssh command/bash command man page for more info:
$ man tar
$ man bash
$ man ssh

A note about SSHFS - a FUSE filesystem

You can use sshfs to mount a remote directory and run tar command:
mkdir /data/
sshfs vivek@server1.cyberciti.biz:/ /data/
tar -zcvf /data/file.tar.gz /home/vivek/

Conclusion

You learned how to use the tar command over ssh sessions to transfer archives, files, and images securely. See GNU/tar home page here for more info.

🐧 If you liked this page, please support my work on Patreon or with a donation.
🐧 Get the latest tutorials on SysAdmin, Linux/Unix, Open Source/DevOps topics:
CategoryList of Unix and Linux commands
File Managementcat
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Network Utilitiesdig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg jobs killall kill pidof pstree pwdx time
Searchinggrep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNAlpine CentOS 8 Debian 10 Firewall Ubuntu 20.04
40 comments… add one
  • Anderson Brandão Feb 10, 2010 @ 0:39

    Another way would be using tar in both ends, as the example below:

    tar czvf - /somedir | ssh user@host "cat - | tar xzfv - -C /outputdir

  • Anderson Brandão Feb 10, 2010 @ 0:48

    Another way would be using tar in both ends, as the example below:

    tar czvf - /somedir | ssh user@host "cat - | tar xzfv - -C /outputdir"

  • Rich Mar 17, 2010 @ 14:53

    Anderson, the use of “cat” in your example is completely unnecessary.

    tar czvf - /somedir | ssh user@host "tar xvzf - -C /outputdir

  • Henno Täht Mar 18, 2010 @ 7:00

    I recently needed to copy entire directory structure from one machine to another, preserving symlinks, owners and dates. I’ve done this tens of times before with tar and ssh but this time it didn’t work.

    Although I didn’t use the -h option, tar nevertheless followed symlinks and not recreated them on other side. Distro was Ubuntu 8.04. When I tried it with a small set of files, it worked, though, but I needed the entire tree. I never figured it out why it acted like that.

    I was finally able to solve my problem by using rsync and after inital setup it worked very well. So for anyone stumbling over the same rock, here’s some examples getting it done with rsync:
    http://www.commandlinefu.com/commands/matching/rsync/cnN5bmM=/sort-by-votes

  • Philippe Petrinko Apr 1, 2010 @ 22:01

    Vivek, There are at least 3 typos of duplicated ssh (ssh ssh).

  • carlos May 26, 2010 @ 15:02

    And why not tar jxf user@remote.com:some_archive.tar.bz2 ? It will do the ssh for you, no need to do the ssh yourself (I don’t remember if this was in Debian Lenny or Ubuntu Lucid… maybe older versions/other versions too).

  • DucQuoc.wordpress.com Nov 8, 2010 @ 12:57

    Is there some simple method to copy file through some kind of “ssh chain” ?
    Assuming that I’m at “homepc” , can connect via SSH to “remote1” , and from “remote1” I can only connect SSH to “remote2” .

    Which is the “one-liner” to copy a file from “remote2” to “homepc” ?
    Let’s say it’s “remote2:/repository/somefile.war” (I googled around but not found easy method)

  • gUI Dec 2, 2010 @ 14:39

    Thanks a lot ! Really helpfull.

    In my case I wanted to untar. The solution is :

    ssh serveur “cat file.tar” | untar -xvf –

  • Pablo Lorenzzoni Feb 18, 2011 @ 20:13

    In my experience, “rsync over ssh” is much faster than “tar | ssh”. Both are faster than scp, though. The only advantage of “tar | ssh”, IMHO, is not needing to have rsync in the remote host…

  • Bennie Kahler-Venter Feb 24, 2011 @ 12:16

    GNU tar:

    tar jcvf user@host:/somedir/file.tar.bz2 –rsh-command=/usr/bin/ssh /sourcedir/

  • bla Jan 24, 2012 @ 11:38

    Easier:

    tar -czf – bla | ssh oherhost “(cd /somewher/to/restore && tar -xzf -)”

  • Dan Jun 4, 2013 @ 1:03

    I want to do exactly this to a Windows machine running ssh

    I’m trying something like

    tar zcvf - /somedir | ssh winuser@windowsbox.local " > /backup/wwwdata.tar.gz"

    but there is no “cat” in windows, and the similar commands (echo, type, more) doesn’t seem to take input from stdin. Any ideas?

  • iabc Aug 11, 2013 @ 15:11

    i think it will be better to use -p while making backup

  • Helper Feb 10, 2014 @ 13:10

    @Dan: http://www.giyf had told you this link:
    http://gnuwin32.sourceforge.net/packages/coreutils.htm

    work perfect with BitVise SSH Server on Win over here.

    HTH!

  • Helper Feb 10, 2014 @ 13:11

    @mod:
    pls add this line to last post and delete this:

    BTW: To add the install dir to the path makes things easier on target

  • eMPee584 May 2, 2015 @ 18:02

    If, for one reason or another, you call ssh with the `-t` param (as mentioned by Henno) or have set `RequestTTY yes` in your ssh_config, tar will give strange errors like
    `tar: Skipping to next header
    tar: Exiting with failure status due to previous errors`
    or
    `tar: A lone zero block at 21625
    tar: Exiting with failure status due to previous errors`
    These will go away by adding ssh parameter `-T Disable pseudo-tty allocation.`, or if you need `-t` by prepending `stty -onlcr; ` to the remote command as workaround (thx Henno!).

  • Vinay Gupta Sep 12, 2016 @ 9:59

    Hi,
    i am taking backup using this command
    tar cvzf – /wwwdata | ssh root@192.168.1.201 “cat > /dev/nst0”
    when i am extracting file it is got corrupted
    issue is how can i extract file from tape /dev/nst0 ?

Leave a Reply

Your email address will not be published. Required fields are marked *

Use HTML <pre>...</pre>, <code>...</code> and <kbd>...</kbd> for code samples.