Рекурсия вверх до достижения /
и вызов функции для каждого каталога.
#!/bin/sh
function mangleperms {
echo DEBUG would chmod 755 "$1"
}
function walktoroot {
DIR="$1"
HANDLE="$2"
if [ "$DIR" = "/" ]; then
return
fi
"$HANDLE" "$DIR"
# recursion (noun): see recursion
PARENTDIR=`dirname "$DIR"`
walktoroot "$PARENTDIR" "$HANDLE"
}
if [ -z "$1" ]; then
echo >&2 "Usage: walktoroot dir"
exit 1
fi
# TODO probably more edge cases on relative dirs, though there are means
# to fully qualify those
if [ "$1" = "." ]; then
DIR=`pwd`
else
DIR=$1
fi
walktoroot "$DIR" mangleperms
Например.
$ pwd
/var/tmp/a/b/c
$ /home/jdoe/walktoroot .
DEBUG would chmod 755 /var/tmp/a/b/c
DEBUG would chmod 755 /var/tmp/a/b
DEBUG would chmod 755 /var/tmp/a
DEBUG would chmod 755 /var/tmp
DEBUG would chmod 755 /var
$
Я бы порекомендовал для этого отдельную таблицу маршрутизации, поскольку я предполагаю, что трафик, поступающий на 192.168.0.2
, имеет адрес источника 35.100.100.35
. Проблема в том, что 35.100.100.35
не указан в вашей таблице маршрутизации, поэтому используется значение по умолчанию.
Вам может сойти с рук такая простая вещь, как:
ip route add 35.0.0.0/8 via 192.168.0.1 dev ppp0
Таким образом, когда ваша машина пытается ответить на адрес 35
, она делает это на ppp0
интерфейс.
Далее следует более надежная / проработанная версия.
ПРИМЕЧАНИЕ. Вам следует перезагрузить компьютер, чтобы очистить все временные изменения, внесенные вами в таблицу маршрутизации.
Достаточно простое правило маршрутизации состоит в том, чтобы любой трафик, предназначенный для определенного IP или подсети или исходящий от него, использовал другую таблицу маршрутизации:
ip rule add from [interface ip]/[netmask] tab [table number] priority [priority]
ip rule add to [interface ip]/[netmask] tab [table number] priority [priority]
В этом случае вас беспокоит трафик, поступающий на 192.168.0.2
(IP-адрес вашего устройства ppp0
). Вам нужно будет создать новую таблицу маршрутизации, добавив в файл: / etc / iproute2 / rt_tables
. Синтаксис: [номер таблицы] [имя таблицы]
. Обычно я использую имя интерфейса в качестве имени таблицы, чтобы все было проще.
echo "168 ppp0" >> /etc/iproute2/rt_tables
ip rule add from 192.168.0.2/32 tab 168 priority 101
ip rule add to 192.168.0.2/32 tab 168 priority 101
Это должно привести к тому, что весь трафик, адресованный к 192.168.0.2
, будет соответствовать таблице маршрутизации 168
, а также любому трафику, который является ответом на трафик в этой таблице.
Теперь мы направили трафик в эту таблицу маршрутизации 168
, но она будет пустой, нужно только добавить к ней маршрут по умолчанию сейчас.
ip route add default via 192.168.0.1 dev ppp0 table 168
Это добавляет маршрут по умолчанию в таблицу 168
, что означает просто использовать интерфейс ppp0
.
В конечном итоге ваши таблицы маршрутизации, вероятно, должны выглядеть следующим образом:
# ip route show
default dev eth0 proto static metric 1024
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.20
192.168.0.0/24 dev ppp0 proto kernel scope link src 192.168.0.2
Это ваша стандартная таблица маршрутизации, таблица, обычно используемая для трафика. Что касается маршрутов здесь: по умолчанию, как вы, вероятно, изначально определили, а вторые два предполагаются на основе IP-адресов ваших интерфейсов.
# ip rule show
0: from all lookup local
101: from 192.168.0.2 lookup ppp0
101: from all to 192.168.0.2 lookup ppp0
Здесь перечислены ваши правила маршрутизации в формате «[приоритет]: [правило] поиск [таблица]». В этом примере указано, что обычно используется локальная таблица маршрутизации. Если трафик идет к или от 192.168.0.2, используйте таблицу маршрутизации с именем ppp0
.
# ip route show table ppp0
default via 192.168.0.1 dev ppp0
Здесь показана таблица маршрутизации с именем ppp0
, которая должна просто отправлять весь трафик на ppp0
.
Конечным результатом этого является то, что когда трафик направляется на IP-адрес вашего интерфейса ppp0
или с него, он будет использовать таблицу маршрутизации с именем ppp0
. Таблица маршрутизации ppp0
просто отправляет весь трафик на устройство ppp0
.