сценарий удара, называя себя с различными аргументами

Ставя доменное имя в /etc/hosts является дополнительным, и можно выполнить систему без любого вредного воздействия вообще.

Единственный недостаток пропуска его - то, что полностью определенное имя хоста системы не обнаружится правильно. Например, hostname -f.

Путем обнаружение полностью определенных работ имени хоста:

  1. Это сначала получает имя хоста или 'shortname'. Это - вывод uname -n или hostname.
  2. Это затем получает IP-адрес для того имени хоста путем консалтинга /etc/hosts (или независимо от того, что Вы имеете в /etc/resolv.conf, и отступание к последним источникам, если не найденный в /etc/hosts).
  3. После того как это имеет IP, это затем делает обратный поиск путем нового консалтинга /etc/hosts.
  4. После того как это имеет запись в /etc/hosts, первая запись используется в качестве полностью определенного имени хоста.

Короче говоря если Вы хотите, чтобы полностью определенное имя хоста работало, необходимо сделать также:

127.0.0.1 fully.qualified.hostname hostname localhost.localdomain localhost

или

127.0.0.1 localhost.localdomain localhost
1.2.3.4 fully.qualified.hostname hostname
5
03.07.2014, 17:56
3 ответа

Проблема не в рекурсии, а в перекручивании пунктов. Если попробовать так, как описано выше, то не получится:

$ targets=(aaa bbb ccc ddd)
$ for i in $targets; do echo $i; done
aaa

Чтобы зациклиться на массиве, нужно сгенерировать список элементов в массиве, например, по этой ссылке:

Так что

#!/bin/bash
# recur.sh

targets=('aaa' 'bbb' 'ccc' 'ddd')

if [ "$1" == "all" ] ; then
    for i in ${targets[@]}; do
        echo $2" --> "$i
        ./$0 $i $2
    done
    exit 0
fi

echo "Target "$1" just received command '"$2"'"

exit 0
6
27.01.2020, 20:35

Другие уже указывали на проблему с синтаксисом, используемым при доступе к списку. Но это не единственная проблема с вашим скриптом. Вы также используете переменные без кавычек. При использовании $variablename без кавычек, вы получите неожиданные результаты, если эта переменная содержит какие-либо символы, которые могут быть интерпретированы оболочкой.

Вот как я изменю ваш скрипт, чтобы избежать таких проблем:

#!/bin/bash
# recur.sh

targets=('aaa' 'bbb' 'ccc' 'ddd')

if [ "$1" == "all" ] ; then
    for i in "${targets[@]}"; do
        echo "$2 --> $i"
        "$0" "$i" "$2"
    done
    exit 0
fi

echo "Target $1 just received command '$2'"

exit 0

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

2
27.01.2020, 20:35

Проблема в том, что Вы не зациклилили все элементы в массиве, а только один элемент, потому что вместо ${targets[@]} Вы использовали $targets.

Попробуйте это исправление:

targets=('aaa' 'bbb' 'ccc' 'ddd')

if [ "$1" == "all" ] ; then
    for i in ${targets[@]} ; do
        echo $2" --> "$i
        echo "Target "$i" just received command '"$2"'"
    done
fi

exit 0

Здесь не нужна рекурсия.

1
27.01.2020, 20:35

Теги

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