How to dd a remote disk using SSH on local machine and save to a local disk
Solution 1
If your intent is to backup a remote computer's HDD A via SSH to a single file that's on your local computer's HDD, you could do one of the following.
Examples
run from remote computer
$ dd if=/dev/sda | gzip -1 - | ssh user@local dd of=image.gz
run from local computer
$ ssh user@remote "dd if=/dev/sda | gzip -1 -" | dd of=image.gz
Live example
$ ssh skinner "dd if=/dev/sda5 | gzip -1 -" | dd of=image.gz
208782+0 records in
208782+0 records out
106896384 bytes (107 MB) copied, 22.7608 seconds, 4.7 MB/s
116749+1 records in
116749+1 records out
59775805 bytes (60 MB) copied, 23.9154 s, 2.5 MB/s
$ ll | grep image.gz
-rw-rw-r--. 1 saml saml 59775805 May 31 01:03 image.gz
Methods for monitoring?
-
Login via
ssh
in another terminal andls -l
the file to see what it's size is. -
You can use
pv
to monitor the progress of a large dd operation, for instance, for the remote example above, you can do:$ dd if=/dev/sda | gzip -1 - | pv | ssh user@local dd of=image.gz
-
Send a "SIGUSR1" signal to
dd
and it will print stats. Something like:$ pkill -USR1 dd
-
Use
dd
's progress switch,status=progress
References
The methods mentioned above for monitoring were originally left via comments by @Ryan & @bladt and myself. I've moved them into the answer to make them more obvious.
Solution 2
The error you receive is due to the use of sudo remotely (you'd be asked for the password but you don't have a tty to enter it). On the other hand, as a normal user you can't normally use simply dd
as suggested in other answer (you don't have the required permissions to the device).
You can solve the problem by giving yourself rights to execute dd
as sudo without a password. You can do this by editing the sudoers file (on the remote!):
sudo visudo
add the following line:
userfoo ALL=(ALL) NOPASSWD: /bin/dd if=/dev/sdX
Now you can issue:
ssh userfoo@host "sudo /bin/dd if=/dev/sdX" | dd of=test.dd
and it should work.
You could make a more generic entry in sudoers, allowing you to run dd
with any parameter, but it is wiser to keep this free permissions to the minimum you need.
Solution 3
I've just used a modified version on a virtual Linux Mint box to clone a physical hard drive on an aging RedHat server.
I ran the following as root on the virtual box:
ssh [email protected] "dd if=/dev/cciss/c0d0" | dd of=/dev/sdb
- 192.168.1.5 is the physical Red Hat Enterprise Linux 2.1 box.
- /dev/sdb is a new virtual disk, which when finished cloning will be the basis of a virtual version of the old dying physical box.
Solution 4
Combining these answers allowed me to clone to another Linux host and avoid the 'permission denied' error:
- RPI4 SD card (
/dev/mmcblk0
- this clones the entire card) - avoid permission issue by prompting for elevated privilege (
sudo -S
) - see progress as it copies (
status=progress
) - compressing the copy (
gzip
) - specify buffer size (
bs=64k
) for improved speed. You can specify higher values. please read this
ssh [email protected] "sudo -S dd if=/dev/mmcblk0 bs=64k status=progress | gzip -1 -" | dd of=rpiimg.gz bs=64k
Solution 5
I was in a similar situation recently. The difference for me was, that
- due to security measures
root
ssh
access was disabled -
sudo
was not installed (deliberately)
So what I did was:
- examine device file permissions (grep for appropriate block device naming sheme (
hd
,sd
,nvme
, etc.))
user@machine:~$ ls -la /dev/ |grep sd
brw-rw---- 1 root disk 8, 0 Nov 22 13:36 sda
brw-rw---- 1 root disk 8, 1 Nov 22 13:36 sda1
brw-rw---- 1 root disk 8, 2 Nov 22 13:36 sda2
brw-rw---- 1 root disk 8, 5 Nov 22 13:36 sda5
- add the user to the
disk
group
root@machine:~$ usermod -aG user disk
- then run the
dd
the same way you already tried (but w/osudo
)
ssh [email protected] "dd if=/dev/sdX " | dd of=/home/username/Documents/filename.image
(or also chain-in the gzip
as others suggested)
Related videos on Youtube
![Qu0rk](https://i.stack.imgur.com/XoH2O.jpg?s=256&g=1)
Qu0rk
Working with HTML, Mathematica, Python, CSS, Java, LaTeX, Blender, SolidWorks, among others. Pardon my ignorance and syntax confusion.
Updated on September 18, 2022Comments
-
Qu0rk almost 2 years
How can I create a backup of a remote disk using SSH on my local machine and save it to a local disk?
I've tried the following:
ssh [email protected] "sudo dd if=/dev/sdX " | \ dd of=/home/username/Documents/filename.image`
However, I receive the following error:
no tty present and no askpass program specified
-
DEAR ANGEL almost 9 yearsI tried this for a similar problem (backing up remote computer
ONE
's hard drive to remote computerTWO
's storage), like this:<br />[root@ONE]# dd if=/dev/sda1 | ssh root@TWOdd of=/root/Public/ONE/sda1.img
<br /> 409600+0 records in 409600+0 records out 209715200 bytes (210 MB) copied, 0.894929 s, 234 MB/s Pseudo-terminal will not be allocated because stdin is not a terminal root@TWO's password: The problem is that the/root/Public/ONE/sda1.img
file was created onONE
, not onTWO
as expected. How do I fix this? -
Shimon Doodkin over 8 yearsit is better to use lbzip2 or pigz insted of gzip
-
Shimon Doodkin over 8 yearswhy do i need " | dd of=image.gz" at end? (not just ">image.gz") because dd takes 100% of one cpu
-
Till Schäfer over 6 yearsRegarding monitoring: Newer dd versions also have the
status=progress
option. Thus, you do not need to runpkill -USR1 dd
from another terminal anymore. -
MikeW over 5 yearsOr, you can just run 'sudo ls' at the applicable end (and type in password), just prior to running the 'sudo dd ...' command
-
mannyglover over 5 yearsI only have tar on my old macOS. I know how to use tar, but I’m having trouble translating your command into tar’s format. Thanks in advance.
-
sensslen about 5 yearsWith newer versions of dd adding status=progress even allows monitoring of copy progress.
-
Arun Panneerselvam about 4 yearsexcellent work around. thanks
-
nobjta_9x_tq about 4 yearsrestore: gunzip -c xxx.gz | pv | dd of=/dev/sda1
-
acran over 3 yearsThis is the correct answer regarding the error message. But you could add these alternatives: use
ssh -t
to execute the command with atty
allowing for interactive password input / usesudo -S
to read password fromstdin
even without atty
. -
acran over 3 years@MikeW note that this might not work since by default
sudo
only remembers the authentication for the same console session, seetimeout_type
inman 5 sudoers
. -
stu over 2 yearsyou also want to bs=1M in there because by default dd will copy in 512 byte chunks. 1M much faster.
-
Admin almost 2 yearsIs it safe to read /dev/sda if the machine is actively booted from it?