Как я могу протестировать на соответствие POSIX сценариев оболочки?

"Исходный порт" означает порт, от которого удаленная машина отправила пакет на Ваш сервер. Редко, если когда-нибудь, пакеты клиента к серверу, отправленные от того же удаленного порта, в который они прибывают. Это происходит из-за ограничения в большинстве Ose, которые диктуют, что обычные пользователи не могут открытые порты ниже определенного предела (в Linux, это - любой порт ниже 1024).

Следовательно, исходный порт пакетов, направляемых к Вашей машине, скорее всего, прибывает из случайного, порта с высоким номером на удаленном хосте. В сущности номер порта действительно не имеет значения и не может также быть указан.

Правило выше ожидаемых пакетов для прибытия из удаленного порта 137-139 и не ловит их, если они не делают. Удалите --sport 137:139 и это должно принять трафик к Вашему порту 137-139 от случайного высокого порта удаленной машины.

76
08.06.2018, 21:43
3 ответа

К сожалению, 'портативный' обычно более сильное требование, чем 'совместимый POSIX' для сценариев оболочки. Таким образом, запись чего-то, что работает на любой оболочке POSIX, не слишком трудна, но то, чтобы заставлять ее работать на любой реальной оболочке более трудно.

Можно запустить путем установки каждой оболочки в диспетчере пакетов, в особенности debian's posh походит на то, что Вы хотите (совместимая политикой Обычная Оболочка). Политикой Debian является POSIX за немногим исключением (echo -n указанный, local...).

Кроме того, хотя, тестирование должно покрыть несколько оболочек (/bin/sh особенно) на диапазоне платформ. Я тестирую на Солярисе (/bin/sh и xpg4/sh), и BSD. AIX и HP-UX очень совместимы и не вызывают проблемы. удар является небольшим собственным миром.

Я рекомендовал бы руководству Autoconf по портативной оболочке, которая является абсолютно блестящей и экономит много времени. Большие блоки его являются устаревшими, но это в порядке; просто пропустите TruUnix и Ultrix и так далее, если Вы не заботитесь!

38
27.01.2020, 19:31
  • 1
    posh действительно походит на то, что я прошу. Я сделаю некоторые тесты, как только я могу. –  rahmu 21.09.2012, 16:29
  • 2
    я ответил прежде, чем определить связанный вопрос! шикарный debian вещь, так не будет упакован в каждой системе. Кроме того, оболочка является не обязательно вещью, которая будет больше всего волноваться по поводу; несовместимости sed являются большой проблемой, например. –  Nicholas Wilson 21.09.2012, 16:47
  • 3
    , который я не потрудился бы портировать на Солярис/bin/sh иначе Оболочка Bourne (который не является POSIX). Солярис как все современные нельды имеет оболочку POSIX, это просто, оказывается, не находится в обычном месте (/usr/xpg4/bin/sh) –  Stéphane Chazelas 21.09.2012, 17:31
  • 4
    К сожалению, мы поставляем сценарии, которые должны работать по крайней мере на каждом/bin/sh. Это не настолько плохо как все это... Я не должен делать этого все же. –  Nicholas Wilson 21.09.2012, 17:52
  • 5
    Причина я рассматриваю/bin/sh как важный, состоит в том, потому что это вызывается от хижины в таком количестве сценариев. "/usr/bin/env sh" является едва улучшением. Если Вы собираетесь приложить какие-либо усилия к тому, чтобы заставлять что-то работать над оболочками неPOSIX, я чувствую, что могу также расположить по приоритетам/bin/sh каждой системы. Это не будет задолго до того, как некоторый клиент запускает Ваш скрипт с оболочкой по умолчанию, которая не является всем этим неблагоразумным. –  Nicholas Wilson 21.09.2012, 20:07

Bash будет работать в совместимом POSIX режиме если POSIXLY_CORRECT переменная среды установлена. Из страницы справочника:

   POSIXLY_CORRECT
          If  this  variable  is  in the environment when bash starts, the
          shell enters posix mode before reading the startup files, as  if
          the  --posix  invocation option had been supplied.  If it is set
          while the shell is running, bash enables posix mode, as  if  the
          command set -o posix had been executed.

Много других утилит GNU будут также соблюдать POSIXLY_CORRECT, таким образом, если Вы находитесь в системе с преимущественно инструментами GNU (например, большинство систем Linux), это - хорошее начало, если Вашей целью является соответствие POSIX.

12
27.01.2020, 19:31
  • 1
    Даже в режиме POSIX, удар все еще позволит некоторые функции неPOSIX такой как [[. –  jordanm 22.09.2012, 02:59

Вы можете использовать ShellCheck (GitHub) в качестве линтера для ваших сценариев оболочки. Также существует онлайн-версия .

Чтобы обнаружить проблемы совместимости с POSIX (например, SC2039 ), строка shebang вашего сценария оболочки должна иметь вид #! / Bin / sh . Вы также можете передать - shell = sh в shellcheck .

Пример ( test.sh ):

#!/bin/sh
if [[ $HOSTNAME == test ]]; then
    echo fail &> foo
fi

Результат ( shellcheck test.sh ):

In test.sh line 2:
if [[ $HOSTNAME == test ]]; then
   ^-- SC2039: In POSIX sh, [[ ]] is undefined.
      ^-- SC2039: In POSIX sh, HOSTNAME is undefined.    

In test.sh line 3:
    echo fail &> foo
              ^-- SC2039: In POSIX sh, &> is undefined.
31
27.01.2020, 19:31

Теги

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