2012-02-03 2 views
0

Мне нужен сценарий, который делает что-то, если я нахожусь в университетском городке (Университет Ватерлоо), а другое - если нет. Как я могу определить мой ISP или что-то еще эквивалентное из сценария bash, чтобы я мог поместить его в надежный оператор if-else?Bash script: fork on currest ISP

(Я бегу Ubuntu. Если вам интересно, мое приложение запускается коммерческое программное обеспечение на сервере лицензий и сценарий должен знать, следует ли начать прокси или нет.)

ответ

2

Одним из вариантов является просмотр вашего общедоступного IP-адреса. Обычный способ определить, что должен сделать что-то вроде следующего:

my_ip=$(wget -qO - http://whatismyip.org/) 

Вероятно, что это достаточно информации для вас, чтобы делать то, что вы хотите. Или вы можете передать его до whois и захватить поле NetName или другое идентифицируемое поле.

+0

Удивительно, спасибо, что это прекрасно. Я могу запустить 'netname = $ (whois $ my_ip | grep NetName | cut -d: -f 2 | sed 's/^ * //')', чтобы получить имя сети. –

1

Во-первых, прокси сосать. Если это не обязательно ... избавиться от него. Во-вторых, реальный вопрос: как ваш компьютер знает, к какой сети он привязан? Айпи адрес? Шлюз по умолчанию? MAC-адрес шлюза? вуду?

Как только вы можете ответить на второй вопрос, создание сценария bash является тривиальным вопросом. IP-адрес может быть проанализирован с ifconfig ... по умолчанию шлюз может быть проанализирован с route ... MAC-адрес шлюза по умолчанию может быть проанализирован из сочетания ping и arp ... (необходимо сначала решить ip ... затем arp будет иметь для нее запись). и т. д.

0

Я не могу помочь вам с сценариями bash, но с точки зрения определения того, какой ISP вы используете, вы можете использовать свой IP-адрес/подсеть вместе с каким-либо конфигурационным файлом. Затем вы можете изменить файл comfig, не изменяя код, чтобы указать, в какой сети вы находитесь.

1

Простейшие будут проверять подсеть Вы находитесь в:

/sbin/ifconfig -a | sed -n '/Mask/ {/127.0.0.1/! p}' 

, но в самом худшем сценарии, где все то же самое, вы могли бы просто проследить путь к чему-то и сравнить первые прыжки. Сохраните эти значения, а затем просто сравните их.

#at uni 
$ traceroute stackoverflow.com | sed -n '2,5 s/[ 1-9]*\([^ ]*\) .*/\1/ p' > uni 

#at home 
$ traceroute stackoverflow.com | sed -n '2,5 s/[ 1-9]*\([^ ]*\) .*/\1/ p' > home 

#then when you want just check 
diff uni <(traceroute stackoverflow.com | sed -n '2,5 s/[ 1-9]*\([^ ]*\) .*/\1/ p' > location1) 

Статус выхода diff скажет вам, совпадает ли это или нет. Это будет работать в 90% случаев, для остальных вам нужно будет настроить параметр 2,5, который извлекает прыжки с 1 по 4. Чтобы быть честным, 1 достаточно, но если у вас есть несколько точек доступа, которые вы, возможно, захотите сравните для 2-го или 3-го ... просто проверьте результаты traceroute визуально и решите, что потребуется.

И не забудьте сравнить как для унии, так и для дома, так как вы можете найти что-то изменившееся, и вы просто хотели бы знать, что это произошло, а не для выбора по умолчанию.