Как найти md5sum файлов на удаленных машинах путем выполнения ssh?

Можно изменить имя для входа в систему с usermod путем выдачи команды (как корень, или с sudo):

usermod --login algo mpatil

где algo новое имя для входа в систему, и mpatil старое имя для входа в систему.

Это примерно эквивалентно предложению John's редактирования Вашего /etc/password вручную, но менее подверженный ошибкам, как usermod делает изменения для Вас.

Обратите внимание, что это только изменит Ваше имя для входа в систему, в особенности Ваш корневой каталог не будет изменен для отражения нового имени для входа в систему (скорее всего, это все еще будет /home/mpatil).

Если Вы хотите изменить свой корневой каталог также, можно дать команду:

usermod --login algo --home /home/algo --move-home mpatil

Это может вызвать проблемы с приложениями, которые записывают Ваше имя для входа в систему или расширенный путь корневого каталога в их конфигурации. Необходимо будет настроить приложение, которые делают это для использования нового пути корневого каталога и/или имени для входа в систему сами, точного метода в зависимости от приложения.

Хорошая начальная точка для идентификации такого приложения к grep для Вас старый вход в систему / старый путь корневого каталога в Вашем dotfiles.

2
23.09.2014, 01:13
3 ответа

Я изменил твой сценарий, и этот теперь работает. Я добавил несколько комментариев внутри скрипта, чтобы сделать его более понятным. Дайте мне знать, если вам понадобится помощь.

#!/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
4
27.01.2020, 21:54

Во-первых, вы никогда не используете вашу переменную File_Location . Это делает это бесполезным. Во-вторых, вы не можете использовать || Как и в оболочке.

Попробуйте что-то вроде:

entry="$FILES_LOCATION/$(basename "$entry")"

remote_md5sum=$(ssh user@$SERVERS_1 /usr/bin/md5sum "$entry" | awk '{print $1}')
if [ -z $remote_md5sum ] ; then 
    remote_md5sum=$(ssh user@$SERVERS_2 /usr/bin/md5sum "$entry" | awk '{print $1}')
fi
2
27.01.2020, 21:54

Вот быстрый и простой способ сделать это (все команды, работающие на «Machine2» как «user1»):

[user1@machine2]$ cd /home/user1/src

[user1@machine2]$ ssh user1@machine1 "cd src;find . -type f -exec md5sum {} \;" | md5sum --check | grep -v "OK"

Измените каталоги, чтобы соответствовать вашему сценарию.

Я выбрал это где-то в сети в 2007 году. Это помогает.

0
27.01.2020, 21:54

Теги

Похожие вопросы