Помещение "$@" в локальную переменную в тире

Su confusión proviene del hecho de que no comprende lo que está haciendo en Windows. En Windows, los servicios reales se ejecutan desde el Administrador de control de servicios, y siempre han tenido la capacidad de ejecutarse bajo los auspicios de cuentas de usuario dedicadas. Un servicio sin privilegios adecuado en Windows emplea el nombre de usuario de una cuenta de usuario sin privilegios dedicada, en la que SCM inicia sesión para crear el proceso de servicio.

Lo que usted está haciendo, por el contrario, no ejecuta un servicio en absoluto.Está ejecutando un programa en su sesión de inicio de sesión interactiva, en segundo plano. Y no es una terminal lo que estás usando, es una consola .

Las razones para emplear cuentas dedicadas para servicios son, de hecho, comunes a los sistemas operativos Windows y Linux. Ejecutar servicios como procesos separados bajo la protección de cuentas dedicadas significa que los mecanismos del sistema operativo que protegen a los usuarios entre sí (Windows NT y Linux son ambos multiusuario -desde cero, recuerde)también proteger los procesos de servicio de usted , un usuario interactivo, y de otros servicios . Asimismo, lo protegen a usted ya esos otros servicios del servicio .

Los mecanismos multiusuario -permiten encontrar un control de acceso detallado en los archivos y directorios que utiliza el programa de servicio, evitar que los servicios reciban señales arbitrarias de procesos maliciosos, evitar que los procesos de servicio sean rastreados usando las API de depuración, evitar inyección de subprocesos y evita que procesos arbitrarios puedan pausar y reanudar subprocesos. Y todas estas prevenciones también funcionan a la inversa, lo que significa que el servicio, si se ve comprometido, no puede hacer estas cosas a los demás.

Está ejecutando un servicio que responde a solicitudes a través de la red. Está diseñado para ejecutarse bajo la égida de una cuenta de usuario dedicada por estas mismas razones. Habla un protocolo complejo -legible por humanos que no es -trivial para que los programas se analicen correctamente, y podría verse comprometido si hubiera un error en algún lugar de ese analizador. Pero cualquier atacante que logre comprometerlo solo obtiene acceso a su sistema como ese usuario de servicio dedicado, que usted debería asegurarse de que no tiene acceso innecesario ni propiedad de archivos y directorios que no son parte de su función prevista.

Yo mismo extiendo esto también a la tala.Los servicios de registro individuales se ejecutan solo con los privilegios necesarios para acceder y escribir en sus directorios de registro específicos, y están aislados entre sí, de los usuarios interactivos e incluso de los servicios "principales" (sin privilegios )cuyos registros están escribiendo.

En un sistema bien -diseñado, debe haber unos pocos procesos de servicio que se ejecuten con acceso privilegiado. En general, serán cosas que proporcionen algún tipo de inicio de sesión de varios -usuarios, como servicios SSH o FTP, donde la mayor parte del servicio aún se ejecuta bajo la égida de una cuenta sin privilegios; pero es simplemente el caso que negociar qué cuenta es una parte inherente de la función de servicio.

Como tal, deberías pensar ahora si las instrucciones de gitea son ​​suficientes . La cuenta de servicio que está creando tiene permitido el inicio de sesión interactivo a través de SSH, tiene un programa de shell interactivo como su programa de inicio de sesión y posee un directorio de inicio, lo que le da a un servicio comprometido la capacidad de poner cosas allí y otorgar acceso a las cosas allí.

Lecturas adicionales

2
25.07.2019, 23:17
1 ответ

Расширение $@вlocal args="$@"является неуказанным стандартом POSIX . Оболочка bashсоздаст одну строку с разделителями -, содержащую все позиционные параметры, в качестве значения переменной args, а dashпопытается выполнитьlocal args="$1" "$2" "$3"(и т. д.)

Оболочки zshи kshведут себя так же, как bash(, создавая одну строку из позиционных параметров, хотя zshбудет использовать первый символ $IFSв качестве разделителя ), а yashоболочка ведет себя как dash, по крайней мере, в своих конфигурациях по умолчанию.

В вашем случае следует использовать

my_func () {
    local args
    args="$*"

    printf 'args: <%s>\n' "$args"
}

или

my_func () {
    local args="$*"

    printf 'args: <%s>\n' "$args"
}

Здесь я использую $*, чтобы было очевидно, что я создаю одну строку из списка значений. Строка будет содержать значения позиционных параметров, разделенных первым символом$IFS(пробелом по умолчанию ).

Я также использую printf, чтобы быть уверенным в правильности вывода значений, предоставленных пользователем -(см. Почему printf лучше, чем echo?).

Кроме того, ваш сценарий должен использовать #!/bin/dashв качестве первой строки, а не #!/bin/sh, поскольку localявляется расширением стандартного синтаксиса sh.

3
27.01.2020, 22:02

Теги

Похожие вопросы