Да, вы можете это сделать, и это даже не так сложно. У меня есть ноутбук с беспроводной картой и портом 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-сервера. Вам нужно будет использовать свою голову, чтобы понять, что подходит для вашей установки.
Фундаментальная проблема заключается в том, что дочерний процесс не может изменить окружение своего родителя. Вот почему вам нужно 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
запускаете эту оболочку, порожденная оболочка умирает, затем ожидайте, что сценарий завершится, и вы вернетесь в свою текущую оболочку (без переменных, которые вы инициализировали ).
Вы можете создать сценарий оболочки, который различает среды до и после запуска этой функции:
#!/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