Поскольку документация POSIX допускает его как расширение, ничто не препятствует реализации такого поведения.
Простая проверка (выполняется в zsh
):
$ for shell in /bin/*sh 'busybox sh'; do
printf '[%s]\n' $shell
$=shell -c 'á() { :; }'
done
[/bin/ash]
/bin/ash: 1: Syntax error: Bad function name
[/bin/bash]
[/bin/dash]
/bin/dash: 1: Syntax error: Bad function name
[/bin/ksh]
[/bin/lksh]
[/bin/mksh]
[/bin/pdksh]
[/bin/posh]
/bin/posh: á: invalid function name
[/bin/yash]
[/bin/zsh]
[busybox sh]
sh: syntax error: bad function name
показывают, что bash
, zsh
, yash
, ksh93
(который ksh
связан в моей системе), pdksh
и его производные допускают использование многобайтовых символов в качестве имени функции.
yash
спроектирован для поддержки многобайтовых символов с самого начала, поэтому неудивительно, что он сработал.
Другая документация, на которую вы можете ссылаться: ksh93
:
Пробел - это табуляция или пробел. Идентификатор - это последовательность букв, цифр или знаков подчеркивания, начинающаяся с буквы или символа подчеркивания . Идентификаторы используются как компоненты имен переменных. Имя vname - это последовательность из одного или нескольких идентификаторов, разделенных знаком. и необязательно предваряется символом ... Vname используются как имена функций и переменных. Слово - это последовательность символов из набора символов, определенного текущей локалью , за исключением метасимволов, не заключенных в кавычки.
Таким образом, установка на C
locale:
$ export LC_ALL=C
$ á() { echo 1; }
ksh: á: invalid function name
приводит к сбою.
Если бы вы могли дать java (или чему-то, что использует динамические библиотеки ), повышенные возможности, то злоумышленник мог бы переключить библиотеки, чтобы получить возможности.
Напишите минимальную программу на C (со статической компоновкой ), откройте порт и прикрепите ее к файловому дескриптору 3. Затем выполните программу Java. Программа Java должна будет выполнить fdopen, чтобы он выглядел как файл с точки зрения Java (open "/dev/fd/3"
). Этой оболочке потребуются возможности.
Существует множество решений, которые вы можете перечислить здесь, так как вы используете systemd, кажется, это правильный путь, используяListenStream
:
$ cat /etc/systemd/system/gitea.socket
[Unit]
Description=Gitea socket
[Socket]
ListenStream=80
NoDelay=true
И затем, как только вы определили свой .socket
файл, определите свой юнит-файл таким образом, используя его:
[Unit]
Description=Gitea (Git with a cup of tea)
Requires=gitea.socket
After=syslog.target
After=network.target
After=postgresql.service
[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/go/src/code.gitea.io/gitea
ExecStart=/home/git/go/src/code.gitea.io/gitea/gitea web
Restart=always
Environment=USER=git HOME=/home/git
NonBlocking=true
[Install]
WantedBy=multi-user.target