проверить права владельца из файла (результаты нескольких путей) в скрипте bash - PullRequest
0 голосов
/ 18 февраля 2020

друзья, у меня проблема с моим скриптом. Я попытался найти полный путь к / bin / openssl и затем сохранить результаты в файл, прочитать пути к файлам и проверить права доступа и владельцев. Но в файле результатов /tmp/lista.txt у меня есть несколько путей. Как сделать скрипт для чтения и проверки каждого пути из файла результата. Есть идеи?

#!/bin/sh


module_id="AV.1.8.2.1"
echo " === $module_id module === "

#MODULE BODY
find / -wholename "*bin/openssl" -print > /tmp/list.txt

file="/tmp/list.txt"
path=$(cat /tmp/list.txt)
os=$(uname)
permission_other_good=0



if [ -e $path ]
then
    if [ $os = "Linux" ]
    then
        gid_min=$(grep ^GID_MIN /etc/login.defs)
        gid_min_value=$(echo $gid_min | cut -d " " -f2)
        uid_min=$(grep ^UID_MIN /etc/login.defs)
        uid_min_value=$(echo $uid_min | cut -d " " -f2)
        sys_gid_max=$(grep ^SYS_GID_MAX /etc/login.defs)
        sys_gid_max_value=$(echo $sys_gid_max | cut -d " " -f2)
        sys_uid_max=$(grep ^SYS_UID_MAX /etc/login.defs)
        sys_uid_max_value=$(echo $sys_uid_max | cut -d " " -f2)
        user_uid=$(stat -c %u $path)
        user=$(stat -c %U $path)
        group_gid=$(stat -c %g $path)
        group=$(stat -c %G $path)
        permission_other=$(stat -c %A $path | cut -b 8-10)

        if [ -z $gid_min_value ]
        then
            gid_min_value=1000
        fi

        if [ -z $uid_min_value ]
        then
            uid_min_value=1000
        fi

        if [ -z $sys_gid_max_value ]
        then
            sys_gid_max_value=$((gid_min_value-1))
        fi 

        if [ -z $sys_uid_max_value ]
        then
            sys_uid_max_value=$((uid_min_value-1))
        fi
    fi        

    if [ $os = "AIX" ]
    then
        gid_min_value=$(cat /etc/security/.ids | cut -d " " -f4)
        sys_gid_max_value=$((gid_min_value-1))
        uid_min_value=$(cat /etc/security/.ids | cut -d " " -f2)
        sys_uid_max_value=$((uid_min_value-1))
        user_uid=$(istat $path | awk -F " " 'NR==3{print $2}' | cut -d "(" -f1)
        user=$(istat $path | awk -F " " 'NR==3{print $2}' | cut -d "(" -f2 | cut -d ")" -f1)
        group_gid=$(istat $path | awk -F " " 'NR==3{print $4}' | cut -d "(" -f1)
        group=$(istat $path | awk -F " " 'NR==3{print $4}' | cut -d "(" -f2 | cut -d ")" -f1)
        permission_other=$(istat $path | awk -F " " 'NR==2{print $2}' | cut -b 7-9)
    fi    

    if [ $permission_other = "r-x" ] || [ $permission_other = "r--" ] || [ $permission_other = "--x" ] || [ $permission_other = "---" ]
    then
        permission_other_good=1  
    fi

    if [ $user_uid -le $sys_uid_max_value ] && [ $group_gid -le $sys_gid_max_value ] && [ $permission_other_good -eq 1 ]
    then
        compliant="Yes"
        actual_value="user = $user group = $group permission = $permission_other"
    else
        compliant="No"
        actual_value="user = $user group = $group permission = $permission_other"
    fi
else
    compliant="N/A"
    actual_value="File $file does not exist"
fi

# SCRIPT RESULT

echo :::$module_id:::$compliant:::$actual_value:::
echo " === End of $module_id module === "

Ответы [ 3 ]

0 голосов
/ 18 февраля 2020

Вот как в bash вы читаете файл строка за строкой

#!/bin/bash
inputfile="/tmp/list.txt"
while IFS= read -r line
do
  echo "do your stuff with $line"
done < "$inputfile"
0 голосов
/ 19 февраля 2020

Окей, лучшее решение - поместить результат в массив, а затем для

declare -a my_paths

my_paths=($(find / -wholename "*bin/openssl" -print 2>/dev/null))

for my_path in "${my_paths[@]}"; do

done
0 голосов
/ 18 февраля 2020

Поскольку вы используете bash, я бы не советовал использовать временные файлы, потому что он имеет много предостережений из-за файловой системы (что происходит, если ваш диск заполнен? Что происходит, если файл существует? Что происходит, если вы не не имеют разрешения на запись в базовый каталог (et c.) и из-за ограничений хранения имен файлов в текстовых файлах на основе строк (хотя это не должно быть проблемой для поиска openssl).

Если вы хотите проанализировать список файлов, вот общий и безопасный способ сделать это:

find / -wholename "*bin/openssl" -print0 | while IFS= read -r -d '' path
do
  # Write your code here using the 'path' variable
done

Но поскольку вы храните переменные внутри для l oop они будут ограничены областью действия l oop из-за операции канала между find и while. Вы можете обойти эту проблему, используя вместо этого замену процесса:

while IFS= read -r -d '' path
do
  # Write your code here using the 'path' variable
done < <(find / -wholename "*bin/openssl" -print0)

Это ведет себя практически так же, как и в предыдущем коде, за исключением того, что область видимости переменной не ограничена l oop.

PS. Вам придется иметь дело с назначением ваших переменных по нескольким путям openssl. Если вы просто скопируете / вставите свой код внутри для l oop, значения compliant и actual_value сохранят информацию о последнем пути в l oop, что, вероятно, не то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...