2013-11-11 4 views
0

Я пытаюсь понять сценарий Linux Bash. Цель скрипта - ограничить доступ к серверным службам только для некоторых пользователей dyndns (с помощью правил ufw). Часть сценария:Понимание части сценария Linux Bash

ALLOWEDUSERS="client1.dyndns.org client2.dyndns.org" 

for host in $ALLOWEDUSERS ; do 
    ip=`host $host | cut -d ' ' -f 4` 
    if [ $? -eq 0 ]; then 
     ufw allow proto tcp from $ip to any 
    fi 
done 

хорошо

for host in $ALLOWEDUSERS ; do 

ясно, что перебирает ALLOWEDUSERS,

насколько я понимаю

if [ $? -eq 0 ]; then 

проверяет, если команда выполняется до (если так правило ufw добавлено)

, но как же остальные из сниппета

ip=`host $host | cut -d ' ' -f 4` 

проверяет, является ли клиент IP является один из разрешенных учетной записи DynDNS?

Большое спасибо за вашу помощь,

Тони

+0

Этот сценарий написан плохо, и, вероятно, нарушена. Зачем тратить время на это? –

+0

Привет Бармар «Зачем тратить время на это? –

+2

Программист, по-видимому, думал, что он проверяет статус выхода команды 'host', которая является' 0', если поиск имени хоста удался, но на самом деле он проверяет статус выхода 'cut', поскольку статус конвейера - это статус последней команды, поэтому он не работает так, как планировалось. – Barmar

ответ

0

Скрипт по существу эквивалентно:

ALLOWEDUSERS="client1.dyndns.org client2.dyndns.org" 

for host in $ALLOWEDUSERS ; do 
    ip=`host $host | cut -d ' ' -f 4` 
    ufw allow proto tcp from $ip to any 
done 

if в оригинальном сценарии была проверка результата cut, не host, и она всегда была успешной, так что не служил никакой полезной цели.

Когда имя хоста DynDNS допустимо, для его включения в брандмауэр будет добавлено правило.

Когда имя хоста не найдено, host команда печатает:

Host clientN.dyndns.org not found: 3(NXDOMAIN) 

так $ip будет found:. Это будет стараться сделать:

ufw allow proto tcp from found: to any 

Поскольку это не является допустимым правило брандмауэра, я ожидаю, что это будет игнорироваться и выдается сообщение об ошибке.

Если вы хотите, чтобы делать то, что сценарий был, видимо, пытался сделать, это должно быть:

ALLOWEDUSERS="client1.dyndns.org client2.dyndns.org" 

for host in $ALLOWEDUSERS ; do 
    hostresult=`host $host` 
    if [ $? -eq 0 ]; then 
     ip=`echo "$hostresult" | cut -d ' ' -f 4` 
     ufw allow proto tcp from $ip to any 
    fi 
done 
+0

Спасибо за этот обширный полезный ответ! пальцы вверх. –

1

Это не действительно проверить ничего.

Выход из host $host - это что-то вроде $host has address xxx.xxx.xxx.xxx.

Например:

$ host localhost 
localhost has address 127.0.0.1 

Затем cut -d ' ' -f 4 изолирует четвертую часть, которая является IP-адрес. Это используется как IP-адрес для команды ufw.

Смежные вопросы