Как делают меня явно и безопасно вызывают использование встроенной команды в ударе

Обычно, я ожидал бы, что у Вас будут VLAN. Они обычно все выделяются eth0 с именами как eth0.0 и eth0.1. Запуск там был бы хорошим началом.

Весь Ваш доступ LAN вероятен на br_lan (который может быть eth0.0). Если не использовали pppoe, к WAN получили бы доступ по другому VLAN (вероятный eth0.1). Назначения VLAN могут отличаться на других аппаратных средствах.

В системах, где я использовал pppoe, маршрутизатор не был достижим непосредственно. Я не полагаю, что это имело IP-адрес, который я мог использовать. Можете Вы telnet к модему при подключении ПК с ним непосредственно?

19
13.04.2017, 15:36
3 ответа

Я думаю, что особенность, о которой вы думаете, это дисциплины. Это ksh93 - только функция:

function count.get {
  .sh.value=$(set -- ~(N)*.txt; echo "$#")
}

Тогда, когда $ count расширяется, вызывается функция дисциплина , которая присваивает ей значение.

В zsh можно также определить содержимое переменной как код:

count='$(set -- *.txt(N); echo "$#")'

и использовать его как $ {(e) count} , чтобы этот код был оценен e при расширении.

Однако они дают мало пользы по сравнению со стандартным способом использования функции:

count() (
  set -- [*].txt *.txt
  case $1$2 in
    '[*].txt*.txt') echo 0;;
    *) echo "$#"
  esac
)

(трюк [*] можно избежать с оболочками, поддерживающими варианты nullglob (например, ksh93 «s ~ (N) или zsh » s (N) )).

И используйте его как $ (count) ( замена команды ).

(см. другие ответы для всех проблем с кодом).

-121--248736-

Оливье D почти правильно, но необходимо установить POSIXLY _ CORRECT = 1 перед запуском unset . POSIX имеет понятие Специальные встроенные , и bash поддерживает это . unset является одним из таких строений. Поиск SPECIAL _ BUILTIN в builtins/* .c в источнике bash для списка включает set , unset , export , eval и source .

$ unset() { echo muahaha-unset; }
$ unset unset
muahaha-unset
$ POSIXLY_CORRECT=1
$ unset unset

Незаконная unset теперь удалена из среды, если отменить команду , type , builtin , то можно продолжить, но unset POSIXLY_CORRECT, если вы полагаетесь на поведение, отличное от POSIX, или расширенные функции bash.

Этот не содержит псевдонимов адресов, поэтому необходимо использовать \unset , чтобы убедиться, что он работает в интерактивной оболочке (или всегда, если expand _ aliases действует).

Для параноика это должно все исправить, я думаю:

POSIXLY_CORRECT=1
\unset -f help read unset
\unset POSIXLY_CORRECT
re='^([a-z:.\[]+):' # =~ is troublesome to escape
while \read cmd; do 
    [[ "$cmd" =~ $re ]] && \unset -f ${BASH_REMATCH[1]}; 
done < <( \help -s "*" )

( пока , сделать , сделано и [[ являются зарезервированными словами и не нуждаются в мерах предосторожности.) Обратите внимание, что мы используем unset -f , чтобы быть уверенными в отмене установки функций, хотя переменные и функции имеют одно и то же пространство имен, они могут существовать одновременно (благодаря Этану Рейснеру), и в этом случае отмена установки дважды также сделает трюк. Вы можете пометить функцию только для чтения, bash не мешает отменить функцию только для чтения до и включая bash-4.2, bash-4.3 предотвращает вас, но он по-прежнему чтит специальные сборки, когда POSIXLY _ CORRECT установлен.

Только для чтения POSIXLY _ CORRECT не является реальной проблемой, это не логическое значение или флаг присутствия активирует режим POSIX, поэтому, если он существует только для чтения, можно полагаться на функции POSIX, даже если значение пустое или 0.Вам просто нужно будет отменить проблемные функции другим способом, чем выше, возможно, с помощью некоторых вырезов:

\help -s "*" | while IFS=": " read cmd junk; do echo \\unset -f $cmd; done

(и игнорировать любые ошибки) или заниматься какими-либо другими скриптобатиками .


Другие примечания:

  • функция является зарезервированным словом, оно может быть совмещено, но не переопределено функцией. (Сглаживание функции является несколько трудным, поскольку \функция не является приемлемым способом ее обхода)
  • [[, ]] зарезервированные слова, они могут быть aliased (который будет проигнорирован), но не отвергнутый с функцией (хотя функции можно так назвать)
  • ((, не действительное название функции, ни псевдоним
16
27.01.2020, 19:45

Я понимаю, что если кто-то контролирует ваше окружение, то вы все равно, вероятно, облажались

Да, это. Если вы запускаете скрипт в неизвестном окружении, все может пойти не так, начиная с LD_PRELOAD, в результате чего процесс оболочки выполнит произвольный код еще до того, как он прочитает ваш скрипт. Попытка защитить от враждебного окружения изнутри скрипта бесполезна.

Sudo уже более десяти лет дезинфицирует окружение, удаляя все, что выглядит как определение бэш-функции. Начиная с Shellshock, другие среды, которые запускают сценарии оболочки в не полностью доверенной среде, следовали этому примеру.

Невозможно безопасно запустить скрипт в окружении, установленном недоверенным объектом. Поэтому беспокойство об определениях функций непродуктивно. Обезопасьте ваше окружение, и при этом переменные, которые bash будет интерпретировать как определения функций.

6
27.01.2020, 19:45

Вы можете использовать unset -f , чтобы удалить функции, встроенные, команду и тип.

1
27.01.2020, 19:45

Теги

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