Да, знаю, но это команда выдает много инфы, кроме моего IP адреса в интернет.
Например вот мой адрес (узнал через один из сайтов) 92.178.31.963, но команда ifconfig этого значения не выдает. Возможно этой команде нужно дать какой-то параметр?
В Винде-пинде ipconfig тоже выдаст много инфо.
Есть всякие способы. Есть языки командной оболочки. Bash, например.
Вот адрес для сетевой карты eth0:
ip addr show eth0 | grep "inet" | grep "brd" | awk '{print $2}' | (IFS=/ read IP MISC; echo "${IP}")
Пример не уверен что корректный для любой Ubuntu системы, для любого подключения.. Нужно подумать...
Аналогичные штуки можно применять, чтобы выяснять адреса шлюзов, адреса через которые пакеты идут до какого-либо сервера. На Bash можно довольно много чего программить. Учебники и примеры есть в сети.
Вопрос задан некорректно, нечётко.
А вот штука
#!/bin/bash
# Script name: catch-mask
# The script is for determining of network mask
# available for the given IPv4 address in current and existing
# net.i-face configuration.
# One more function is to print out IPv4 network id.
#
# Error state variables definitions
#
CLEAR_ERROR_STATE=0
COMMON_ERROR_STATE=1
NETWORK_CONFIG_ERROR=222
NET_MASK_OCTET_OVERVALUE_ERROR=223
NET_MASK_BAD_ERROR=123
ERROR_STATE="${CLEAR_ERROR_STATE}"
############################
# #
# functions declarations #
# #
function help ()
{
echo -e "
Usage:
\t$0 routine_id ipv4_address
'routine_id' could be 'bit' for number of bits in a mask or
'routine_id' could be 'id' for network id to be printed out.
In current and existing network interface configuration the script will determine how much bits are up in network mask for the given IPv4 address.
One more function is to print out IPv4 network id.
"
}
function dec2bin () #### converter for a $1 number from decimal number system to number system with 'base=$base=$2'
{
value=$1
#base=$2
base=2
#number_plates=$(($3-1))
number_plates=$((8-1))
result=""
i=0
[ $value -eq 0 ] && result="0"
while [ $value -gt 0 ]
do
reminder=$((${value}%${base}))
value=$((${value}/${base}))
result="$reminder$result"
#echo "[$i] $value * ${base} + >$reminder<"
i=$(($i+1))
done
for i in $(seq 0 $number_plates) ; do
[ -z ${result:$i:1} ] && result="0$result"
done
echo -n "$result"
}
function dec2bin_ () #### converter for a $1 number from decimal number system to number system with 'base=$base=$2'
{
value=$1
#base=$2
base=2
#number_plates=$(($3-1))
number_plates=$((32-1))
result=""
i=0
[ $value -eq 0 ] && result="0"
while [ $value -gt 0 ]
do
reminder=$((${value}%${base}))
value=$((${value}/${base}))
result="$reminder$result"
#echo "[$i] $value * ${base} + >$reminder<"
i=$(($i+1))
done
for i in $(seq 0 $number_plates) ; do
[ -z ${result:$i:1} ] && result="0$result"
done
echo -n "$result"
}
function bin2dec () #### converter for a $1 number from binary number system to number system with 'base=$base=$2'
{
#decimal_value = from 0 to maximum bit index, summarise (bin_value[i]*2^i) , where bit numbering starts from zero
value=$1
#base=$2
base=10
result=""
#[ $value -eq 0 ] && result="0"
result=0
i=0
length=${#value}
p=$(($length-1))
for i in $(seq 0 $p ); do # "seq first increment last"
result=$(( $result + ${value:$i:1} * \
$(power=$p; r=1; for j in $(seq 1 $power ); do r=$(($r*2)); done; echo $r)\
))
i=$(($i+1))
p=$(($p-1))
done
echo -n "$result"
}
# #
# functions declarations #
# #
############################
#################
# input check #
[ -z "$1" ] && help && exit ${COMMON_ERROR_STATE}
[ -z "$2" ] && help && exit ${COMMON_ERROR_STATE}
# input check #
#################
# ip to work with
ROUTINE_ID="$1"
LAN_IP_DEC_RAW="$2"
# some variables init.
LAN_MASK_DEC=([0]="0" [1]="0" [2]="0" [3]="0")
LAN_MASK_BIN=([0]="0" [1]="0" [2]="0" [3]="0")
LAN_IP_DEC=([0]="0" [1]="0" [2]="0" [3]="0")
LAN_IP_BIN=([0]="0" [1]="0" [2]="0" [3]="0")
LAN_ID_DEC=([0]="0" [1]="0" [2]="0" [3]="0")
LAN_ID_BIN=([0]="0" [1]="0" [2]="0" [3]="0")
# Lets get the decimal netmask value.
# It could some confusing, "pretail" and "tail" could be user for error catching. Now there are not analised.
LAN_MASK_DEC_RAW="$( \
ifconfig | grep "${LAN_IP_DEC_RAW}" | awk '{print $4}' | (IFS=: read pretail mask tail ; echo $mask) \
)"
[ -z "${LAN_MASK_DEC_RAW}" ] && exit 0
##################
# convert mask #
LAN_MASK_DEC[0]="$(echo "$LAN_MASK_DEC_RAW" | (IFS=. read LAN_MASK_DEC[0] LAN_MASK_DEC[1] LAN_MASK_DEC[2] LAN_MASK_DEC[3] tail; echo "${LAN_MASK_DEC[0]}") )"
LAN_MASK_DEC[1]="$(echo "$LAN_MASK_DEC_RAW" | (IFS=. read LAN_MASK_DEC[0] LAN_MASK_DEC[1] LAN_MASK_DEC[2] LAN_MASK_DEC[3] tail; echo "${LAN_MASK_DEC[1]}") )"
LAN_MASK_DEC[2]="$(echo "$LAN_MASK_DEC_RAW" | (IFS=. read LAN_MASK_DEC[0] LAN_MASK_DEC[1] LAN_MASK_DEC[2] LAN_MASK_DEC[3] tail; echo "${LAN_MASK_DEC[2]}") )"
LAN_MASK_DEC[3]="$(echo "$LAN_MASK_DEC_RAW" | (IFS=. read LAN_MASK_DEC[0] LAN_MASK_DEC[1] LAN_MASK_DEC[2] LAN_MASK_DEC[3] tail; echo "${LAN_MASK_DEC[3]}") )"
( [ ${LAN_MASK_DEC[0]} -lt 0 ] || [ ${LAN_MASK_DEC[0]} -gt 255 ] ) && echo "Error [ $0 ]: Net mask octet \`${LAN_MASK_DEC[0]}\` is not valid." && exit "$NET_MASK_OCTET_OVERVALUE_ERROR"
( [ ${LAN_MASK_DEC[1]} -lt 0 ] || [ ${LAN_MASK_DEC[1]} -gt 255 ] ) && echo "Error [ $0 ]: Net mask octet \`${LAN_MASK_DEC[1]}\` is not valid." && exit "$NET_MASK_OCTET_OVERVALUE_ERROR"
( [ ${LAN_MASK_DEC[2]} -lt 0 ] || [ ${LAN_MASK_DEC[2]} -gt 255 ] ) && echo "Error [ $0 ]: Net mask octet \`${LAN_MASK_DEC[2]}\` is not valid." && exit "$NET_MASK_OCTET_OVERVALUE_ERROR"
( [ ${LAN_MASK_DEC[3]} -lt 0 ] || [ ${LAN_MASK_DEC[3]} -gt 255 ] ) && echo "Error [ $0 ]: Net mask octet \`${LAN_MASK_DEC[3]}\` is not valid." && exit "$NET_MASK_OCTET_OVERVALUE_ERROR"
LAN_MASK_BIN[0]="$(dec2bin "${LAN_MASK_DEC[0]}")"
LAN_MASK_BIN[1]="$(dec2bin "${LAN_MASK_DEC[1]}")"
LAN_MASK_BIN[2]="$(dec2bin "${LAN_MASK_DEC[2]}")"
LAN_MASK_BIN[3]="$(dec2bin "${LAN_MASK_DEC[3]}")"
LAN_MASK_BIN_RAW="${LAN_MASK_BIN[0]}${LAN_MASK_BIN[1]}${LAN_MASK_BIN[2]}${LAN_MASK_BIN[3]}"
# convert mask #
##################
####################################
# catch how much bit is the mask #
NUMBER_OF_MASK_BITS_UP=""
end_flag=0
sym_q=1 # symbol quantity
for sym_no in $(seq 0 31) ; do
( [ "${LAN_MASK_BIN_RAW:$sym_no:$sym_q}" != "0" ] && [ "${LAN_MASK_BIN_RAW:$sym_no:$sym_q}" != "1" ] ) && NUMBER_OF_MASK_BITS_UP="" && echo "Error [ $0 ]: In net mask \`${LAN_MASK_BIN[0]}.${LAN_MASK_BIN[1]}.${LAN_MASK_BIN[2]}.${LAN_MASK_BIN[3]}\` there is wrong symbol." && exit "${NET_MASK_BAD_ERROR}"
[ "$end_flag" == "0" ] && [ "${LAN_MASK_BIN_RAW:$sym_no:$sym_q}" == "0" ] && NUMBER_OF_MASK_BITS_UP=$sym_no && end_flag=1
[ "$end_flag" == "1" ] && [ "${LAN_MASK_BIN_RAW:$sym_no:$sym_q}" != "0" ] && NUMBER_OF_MASK_BITS_UP="" && echo "Error [ $0 ]: Net mask \`${LAN_MASK_BIN[0]}.${LAN_MASK_BIN[1]}.${LAN_MASK_BIN[2]}.${LAN_MASK_BIN[3]}\` detected to be not a valid net mask." && ERROR_STATE=${NET_MASK_BAD_ERROR} && break
done
# catch how much bit is the mask #
####################################
case "${ROUTINE_ID}" in
bit)
echo "$NUMBER_OF_MASK_BITS_UP"
;;
id)
################
# convert ip #
LAN_IP_DEC[0]="$(echo "$LAN_IP_DEC_RAW" | (IFS=. read LAN_IP_DEC[0] LAN_IP_DEC[1] LAN_IP_DEC[2] LAN_IP_DEC[3] tail; echo "${LAN_IP_DEC[0]}") )"
LAN_IP_DEC[1]="$(echo "$LAN_IP_DEC_RAW" | (IFS=. read LAN_IP_DEC[0] LAN_IP_DEC[1] LAN_IP_DEC[2] LAN_IP_DEC[3] tail; echo "${LAN_IP_DEC[1]}") )"
LAN_IP_DEC[2]="$(echo "$LAN_IP_DEC_RAW" | (IFS=. read LAN_IP_DEC[0] LAN_IP_DEC[1] LAN_IP_DEC[2] LAN_IP_DEC[3] tail; echo "${LAN_IP_DEC[2]}") )"
LAN_IP_DEC[3]="$(echo "$LAN_IP_DEC_RAW" | (IFS=. read LAN_IP_DEC[0] LAN_IP_DEC[1] LAN_IP_DEC[2] LAN_IP_DEC[3] tail; echo "${LAN_IP_DEC[3]}") )"
( [ ${LAN_IP_DEC[0]} -lt 0 ] || [ "${LAN_IP_DEC[0]}" -gt 255 ] ) && echo "Error [ $0 ]: Net mask octet \`${LAN_IP_DEC[0]}\` is not valid." && exit "$NET_MASK_OCTET_OVERVALUE_ERROR"
( [ ${LAN_IP_DEC[1]} -lt 0 ] || [ ${LAN_IP_DEC[1]} -gt 255 ] ) && echo "Error [ $0 ]: Net mask octet \`${LAN_IP_DEC[1]}\` is not valid." && exit "$NET_MASK_OCTET_OVERVALUE_ERROR"
( [ ${LAN_IP_DEC[2]} -lt 0 ] || [ ${LAN_IP_DEC[2]} -gt 255 ] ) && echo "Error [ $0 ]: Net mask octet \`${LAN_IP_DEC[2]}\` is not valid." && exit "$NET_MASK_OCTET_OVERVALUE_ERROR"
( [ ${LAN_IP_DEC[3]} -lt 0 ] || [ ${LAN_IP_DEC[3]} -gt 255 ] ) && echo "Error [ $0 ]: Net mask octet \`${LAN_IP_DEC[3]}\` is not valid." && exit "$NET_MASK_OCTET_OVERVALUE_ERROR"
LAN_IP_BIN[0]="$(dec2bin "${LAN_IP_DEC[0]}")"
LAN_IP_BIN[1]="$(dec2bin "${LAN_IP_DEC[1]}")"
LAN_IP_BIN[2]="$(dec2bin "${LAN_IP_DEC[2]}")"
LAN_IP_BIN[3]="$(dec2bin "${LAN_IP_DEC[3]}")"
# convert ip #
################
# aplly mask to ip address in binary form; i.e. multiply mask on ip
# the result is the network id
for j in $(seq 0 3); do
result=""
for i in $(seq 0 7); do
result="$result$(( ${LAN_MASK_BIN[$j]:$i:1}*${LAN_IP_BIN[$j]:$i:1} ))"
done
LAN_ID_BIN[$j]=$result
done
# convert id from binary 2 decimal
LAN_ID_DEC[0]=$(bin2dec ${LAN_ID_BIN[0]})
LAN_ID_DEC[1]=$(bin2dec ${LAN_ID_BIN[1]})
LAN_ID_DEC[2]=$(bin2dec ${LAN_ID_BIN[2]})
LAN_ID_DEC[3]=$(bin2dec ${LAN_ID_BIN[3]})
# decimal id and bit number output
echo "${LAN_ID_DEC[0]}.${LAN_ID_DEC[1]}.${LAN_ID_DEC[2]}.${LAN_ID_DEC[3]}/${NUMBER_OF_MASK_BITS_UP}"
;;
h|help|-h|--help)
help
;;
esac
# binary mask output
#echo "${LAN_ID_BIN[0]}.${LAN_ID_BIN[1]}.${LAN_ID_BIN[2]}.${LAN_ID_BIN[3]}"
exit "${ERROR_STATE}"
, если это сохранить в файл "catch-mask", в том каталоге, где будет лежать "catch-mask", сделать
"chmod +x ./catch-mask" и в каталоге с файлом catch-mask запустить
./catch-mask id IP-адрес-своего-компьютера
, то скрипт покажет идентификатор сети к которой принадлежит указанный ip адрес. Это может быть нужно при динамической перенастройке iptables , например, когда у компьютера поменялся ip адрес полученный по DHCP и для скрипта задающего правила iptables надо на автопилоте получить новый идентификатор подсети.
Я это использую на ноутбуке. В разных местах адреса у ноута разные, iptables нужны и на 98% одинаковы. Причём отдельным скриптом автоматизирована настройка нужных ip конфигураций.