Когда Вы попросили делать это в ударе, вот решение, которое не использует awk, sed или жемчуг, просто функция удара:
reverse ()
{
local line
if IFS= read -r line
then
reverse
printf '%s\n' "$line"
fi
}
Вывод
echo 'a
b
c
d
' | reverse
d
c
b
a
Как ожидалось.
Но остерегайтесь этого, строки хранятся в памяти, одной строке в каждом рекурсивно названном экземпляре функции. Настолько осторожный с большими файлами.
Я вижу два метода:
Позвольте пользователю использовать /sbin/iptables
через sudo
без ограничения (который является чем-то опасным, это означает, Вы доверяете пользователю так или иначе), и запустите скрипт с полномочиями пользователя. Сценарий вызовет sudo
каждый раз /sbin/iptables
необходим. Это предполагает, что выполнение сценария будет быстро, так как некоторый ввод пароля будет в конечном счете требоваться равномерно ¹.
/sbin/iptables
без ограничения что-то опасное.Позвольте пользователю называть только сценарий через sudo
.
/sbin/iptables
ограничивается сценарием.О проблеме Вы упомянули: если сценарий принадлежит скажем, root
и имеет обычные полномочия: rwxr-xr-x
, пользователи других не могут изменить его, они могут только выполнить его (в конечном счете через sudo
получить больше полномочий).
С решением 2, и в случае сценариев оболочки (по сравнению с большим количеством устойчивых двоичных файлов/программ), остерегаются переменных среды и нескольких внешних факторов, которые могут изменить выполнение Вашего сценария. Проверьте, что Ваша sudo конфигурация сбрасывает правильно определение каждой потенциально вредной переменной.
—
1.Действительно, sudo
может быть настроен с NOPASSWD
в случае необходимости.
Вы могли попытаться изменить владельца группы файла и добавить Вашего пользователя к той группе. Затем Вы могли chmod
файл для присвоения полномочий группы, которые позволили бы Вам делать то, в чем Вы нуждаетесь.
Это - изменчивое решение, но это работало бы.
/sbin/iptables
. добавьте своего пользователя к той группе. chmod
/sbin/iptables
позволить группе выполнять файл. Это работало бы, не будет он?
– n0pe
13.08.2011, 06:35
Из Википедии:
setuid и setgid (короткий для "идентификатора пользователя аппарата после выполнения" и "идентификатора группы набора после выполнения", соответственно) [1] являются флагами прав доступа Unix, которые позволяют пользователям выполнять исполняемый файл с полномочиями владельца или группы исполняемого файла. Они часто используются, чтобы позволить пользователям на компьютерной системе запускать программы со временно поднятыми полномочиями для выполнения определенной задачи. В то время как принятый идентификатор пользователя или идентификационные обеспеченные полномочия группы не всегда поднимаются, как минимум они конкретны.
Попробуйте что-то вроде этого
stefan@linux-ulsk:/usr/bin> zypper up
Root privileges are required for updating packages.
linux-ulsk:~ # whereis zypper
zypper: /usr/bin/zypper /usr/bin/X11/zypper /usr/include/zypper /usr/share/zypper /usr/share/man/man8/zypper.8.gz
linux-ulsk:~ # chmod u+s /usr/bin/zypper
linux-ulsk:~ # exit
stefan@linux-ulsk:/usr/bin> zypper up
Retrieving repository ...
Я мог запустить застежку-молнию, не будучи корнем, что я не мог прежде.
Будьте осторожны с setuid и setgid! Некоторая книжная кавычка:
Никогда не давайте сценарии оболочки setuid разрешение. Несколько методов для того, чтобы ниспровергать их известны.
Удостоверьтесь, что Вы (или соответствующая учетная запись) являетесь владельцем файла и делаете файл только перезаписываемым Вами, не группой. Таким образом, Ваши полномочия были бы чем-то как 750, предположив, что Ваш пользователь находится в корректной группе.
Если они могут выполнить, но не записать файл, то Вас в безопасности добавить, что команда к их sudo перечисляет.