Подключение двух клиентов Windows в разных подсетях через маршрутизатор Debian

  1. Другие части кода должны иметь возможность вызывать функцию очистки независимо от того, находится она внутри или вне скобок {}, при условии, что она объявлена до ее фактического вызова (фактического, речь не идет о бывшей строке скрипта), и на том же или более низком уровне оболочки bash ($BASH_SUBSHELL).

  2. (EDITED) Ловушка может быть вызвана, если она уже была объявлена, и она должна быть объявлена на том же или более низком уровне подшивки. По-видимому, сигнал передается каскадом вниз, как показывает код ниже при его выполнении.

.

#!/usr/bin/env bash

trap "echo ok 0" 2

(
    echo subshell: $BASH_SUBSHELL   
    trap "echo ok 1" 2
    (
        echo subshell: $BASH_SUBSHELL   
        trap "echo ok 2" 2;
        sleep 100
        #now test the trap
    )
)

Результат:

subshell: 0
subshell: 1
subshell: 2
^Cok 2
ok 1
ok 0

Но не это трубы:

#!/bin/bash

trap "echo ok 0" 2

{
echo $BASH_SUBSHELL
trap "echo ok 1" 2
} | \
    {
        trap "echo ok 2" 2
        read line; echo $line;
        sleep 100
        #now Ctrl-c
    }

Результат:

1
^Cok 2
ok 0
  1. Скобки конструируют анонимную функцию. Функция сохраняет уровень оболочки bash, но не во всех контекстах.

Для иллюстрации проанализируйте приведенный ниже скрипт. Запустите его в терминале и посмотрите, что он выдает.

#!/bin/bash

k=k
msg='echo line: $LINENO, \$k: $k, BASH_SUBSHELL: $BASH_SUBSHELL'

eval $msg

{
    k=a
    eval $msg
} &

sleep 1
#job %1 should be done by now
jobs
eval $msg

{
    k=b
    eval $msg
} | {
    read line; echo $line;
    eval $msg
}

eval $msg

{
    k=c
    eval $msg
}

eval $msg

{ trap 'echo -e "\nterminating"; exit;' 2;}

sleep 100 #try out the trap by hitting Ctrl-c
  1. Решение для вашего скрипта следующее:

a. Переместите ловушку перед первым {.

b. Попробуйте переместить функцию очистки перед первым {, используя некоторые умные конструкции типа eval (см. в моем скрипте, как это работает). Если это невозможно, попробуйте построить прокси-функцию в скобках к более общей функции перед ними и исправить то, чего не хватает в ее вызове в ловушке.

3
26.02.2018, 03:36
2 ответа

Чтобы заставить машину Linux работать как маршрутизатор, вам нужно указать ей, как маршрутизировать трафик, идущий из обеих подсетей.

Вам нужно использовать команду route, чтобы добавить маршруты для каждой подсети, это должно работать следующим образом:

route add -net 192.168.1.80/30 gw 192.168.1.81 dev eth2
route add -net 172.16.21.0/25 gw 172.16.21.1 dev eth1

Если вы уже активировали net.ipv4.ip_forward = 1 , как вы сказали, он должен Работа. Если у вас включен брандмауэр на машине debian, вам необходимо произвести на нем соответствующую конфигурацию.

2
27.01.2020, 21:27

Согласно https://askubuntu.com/questions/95199/two-network-cards-and-ip-forwarding , пересылка с одного сетевого интерфейса на другой (скажем, с eth0 на eth1) требует следующих правил iptables

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

. Учитывая, что вы хотите, чтобы пересылка работала в обоих направлениях, вам также необходимо иметь противоположные правила:

sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
sudo iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
0
27.01.2020, 21:27

Теги

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