Вам нужно локальное имя ():
http://www.w3.org/TR/xpath#function-local-name
Для закрепления от http://jcooney.net/archive/2005/08/09/6517.aspx :
Это выражение будет соответствовать элементу “bar”:
//*[local-name()='bar']
Этот не будет:
//bar
Программа ping установлена setuid root. Это позволяет любому пользователю использовать программу и по-прежнему иметь возможность открывать необработанный сокет.
После того, как он открывает необработанный сокет, он обычно отбрасывает привилегии root.
Обычно вам нужен необработанный сокет для правильного выполнения ICMP, и сырые сокеты обычно ограничены. Так что на самом деле это вовсе не вина python.
Что касается упомянутого выше ICMP, очевидно, что многие реализации на самом деле плохо поддерживают эти комбинации флагов. Так что вполне вероятно, что большинство внедрений просто используют способ, которым они «знают», работает на большинстве / на всех архитектурах.
Вот как / sbin / ping «каким-то образом управляет» (в большинстве систем Unix-y):
$ ls -l /sbin/ping
-r-sr-xr-x 1 root wheel 68448 Jan 26 10:00 /sbin/ping
Видите? Он принадлежит root
и имеет решающий бит s
в разрешении - setuserid. Итак, независимо от того, какой пользователь его запускает, ping запускается от имени пользователя root .
Если вы используете ядро BSD с новыми «непривилегированными сокетами ICMP», было бы интересно узнать, что нужно чтобы использовать эту функцию для проверки связи с Python (но это, конечно, не поможет любому пользователю с менее продвинутым ядром).
Я не уверен, можно ли публиковать что-то в вопросе, который, кажется, уже получил ответ некоторое время назад.
Я искал ту же реализацию и нашел способ сделать ICMP через Python с привилегиями без полномочий root.
python-ping
использует тот же способ 'need-root' для проверки связи, но обнаружил отчет об ошибке, в котором пользователь предложил изменить SOCK_RAW
на SOCK_DGRAM
, когда вызов sock
:
http://hg.io/delroth/python-ping/issue/1/icmp-without-root-privilege
Разработчик объясняет, что это будет "WONT- FIX », потому что это скорее UDP ping.
Так как меня действительно не волнует, идет ли ICMP через UDP, я пошел дальше, получил код и внес предложенные изменения.
Теперь я могу выполнить эхо-запрос, не вызывая подпроцесс и не нуждаясь в корне!
Опять же, не уверен, можно ли размещать здесь сообщения по прошествии такого долгого времени, но подумал, что это лучше!