Где найти ifconfig простому пользователю


ramok аватар

ramok - Posted on 23 Июль 2008

Начинающие часто сталкиваются с проблемой того что ifconfig не запускается при работе под обычным пользователем:

$ ifconfig
zsh: command not found: ifconfig
$

И сразу возникает вопрос: "где дать прав/прописать/внести в группу что бы ifconfig запускался".

Ответ:

ifconfig и подобные утилиты находятся обычно в директориях для системных утилит /sbin и /usr/sbin и /usr/local/sbin.
И обычно, у обыкновенного пользователя (не root-а) эти директории не прописаны в переменной окружения PATH, в которой находятся список директорий в которых нужно искать запускаемые файлы. В этом легко убедиться посмотрев что находится в PATH:

$ echo $PATH
/bin:/usr/bin:/usr/local/bin:$(HOME)/bin:/usr/X11R6/bin:/usr/games
$

Отсюда решение номер раз:
запускать приложение по абсолютному пути

$ /usr/sbin/ifconfig
...

Но это не удобно для повседневного использования.

Решение номер два:
внести в переменную окружение PATH нужные директории добавив в ~/.bashrc или ~/.zshrc

export PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin
5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)

А почему эти пути не прописываются для пользователей? Ведь наверное есть какой-то смысл поступать так?

Не прописываются, т.к. не следует обычному пользователю сеть конфигурять.
Единственное, чего не понимаю, почему пользователю traceroute не нужен.

А чтоб в случае появления новых sbin-ов (например, в /opt) не приходилось что-то переписывать, я делаю так

===> .bashrc <===

...
function addsbinpath {
	local ifs="$IFS"
	local newpath=""
	IFS=:
	for elem in $PATH; do
		local sbin="${elem/%\/bin//sbin}"
		if [ -d "$sbin" ]; then
			newpath="$newpath:$sbin"
		fi
		newpath="$newpath:$elem"
	done
	IFS="$ifs"
	newpath=$(echo ${newpath:1} | tr : '\n' | uniq | tr '\n' :)
	export PATH=${newpath:0:$(( ${#newpath} - 1 ))}
}
PATH="${HOME}/bin:${PATH}"
addsbinpath
unset addsbinpath
...

интересная идея. снкс.
вот упростил немного, делает тоже самое без башизмов

mksbinpath() {
   echo $PATH | sed -e 's,\([^:]*/\)\(bin\),\1\2\n\1s\2,g;s/:/\n/g' | sort | uniq | xargs ls -d 2> /dev/null | tr \\n :
}    
export PATH=`mksbinpath`

или просто одной строчкой

export PATH=`echo $PATH | sed -e 's,\([^:]*/\)\(bin\),\1\2\n\1s\2,g;s/:/\n/g' | sort | uniq | xargs ls -d 2> /dev/null | tr \\n :`

--
Signature invent in progress 24% ##........

export PATH=$(find / -maxdepth 4 -type d -name \*bin 2>/dev/null | xargs | sed s/\ /:/g)

ну как то рисковано. у меня вот выдало

$  find / -maxdepth 4 -type d -name \*bin 2>/dev/null
/home/komar/.zsh/bin
/home/komar/bin
/srv/nfs/openinkpot-root/sbin
/srv/nfs/openinkpot-root/bin
/sbin
/bin
/usr/lib/pm-utils/bin
/usr/lib/cups/cgi-bin
/usr/lib/ghc-6.8.2/bin
/usr/lib/glide2/bin
/usr/lib/klibc/bin
/usr/lib/avr/bin
/usr/lib/nmap/nselib-bin
/usr/bin
/usr/arm-linux-gnuuceabi/bin
/usr/share/openoffice/bin
/usr/share/texlive-bin
/usr/share/bug/texlive-base-bin
/usr/share/bug/wine-bin
/usr/share/doc/texlive-base-bin
/usr/share/doc/wine-bin
/usr/share/doc/libsmbios-bin
/usr/share/doc/glide2-bin
/usr/sbin
/usr/local/bin
/usr/local/arm-ssv1-linux/bin
/usr/local/scratchbox/sbin
/usr/local/arm-xscale-linux/bin
/usr/local/sbin

Если полагаете что это рискованно, можно уменьшить уровень поиска и дополнительно фильтровать по шаблону.

export PATH=$( find / -maxdepth 3 -type d -name \*bin 2>/dev/null | grep -E "\/s?bin" | xargs | tr " " :)

Если уж сокращать, отталкиваясь от предыдущего примера, покатит даже следующая строка:
<strong>export PATH=$(find / -maxdepth 3 -type d -name \*bin 2>/dev/null | grep -E "\/s?bin" | tr "\n" :)</strong>
Правда вот такое выражение - это уже действительно стрёмно, ибо ансекурно.

Кстати, если не в напряг, поясните, а почему Вам так не понравилось первое выражение?
То, куда у Вас действительно доступа нет - в <strong>/dev/null</strong>, а все остальное, так или иначе доступно и Вам, и программам, что Вы запускаете
<strong>-maxdepth 4</strong> выставлен исключительно ради вот такого: <strong>"/opt/java/jre/bin"</strong>, а отсутствие <strong>grep -E "\/s?bin"</strong> объясняется наличием: <strong>/usr/bin/perlbin</strong>

PS <strong>Для начинающих:</strong> ":)" в окончании строки кода - это не смайлик, а необходимая часть выражения.

PPS Я впервые на этом ресурсе, и мне дюже понравилось, пойду регистрится :) <strong>(<-Это смайлик)</strong>

> Кстати, если не в напряг, поясните, а почему Вам так не понравилось первое выражение?
исключительно с точки зрения того что в PATH могут попасть те пути, которые туда попасть не должны (что собственно я и демонстрировал)

с -maxdepth 3 результаты получше
PS
про сайлик я тоже заметил - прикольно Ж:-)
PPS
вместо -name и grep -E можно использовать флажок find -regex '.*/s?bin'

в большинстве своём на запуск программ из **sbin у пользователя тупо нет прав

Не для всех ведь. Для многих, например, ifconfig и ip, достаточно прав чтобы работать в режиме "только чтение"

sudo? Ж8-)

Ставьте Убунту. В нем таких ограничений нет.

а мужики-то не знают... (с)

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.