DD Bash 备份问题 - “无法识别的操作数”

DD Bash 备份问题 - “无法识别的操作数”

我正在使用Datto 块驱动程序每晚拍摄我正在运行的服务器的快照。拍摄快照后,我通过 PipeViewer ( )dd将快照复制到文件系统上的文件中。然后,将该文件上传到 DropBox 并删除。/dev/datto0pvgzip

我已经使用 Bash 脚本自动执行此操作,并将其设置为每晚通过 cron 作业运行。以下是给我带来麻烦的 Bash 脚本片段:

echo "$(date +"%r"): Calculating MD5 checksum of /dev/datto0..."
MD5=$(md5sum /dev/datto0)
echo "$(date +"%r"): MD5: $MD5"

echo "$(date +"%r"): Compressing /dev/datto0 via gzip to /tmp directory..."
dd if=/dev/datto0 | pv | gzip -1 | dd of=/tmp/BACKUP_${TODAY}_${MD5}.dd.gz

echo "$(date +"%r"): Compression complete. File size is: $(du -b /tmp/BACKUP_${TODAY}_${MD5}.dd.gz | cut -f1) bytes"

这是引发的错误:

02:37:35 PM: Calculating MD5 checksum of /dev/datto0...
02:54:01 PM: MD5: 28a6a6c11f088d6149d178af6e45102a  /dev/datto0
02:54:01 PM: Compressing /dev/datto0 via gzip to /tmp directory...
dd: unrecognized operand ‘/dev/datto0.dd.gz’
Try 'dd --help' for more information.
 896kB 0:00:00 [42.7MB/s] [  <=>                                                                                                      ]
du: cannot access ‘/tmp/BACKUP_09_21_2015_28a6a6c11f088d6149d178af6e45102a’: No such file or directory
du: cannot access ‘/dev/datto0.dd.gz’: No such file or directory
02:54:01 PM: Compression complete. File size is:  bytes

以下是真正让我挠头的错误部分:

dd: unrecognized operand ‘/dev/datto0.dd.gz’

在我的剧本中,我一次也没有提到/dev/datto0.dd.gz

也许我的部分dd命令由于某种原因被跳过了?dd: unrecognized operand ‘/dev/datto0.dd.gz’

答案1

问题是,输出md5sum包含哈希值和原始文件名,因此变量 MD5 被设置为类似于的内容28a6a6c11f088d6149d178af6e45102a /dev/datto0。因此命令

dd of=/tmp/BACKUP_${TODAY}_${MD5}.dd.gz

扩展为

dd of=/tmp/BACKUP_09_21_2015_28a6a6c11f088d6149d178af6e45102a /dev/datto0.dd.gz

...这让人dd很困惑。同样,当您使用 时> /tmp/BACKUP_${TODAY}_${MD5}.dd.gz,它会扩展为两个单词,shell 不确定将输出发送到哪个单词,并且会给出“模糊重定向”错误。

您可以md5sum通过管道输出来解决这个问题awk '{print $1}'

MD5=$(md5sum /dev/datto0 | awk '{print $1}')

...或者使用变量扩展${MD5%% *},它将修剪第一个空格及其后的所有内容。此外,通常将变量引用放在双引号内是个好主意——它可以避免很多像这样的奇怪解析问题。结合使用Giacomo1968 的回答给出:

dd if=/dev/datto0 | pv | gzip -1 > "/tmp/BACKUP_${TODAY}_${MD5%% *}.dd.gz"

答案2

dd命令看起来很奇怪。为什么dd if管道一侧有一个,而dd of另一侧有一个?

dd if=/dev/datto0 | pv | gzip -1 | dd of=/tmp/BACKUP_${TODAY}_${MD5}.dd.gz

基于本页给出的建议用于dd备份目的时,您的命令似乎应该是这样的:

dd if=/dev/datto0 | pv | gzip -1 > /tmp/BACKUP_${TODAY}_${MD5}.dd.gz

请注意,最后| dd of=只是通过右箭头 ( >) 进行简单的输出重定向。

相关内容