Я не совсем уверен, что здесь происходит или почему вам нужно запускать yum из вашего веб-приложения. Это кажется ... изворотливым. Однако я подозреваю, что все, что вам нужно, это запустить
yum -C info jdk
, потому что флаг -C
указывает yum
запускаться только из кеша или других локальных ресурсов и не связываться с сетью. , что не нужно делать для получения информации об установленном пакете. С info
для установленного пакета, как вы говорите jdk
, это будет работать, даже если нет кеша метаданных yum, потому что он получит информацию из rpm
база данных.
# SETUP CIDR ARRAY DATA
cidrs=(10.10.10.0/24 20.20.20.0/24)
cidrarr=()
for cidr in "${cidrs[@]}"; do
mask=$(echo $cidr | cut -d/ -f2)
ip=$(echo $cidr | cut -d/ -f1)
cidrdec=0;maskdec=0;p=0
for i in {1..4}; do
e=$((2**$((8*(4-$i)))))
o=$(echo $ip | cut -d. -f$i)
cidrdec=$(($cidrdec+$o*$e))
done
for ((i=1; i<=$mask; i++)); do
maskdec=$(($maskdec+2**(32-$i)))
done
cidrarr+=($cidr)
cidrarr+=($cidrdec)
cidrarr+=($maskdec)
done
# END SETUP CIDR ARRAY DATA
cidrtest() {
ipdec=0
for i in {1..4}; do
e=$((2**$((8*(4-$i)))))
o=$(echo $1 | cut -d. -f$i)
ipdec=$(($ipdec+$o*$e))
done
for i in ${!cidrarr[@]}; do
[ $((i%3)) -ne 0 ] && continue
t=${cidrarr[i+1]}
m=${cidrarr[i+2]}
ipm=$(($ipdec & $m))
[[ $ipm -eq $t ]] && echo "$1 is within ${cidrarr[i]}"
done
}
cidrtest 10.10.0.1
Я понимаю, что это устарело и уже имеет принятый ответ, но в этом решении используется функция, которую я написал для переноса между несколькими серверами в среде, где grepcidr
не был стандартным пакетом для всех серверов.
Комментарии должны пояснить, что он делает.
#! /bin/bash
# Set DEBUG=1, in order to see it iterate through the calculations.
#DEBUG=1
MAXCDN_ARRAY="108.161.176.0/20 94.46.144.0/20 146.88.128.0/20 198.232.124.0/22 23.111.8.0/22 217.22.28.0/22 64.125.76.64/27 64.125.76.96/27 64.125.78.96/27 64.125.78.192/27 64.125.78.224/27 64.125.102.32/27 64.125.102.64/27 64.125.102.96/27 94.31.27.64/27 94.31.33.128/27 94.31.33.160/27 94.31.33.192/27 94.31.56.160/27 177.54.148.0/24 185.18.207.65/26 50.31.249.224/27 50.31.251.32/28 119.81.42.192/27 119.81.104.96/28 119.81.67.8/29 119.81.0.104/30 119.81.1.144/30 27.50.77.226/32 27.50.79.130/32 119.81.131.130/32 119.81.131.131/32 216.12.211.59/32 216.12.211.60/32 37.58.110.67/32 37.58.110.68/32 158.85.206.228/32 158.85.206.231/32 174.36.204.195/32 174.36.204.196/32"
IP=108.161.184.123
function in_subnet {
# Determine whether IP address is in the specified subnet.
#
# Args:
# sub: Subnet, in CIDR notation.
# ip: IP address to check.
#
# Returns:
# 1|0
#
local ip ip_a mask netmask sub sub_ip rval start end
# Define bitmask.
local readonly BITMASK=0xFFFFFFFF
# Set DEBUG status if not already defined in the script.
[[ "${DEBUG}" == "" ]] && DEBUG=0
# Read arguments.
IFS=/ read sub mask <<< "${1}"
IFS=. read -a sub_ip <<< "${sub}"
IFS=. read -a ip_a <<< "${2}"
# Calculate netmask.
netmask=$(($BITMASK<<$((32-$mask)) & $BITMASK))
# Determine address range.
start=0
for o in "${sub_ip[@]}"
do
start=$(($start<<8 | $o))
done
start=$(($start & $netmask))
end=$(($start | ~$netmask & $BITMASK))
# Convert IP address to 32-bit number.
ip=0
for o in "${ip_a[@]}"
do
ip=$(($ip<<8 | $o))
done
# Determine if IP in range.
(( $ip >= $start )) && (( $ip <= $end )) && rval=1 || rval=0
(( $DEBUG )) &&
printf "ip=0x%08X; start=0x%08X; end=0x%08X; in_subnet=%u\n" $ip $start $end $rval 1>&2
echo "${rval}"
}
for subnet in $MAXCDN_ARRAY
do
(( $(in_subnet $subnet $IP) )) &&
echo "${IP} is in ${subnet}" && break
done
Вот улучшенный сценарий, основанный на grepcidr
, который отображает соответствующий CIDR.
Скрипт:
echo -e "Searching...\n"; cat cidr.txt | while read NETWORK; do grepcidr "$NETWORK" ip.txt && echo -e "=> found in $NETWORK\n"; done
Пример результата:
Searching...
172.17.1.1
172.18.1.1
=> found in 172.16.0.0/12
192.168.50.1
=> found in 192.168.50.0/24
Я хотел запустить это на нескольких хостах без установки grepcidr
и попробовал сценарий Дуга Р., но он не сработал, так что вот один, который я написал, который подтвердил свою работоспособность. Надеюсь, кому-то это будет полезно:
function in_subnet {
# Determine whether IP address is in the specified subnet.
#
# Args:
# cidr_subnet: Subnet, in CIDR notation.
# ip_addr: IP address to check.
#
# Returns:
# 0|1
#
local readonly cidr_subnet="${1}"
local readonly ip_addr="${2}"
local subnet_ip cidr_mask netmask ip_addr_subnet subnet rval
subnet_ip=$(echo "${cidr_subnet}" | cut -d'/' -f1)
cidr_mask=$(echo "${cidr_subnet}" | cut -d'/' -f2)
netmask=$(( 0xFFFFFFFF << $(( 32 - ${cidr_mask} )) ))
# Apply netmask to both the subnet IP and the given IP address
ip_addr_subnet=$(( netmask & $(ip_to_int ${ip_addr}) ))
subnet=$(( netmask & $(ip_to_int ${subnet_ip}) ))
# Subnet IPs will match if given IP address is in CIDR subnet
[ "${ip_addr_subnet}" == "${subnet}" ] && rval=0 || rval=1
return $rval
}
function ip_to_int {
local readonly ip_addr="${1}"
local ip_1 ip_2 ip_3 ip_4
ip_1=$(echo "${ip_addr}" | cut -d'.' -f1)
ip_2=$(echo "${ip_addr}" | cut -d'.' -f2)
ip_3=$(echo "${ip_addr}" | cut -d'.' -f3)
ip_4=$(echo "${ip_addr}" | cut -d'.' -f4)
echo $(( ip_1 * 256**3 + ip_2 * 256**2 + ip_3 * 256 + ip_4 ))
}