DebianOther

VLC не может открыть MRL

При просмотре IPTV пользователи систем unix, могут столкнуться с ошибкой - VLC не может открыть MRL. При запуске из консоли пользователь увидит следующий вывод ошибок:
  1. socket bind error: Permission denied
  2. cannot open socket
  3. open of `udp://@xxx.xxx.x.x:xxx' failed

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

Лечится все довольно просто. Все действия под root, либо sudo.

Устанавливаем пакет libcap2-bin
  1. # apt-get install libcap2-bin

Затем выставляем атрибуты у VLC:
  1. # setcap 'cap_net_bind_service=+ep' `which vlc`

Перезапускаем VLC плеер и все работает.

Для отмены этих настроек необходимо выполнить команду:
  1. # setcap -r /usr/bin/vlc


Собственно стоит упомянуть, что в стандарте POSIX был принят механизм "возможностей" - capabilities, который позволял приложения, запущенные от обычных пользователей, наделять некоторыми привилегиями доступными только root, при этом не давая им полных прав суперпользователя, что мы и делаем при помощи утилиы setcap, а параметр cap_net_bind_service - позволяет дать возможность слушать порты привилегированных пользователей.

Более подробную информацию о capabilities читайте здесь.

У setcap, есть ряд ограничений (отсюда):
  • ядро должно быть не ниже 2.6.24
  • не будет работать если файл является скриптом (bash, perl, php и т.д.) или ссылкой (ln -s)
  • так же setcap отключает LD_LIBRARY_PATH. Если программа использует библиотеки ( .../lib ) то они не подключатся