Usar un case
está muy bien si tienes un conjunto fijo de mascotas con las que quieres emparejar. Pero no funcionará si necesita construir el patrón en tiempo de ejecución, ya que case
no interpreta la alternancia desde los parámetros expandidos.
Esto coincidirá solo con la cadena literalcat|dog|mouse
:
patt='cat|dog|mouse'
case $1 in
$patt) echo "$1 matches the case" ;;
esac
Sin embargo, puede utilizar una variable con la coincidencia de expresión regular. Siempre que la variable no esté entre comillas, cualquier operador de expresiones regulares dentro de ella tiene sus significados especiales.
patt='cat|dog|mouse'
if [[ "$1" =~ ^($patt)$ ]]; then
echo "$1 matches the pattern"
fi
También puede utilizar matrices asociativas. Comprobar si existe una clave en uno es lo más parecido a un operador in
que ofrece Bash. Aunque la sintaxis es un poco fea:
declare -A arr
arr[cat]=1
arr[dog]=1
arr[mouse]=1
if [ "${arr[$1]+x}" ]; then
echo "$1 is in the array"
fi
(${arr[$1]+x}
se expande a x
si arr[$1]
está configurado, vacío de lo contrario.)
Одним из распространенных способов убедиться, что пользователи не могут читать исходный код того, что они запускают , заключается в том, чтобы написать службу, которая действует от имени пользователя с необходимые привилегии. Затем предоставьте пользователям способ связи с сервером, например, через сокет или TCP-порт. В этот момент код больше не работает в контексте, доступном пользователю. Написание этого не является тривиальным, поскольку вам может потребоваться рассмотреть, например, пользователей, пытающихся использовать вашу службу для повышения привилегий.
Мне помогло следующее решение:
Добавьте следующую строку в/etc/sudoers
:
user ALL = (root) NOPASSWD: /path/to/script
От имени пользователя запустите скрипт следующим образом:
sudo /path/to/script
Таким образом, сам скрипт (и все последующие скрипты Python )запускаются от имени root, но в то же время ни один из них не доступен ни для чтения, ни для записи