Как я могу «исходить» сценарий ожидания

Да, вы можете это сделать, и это даже не так сложно. У меня есть ноутбук с беспроводной картой и портом Ethernet. Я подключил к нему RapberryPi с Arch Linux через «перекрестный» кабель Ethernet. Это одна особенность, которая может вам понадобиться - не все карты Ethernet могут выполнять прямое межмашинное соединение.

Другая сложная часть - это IP-адресация. Лучше всего это проиллюстрировать. Вот мой небольшой сценарий настройки. Опять же, enp9s0 - это порт Ethernet ноутбука, а wlp12s0 - это беспроводное устройство ноутбука.

#!/bin/bash
/usr/bin/ip link set dev enp9s0 up
/usr/bin/ip addr add 172.16.1.1/24 dev enp9s0
sleep 10

modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
iptables -A FORWARD -o enp9s0 -i wlp12s0 -s 172.16.1.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

dhcpd -cf /etc/dhcpd.enp9s0.conf enp9s0

Сценарий устанавливает статический IP-адрес для сетевой карты, 172.16.1.1, затем устанавливает NAT, загружая модуль ядра. Он включает IP-маршрутизацию (на портативном компьютере), а затем выполняет несколько iptables полу-магии, чтобы перенаправить пакеты с беспроводной карты в сеть Ethernet и наоборот.

У меня есть dhcpd , работающий на порту Ethernet, чтобы выдавать IP-адреса, потому что это то, что нужно Raspberry Pi, но вы можете сделать статический адрес на своей рабочей станции вместе со статической маршрутизацией, DNS-сервером и NTP-сервер.

Файл / etc / dhcpd.enp9s0.conf выглядит так, на случай, если вы пойдете по этому маршруту:

option domain-name "subnet";
option domain-name-servers 10.0.0.3;
option routers 172.16.1.1;
option ntp-servers 10.0.0.3;
default-lease-time 14440;
ddns-update-style none;
deny bootp;
shared-network intranet {
        subnet 172.16.1.0 netmask 255.255.255.0 {
                option subnet-mask 255.255.255.0;
                pool { range 172.16.1.50 172.16.1.200; }
        }
}

Выбор IP-адреса очень важен. Я использовал 172.16.1.0/24 для Ethernet-кабеля, выходящего из ноутбука. Беспроводная карта на ноутбуке заканчивается 192.161.1.0/24. Вам нужно посмотреть, какой IP-адрес имеет беспроводная сеть ноутбука, и выбрать другую подсеть для сетевой карты. Далее нужно выбрать одну из «богонных» или «немаршрутизируемых» сетей. В моем примере 172.16.1.0/24 относится к официальным немаршрутизируемым диапазонам IP-адресов, как и 192.168.1.0/24, а также адрес 10.0.0.3 dhcpd.enp9s0.conf выдает для DNS-сервера и NTP-сервера. Вам нужно будет использовать свою голову, чтобы понять, что подходит для вашей установки.

1
25.01.2019, 13:24
3 ответа

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

Expect предназначен для spawnдочерних процессов. На вашу текущую оболочку не может повлиять результат expect test.exp.

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

#!/usr/bin/expect -f
set timeout -1
spawn $env(SHELL)
set myprompt "some pattern that matches your prompt"
expect -re $myprompt
send "source test.sh\r"
expect {
    "Give value for " {
        # provide the same answer for every question:
        send "some value\r"
        exp_continue
    }
    -re $myprompt
}
interact

Теперь вы взаимодействуете с созданной вами оболочкой. Когда вы exitзапускаете эту оболочку, порожденная оболочка умирает, затем ожидайте, что сценарий завершится, и вы вернетесь в свою текущую оболочку (без переменных, которые вы инициализировали ).

6
27.01.2020, 23:18

Вы можете создать сценарий оболочки, который различает среды до и после запуска этой функции:

#!/bin/bash
# run.sh
source./test.sh
ENV_BEFORE=$(set | grep -v "^_")
my_fun
ENV_AFTER=$(set | grep -v "^ENV_BEFORE" | grep -v "^_")
# echo the new environment variables
echo "$ENV_AFTER" | grep -v -F -x -f <(echo "$ENV_BEFORE")

Затем запустите этот скрипт, используя команду expect:

# test.exp
log_user 0
spawn./run.sh
expect "Give value for "
expect -re  "(.*)\r\n"
send -- "stackexchange\r\n"
expect -re  "(.*)\r\n"
expect -re  "(.*)\r\n"
puts $expect_out(1,string)

Источник выход этого:

$ source <(expect test.exp)
$ echo $FOO
stackexchange
1
27.01.2020, 23:18
spawn /bin/bash -c "../source_script.sh &&./exec_script.sh"
0
04.02.2020, 21:55

Теги

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