Bash
如何通過 ssh 在遠端機器上查找文件的 md5sum?
我在 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