Bash

如何通過 ssh 在遠端機器上查找文件的 md5sum?

  • September 24, 2014

我在 machineC 上執行我的下面的 shell 腳本,它在 machineC 本身的我的 PRIMARY 目錄中獲取我的文件的 md5sum。

#!/bin/bash

export PRIMARY=/data01/primary

for entry in "$PRIMARY"/*
do
   local_md5sum=$(/usr/bin/md5sum "$entry" | awk '{print $1}')
   echo $local_md5sum
done

一旦我在 shell 腳本上執行,它就會在 machineC 中列印出我的文件的 md5sum,它工作正常。

現在,我正在為其計算 md5sum 的同一個文件也可以在 machineA 或 machineB 中,所以我需要在 machineA 和 machineB 上執行 ssh 並在同一個文件上執行相同的 md5sum 並將其儲存在remote_md5sum變數中。

如果文件不在 machineA 中,那麼它應該在 machineB 中,並且文件將在 machineA 和 machineB 的這個目錄中

/bat/test/data/snapshot/20140918

所以我得到了下面我在 machineC 上執行的 shell 腳本,並且還試圖在 machineA 或 machineB 上找到文件的 md5sum

#!/bin/bash

# folder in machineC
export PRIMARY=/data01/primary

readonly SERVERS=(machineA machineB)
export SERVERS_1=${SERVERS[0]}
export SERVERS_2=${SERVERS[1]}

export FILES_LOCATION=/bat/test/data/snapshot/20140918  

for entry in "$PRIMARY"/*
do
   # find local md5sum on machineC
   local_md5sum=$(/usr/bin/md5sum "$entry" | awk '{print $1}')
   echo $local_md5sum

   # find remote md5sum of the file which will be on machineA or machineB
   remote_md5sum=$(ssh user@$SERVERS_1 /usr/bin/md5sum "$entry" | awk '{print $1}' || ssh bullseye@$SERVERS_2 /usr/bin/md5sum "$entry" | awk '{print $1}')
   echo "Remote Checksum: $remote_md5sum"

   # now compare local_md5sum and remote_md5sum
done

但是,每當我在 shell 腳本上執行時,我的 ssh 命令都會失敗,並且它不會將該文件的 md5sum 值儲存在remote_md5sum. 這種語法有什麼問題嗎?

remote_md5sum=$(ssh user@$SERVERS_1 /usr/bin/md5sum "$entry" | awk '{print $1}' || ssh user@$SERVERS_2 /usr/bin/md5sum "$entry" | awk '{print $1}')

我已經修改了你的腳本,這個現在可以工作了。我在腳本中添加了一些註釋以使其更易於理解。如果您需要更多幫助,請告訴我。

#!/bin/bash

#The export path which we set here.
export PRIMARY=/home/ramesh

#The main for loop execution starts here. 
for entry in "$PRIMARY"/*
do
   #Get the base name of the file which we check in the remote servers.
   #Get just the filenames without the path.
   #I am going to use the filename in the remote server to check. 

   filename=$(basename "$entry")
   echo "File Name: $filename"
   #Calculate the MD5Sum locally.
   local_md5sum=$(md5sum "$entry")
   echo "Local MD5Sum: $local_md5sum"

   #Check if the file exists in server1. 
   #Otherwise I can check in the other server.

   if ssh ramesh@server1 stat /home/ramesh/'$filename' \> /dev/null 2\>\&1 then

       #I have the file in server1 and so I get the md5sum from server1.
       #I store the md5sum inside remote_md5sum variable.
       remote_md5sum=$(ssh ramesh@server1 "cd /home/ramesh/; find -name '$filename'  -exec md5sum {} \;")
   else
       #Now, I know the file is in server2 as it is not present in server1. 
       remote_file=$(ssh ramesh@server2 "cd /home/ramesh/; find -name '$filename'  -exec md5sum {} \;")
   fi
   echo "Remote MD5Sum: $remote_file"
done

測試

我也想測試上面的腳本是否有帶空格的文件名。它執行良好,這是我執行腳本時得到的輸出。

File Name: file1
Local MD5Sum:  39eb72b3e8e174ed20fe66bffdc9944e  /home/ramesh/file1
Remote MD5Sum: b5fc751f836c5430b617bf90a8c4725d  ./file1

File Name: file with spaces
Local MD5Sum:  36707e275264f4ac25254e2bbe5ef041  /home/ramesh/file with spaces
Remote MD5Sum: 36707e275264f4ac25254e2bbe5ef041  ./file with spaces

引用自:https://unix.stackexchange.com/questions/156944