如何在本地计算机上使用SSH创建远程磁盘的备份并将其保存到本地磁盘?


我尝试了以下操作:

ssh hostname@my.ip.address "sudo dd if=/dev/sdX " | \
  dd of=/home/username/Documents/filename.image`


但是,我收到以下错误:


没有tty且未指定askpass程序

#1 楼

如果要通过SSH将远程计算机的HDD A备份到本地计算机的HDD上的单个文件,则可以执行以下操作之一。

示例

运行从远程计算机

$ dd if=/dev/sda | gzip -1 - | ssh user@local dd of=image.gz


从本地计算机运行

$ ssh user@remote "dd if=/dev/sda | gzip -1 -" | dd of=image.gz


实时示例

>
$ 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


监视方法吗?


通过ssh在另一个终端登录并通过ls -l文件查看其大小。 >您可以使用pv监视大型dd操作的进度,例如,对于上面的远程示例,您可以执行以下操作:

$ dd if=/dev/sda | gzip -1 - | pv | ssh user@local dd of=image.gz



发送dd收到“ SIGUSR1”信号,它将打印统计信息。像这样的东西:

$ pkill -USR1 dd



参考文献

上面提到的用于监视的方法最初是通过@Ryan&@bladt的评论留下的。和我自己。我将它们移到答案中以使其更加明显。

评论


我针对类似的问题尝试了此操作(将远程计算机ONE的硬盘驱动器备份到远程计算机TWO的存储中),如下所示: ssh root @ TWO dd of = / root / Public / ONE / sda1.img
409600 + 0中的409600 + 0条记录已复制209715200字节(210 MB),0.894929 s,234 MB / s伪终端将由于stdin不是终端root @ TWO的密码而未分配:问题是/root/Public/ONE/sda1.img文件是在ONE上创建的,而不是在预期的两个上创建的。我该如何解决?

–Urhixidur
15年7月15日在13:59



有人可以给我们一个在本地计算机上使用PV的例子吗?谢谢。

–TCB13
15年12月16日在15:08

最好使用lbzip2或由gzip插入的Pigz

– Shimon Doodkin
16 Mar 10 '16 at 0:15

关于监视:较新的dd版本还具有status = progress选项。因此,您不再需要从另一个终端运行pkill -USR1 dd。

–直到Schäfer
18年1月2日在15:23

恢复:gunzip -c xxx.gz |光伏| dd of = / dev / sda1

– nobjta_9x_tq
20年4月11日在6:12

#2 楼

您收到的错误是由于远程使用sudo(系统会要求您输入密码,但没有tty可以输入密码)。另一方面,作为普通用户,您通常不能像其他答案中那样简单地使用dd(您没有对设备的必需权限)。
您可以通过授予自己使用以下权限的权限来解决此问题:在没有密码的情况下以sudo执行dd。您可以通过编辑sudoers文件(在远程上!)来做到这一点:

sudo visudo

添加以下行:

userfoo ALL=(ALL) NOPASSWD: /bin/dd if=/dev/sdX

现在您可以发出:

ssh userfoo@host "sudo /bin/dd if=/dev/sdX" | dd of=test.dd

,它应该可以正常工作。 dd带有任何参数,但是将此免费权限保持在所需的最低限度是更明智的。

评论


或者,您可以在运行“ sudo dd ...”命令之前,在适当的一端运行“ sudo ls”(并输入密码)。

– MikeW
19年2月19日在11:28

在dd的较新版本中,添加status = progress甚至可以监视复制进度。

– sensslen
19年5月21日在9:16

这是关于错误消息的正确答案。但是您可以添加以下替代方法:使用ssh -t使用带有允许交互式密码输入的tty执行命令/使用sudo -S即使没有tty也可以从stdin读取密码。

–阿克兰
20年11月1日,14:34

@MikeW注意,这可能不起作用,因为默认情况下sudo仅记住同一控制台会话的身份验证,请参阅man 5 sudoers中的timeout_type。

–阿克兰
20年11月1日,14:35

#3 楼

我刚刚在虚拟Linux Mint盒上使用了修改后的版本,以在老化的RedHat服务器上克隆物理硬盘。

我在虚拟机上以root用户身份运行了以下命令: 2.1 box。
/ dev / sdb是一个新的虚拟磁盘,完成克隆后,它将成为即将死去的物理盒子的虚拟版本的基础。


#4 楼

结合这些答案,我可以克隆到另一台Linux主机,并避免出现“权限被拒绝”错误:

RPI4 SD卡(/dev/mmcblk0-这将克隆整个卡)提升的特权(sudo -S
查看复制时的进度(status=progress
压缩副本(gzip
指定缓冲区大小(bs=64k)以提高速度。您可以指定更高的值。请阅读此内容


 ssh user@1.1.1.1 "sudo -S dd if=/dev/mmcblk0 bs=64k status=progress | gzip -1 -" | dd of=rpiimg.gz bs=64k
 


#5 楼

我最近也有类似情况。对我来说,区别在于,

由于安全措施root ssh的访问被禁用了

sudo没有被故意安装

那我该怎么办确实是:

检查设备文件权限(用于适当块设备命名sheme的grep(hdsdnvme等)) prettyprint-override“> 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

将用户添加到disk组中

 root@machine:~$ usermod -aG user disk
  

,然后以您已经尝试过的相同方式运行dd(但不带sudo

 ssh user@my.ip.address "dd if=/dev/sdX " |  dd of=/home/username/Documents/filename.image
 

(或也建议将其链入gzip