netplan_configurator.md
· 335 B · Markdown
Bruto
```
wget https://raw.githubusercontent.com/openlicence/netplan_configurator.sh/refs/heads/main/netplan_configurator.sh
chmod +x netplan_configurator.sh
./netplan_configurator.sh
```
Original: https://github.com/openlicence/netplan_configurator.sh
Упоминается в https://timeweb.cloud/docs/unix-guides/adding-ip-addresses
wget https://raw.githubusercontent.com/openlicence/netplan_configurator.sh/refs/heads/main/netplan_configurator.sh
chmod +x netplan_configurator.sh
./netplan_configurator.sh
Original: https://github.com/openlicence/netplan_configurator.sh
Упоминается в https://timeweb.cloud/docs/unix-guides/adding-ip-addresses
netplan_configurator.sh
· 6.6 KiB · Bash
Bruto
#!/bin/bash
# Функция для проверки IPv4
function is_valid_ipv4() {
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
# Функция для проверки IPv6
function is_valid_ipv6() {
local ip=$1
local stat=1
if [[ $ip =~ ^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$ ]]; then
stat=0
fi
return $stat
}
# Определение шлюза
function get_gateway() {
local ip=$1
if is_valid_ipv4 "$ip"; then
IFS='.' read -ra octets <<< "$ip"
octets[3]=1
echo "${octets[0]}.${octets[1]}.${octets[2]}.${octets[3]}"
elif is_valid_ipv6 "$ip"; then
IFS=':' read -ra hextets <<< "$ip"
hextets[-1]="1"
echo "$(IFS=:; echo "${hextets[*]}")"
else
echo "Неверный IP-адрес"
exit 1
fi
}
# Форматирование DNS для YAML
function format_dns() {
local formatted=()
for addr in "$@"; do
formatted+=("\"$addr\"")
done
echo "${formatted[*]}" | sed 's/ /, /g'
}
# Вывод списка доступных интерфейсов
function show_interfaces() {
echo "Доступные сетевые интерфейсы:"
ip -o link show | awk -F': ' '{print $2}'
}
# Запрос типа настройки
read -p "Настройка временная (1) или постоянная (2)? Введите 1 или 2: " config_type
# Вывод списка интерфейсов и запрос выбора
show_interfaces
read -p "Введите имя интерфейса (например, eth0): " interface
# Проверка существования интерфейса
if ! ip link show "$interface" &> /dev/null; then
echo "Интерфейс $interface не найден!"
exit 1
fi
# Ввод IPv4 адресов
while true; do
read -p "Введите IPv4 адреса через пробел (первый будет основным): " ipv4_input
ipv4_addresses=($ipv4_input)
valid=true
for ip in "${ipv4_addresses[@]}"; do
if ! is_valid_ipv4 "$ip"; then
echo "Неверный формат IPv4: $ip"
valid=false
break
fi
done
if $valid; then
break
fi
done
# Основной IPv4 и шлюз
main_ipv4=${ipv4_addresses[0]}
ipv4_gateway=$(get_gateway "$main_ipv4")
# Ввод IPv6 адресов (опционально)
read -p "Добавить IPv6 адреса? (y/n): " add_ipv6
if [[ $add_ipv6 == "y" ]]; then
while true; do
read -p "Введите IPv6 адреса через пробел (первый будет основным): " ipv6_input
ipv6_addresses=($ipv6_input)
valid=true
for ip in "${ipv6_addresses[@]}"; do
if ! is_valid_ipv6 "$ip"; then
echo "Неверный формат IPv6: $ip"
valid=false
break
fi
done
if $valid; then
break
fi
done
# Основной IPv6 и шлюз
main_ipv6=${ipv6_addresses[0]}
ipv6_gateway=$(get_gateway "$main_ipv6")
fi
# DNS-серверы
dns=()
read -p "Использовать DNS по умолчанию (Cloudflare)? (y/n): " use_default_dns
if [[ $use_default_dns == "y" ]]; then
dns=("1.1.1.1" "1.0.0.1" "2606:4700:4700::1111" "2606:4700:4700::1001")
else
echo "Введите DNS-серверы (завершите пустой строкой):"
while true; do
read dns_entry
[[ -z $dns_entry ]] && break
dns+=("$dns_entry")
done
fi
dns_string=$(format_dns "${dns[@]}")
# Временная настройка
if [[ $config_type == "1" ]]; then
echo "Применение временных настроек..."
# Добавление IPv4 адресов
for ip in "${ipv4_addresses[@]}"; do
sudo ip addr add "$ip/24" dev $interface
done
# Добавление IPv6 адресов
if [[ $add_ipv6 == "y" ]]; then
for ip in "${ipv6_addresses[@]}"; do
sudo ip addr add "$ip/128" dev $interface
done
fi
# Настройка маршрутов
if [[ -n "$ipv4_gateway" ]]; then
sudo ip route replace default via $ipv4_gateway dev $interface
fi
if [[ -n "$ipv6_gateway" && $add_ipv6 == "y" ]]; then
sudo ip -6 route replace default via $ipv6_gateway dev $interface
fi
echo "Временные настройки применены"
# Постоянная настройка для Ubuntu
else
echo "Применение постоянных настроек для Ubuntu..."
# Создание IPv4 конфига
if [[ ${#ipv4_addresses[@]} -gt 0 ]]; then
ipv4_file="/etc/netplan/99-ipv4.yaml"
# Форматирование адресов для YAML
ipv4_formatted=()
for ip in "${ipv4_addresses[@]}"; do
ipv4_formatted+=("\"$ip/24\"")
done
ipv4_string=$(IFS=,; echo "${ipv4_formatted[*]}")
cat << EOF | sudo tee $ipv4_file > /dev/null
network:
version: 2
renderer: networkd
ethernets:
$interface:
dhcp4: false
addresses: [$ipv4_string]
routes:
- to: 0.0.0.0/0
via: $ipv4_gateway
nameservers:
addresses: [$dns_string]
EOF
sudo chmod 600 $ipv4_file
fi
# Создание IPv6 конфига
if [[ ${#ipv6_addresses[@]} -gt 0 && $add_ipv6 == "y" ]]; then
ipv6_file="/etc/netplan/99-ipv6.yaml"
# Форматирование адресов для YAML
ipv6_formatted=()
for ip in "${ipv6_addresses[@]}"; do
ipv6_formatted+=("\"$ip/128\"")
done
ipv6_string=$(IFS=,; echo "${ipv6_formatted[*]}")
cat << EOF | sudo tee $ipv6_file > /dev/null
network:
version: 2
renderer: networkd
ethernets:
$interface:
dhcp6: false
addresses: [$ipv6_string]
routes:
- to: ::/0
via: $ipv6_gateway
nameservers:
addresses: [$dns_string]
EOF
sudo chmod 600 $ipv6_file
fi
# Резервирование старых конфигов
sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.backup 2>/dev/null
# Применение настроек
sudo netplan apply
echo "Настройки применены. Рекомендуется перезагрузить сервер."
fi
| 1 | #!/bin/bash |
| 2 | |
| 3 | # Функция для проверки IPv4 |
| 4 | function is_valid_ipv4() { |
| 5 | local ip=$1 |
| 6 | local stat=1 |
| 7 | if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then |
| 8 | OIFS=$IFS |
| 9 | IFS='.' |
| 10 | ip=($ip) |
| 11 | IFS=$OIFS |
| 12 | [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ |
| 13 | && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] |
| 14 | stat=$? |
| 15 | fi |
| 16 | return $stat |
| 17 | } |
| 18 | |
| 19 | # Функция для проверки IPv6 |
| 20 | function is_valid_ipv6() { |
| 21 | local ip=$1 |
| 22 | local stat=1 |
| 23 | if [[ $ip =~ ^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$ ]]; then |
| 24 | stat=0 |
| 25 | fi |
| 26 | return $stat |
| 27 | } |
| 28 | |
| 29 | # Определение шлюза |
| 30 | function get_gateway() { |
| 31 | local ip=$1 |
| 32 | if is_valid_ipv4 "$ip"; then |
| 33 | IFS='.' read -ra octets <<< "$ip" |
| 34 | octets[3]=1 |
| 35 | echo "${octets[0]}.${octets[1]}.${octets[2]}.${octets[3]}" |
| 36 | elif is_valid_ipv6 "$ip"; then |
| 37 | IFS=':' read -ra hextets <<< "$ip" |
| 38 | hextets[-1]="1" |
| 39 | echo "$(IFS=:; echo "${hextets[*]}")" |
| 40 | else |
| 41 | echo "Неверный IP-адрес" |
| 42 | exit 1 |
| 43 | fi |
| 44 | } |
| 45 | |
| 46 | # Форматирование DNS для YAML |
| 47 | function format_dns() { |
| 48 | local formatted=() |
| 49 | for addr in "$@"; do |
| 50 | formatted+=("\"$addr\"") |
| 51 | done |
| 52 | echo "${formatted[*]}" | sed 's/ /, /g' |
| 53 | } |
| 54 | |
| 55 | # Вывод списка доступных интерфейсов |
| 56 | function show_interfaces() { |
| 57 | echo "Доступные сетевые интерфейсы:" |
| 58 | ip -o link show | awk -F': ' '{print $2}' |
| 59 | } |
| 60 | |
| 61 | # Запрос типа настройки |
| 62 | read -p "Настройка временная (1) или постоянная (2)? Введите 1 или 2: " config_type |
| 63 | |
| 64 | # Вывод списка интерфейсов и запрос выбора |
| 65 | show_interfaces |
| 66 | read -p "Введите имя интерфейса (например, eth0): " interface |
| 67 | |
| 68 | # Проверка существования интерфейса |
| 69 | if ! ip link show "$interface" &> /dev/null; then |
| 70 | echo "Интерфейс $interface не найден!" |
| 71 | exit 1 |
| 72 | fi |
| 73 | |
| 74 | # Ввод IPv4 адресов |
| 75 | while true; do |
| 76 | read -p "Введите IPv4 адреса через пробел (первый будет основным): " ipv4_input |
| 77 | ipv4_addresses=($ipv4_input) |
| 78 | valid=true |
| 79 | for ip in "${ipv4_addresses[@]}"; do |
| 80 | if ! is_valid_ipv4 "$ip"; then |
| 81 | echo "Неверный формат IPv4: $ip" |
| 82 | valid=false |
| 83 | break |
| 84 | fi |
| 85 | done |
| 86 | if $valid; then |
| 87 | break |
| 88 | fi |
| 89 | done |
| 90 | |
| 91 | # Основной IPv4 и шлюз |
| 92 | main_ipv4=${ipv4_addresses[0]} |
| 93 | ipv4_gateway=$(get_gateway "$main_ipv4") |
| 94 | |
| 95 | # Ввод IPv6 адресов (опционально) |
| 96 | read -p "Добавить IPv6 адреса? (y/n): " add_ipv6 |
| 97 | if [[ $add_ipv6 == "y" ]]; then |
| 98 | while true; do |
| 99 | read -p "Введите IPv6 адреса через пробел (первый будет основным): " ipv6_input |
| 100 | ipv6_addresses=($ipv6_input) |
| 101 | valid=true |
| 102 | for ip in "${ipv6_addresses[@]}"; do |
| 103 | if ! is_valid_ipv6 "$ip"; then |
| 104 | echo "Неверный формат IPv6: $ip" |
| 105 | valid=false |
| 106 | break |
| 107 | fi |
| 108 | done |
| 109 | if $valid; then |
| 110 | break |
| 111 | fi |
| 112 | done |
| 113 | |
| 114 | # Основной IPv6 и шлюз |
| 115 | main_ipv6=${ipv6_addresses[0]} |
| 116 | ipv6_gateway=$(get_gateway "$main_ipv6") |
| 117 | fi |
| 118 | |
| 119 | # DNS-серверы |
| 120 | dns=() |
| 121 | read -p "Использовать DNS по умолчанию (Cloudflare)? (y/n): " use_default_dns |
| 122 | if [[ $use_default_dns == "y" ]]; then |
| 123 | dns=("1.1.1.1" "1.0.0.1" "2606:4700:4700::1111" "2606:4700:4700::1001") |
| 124 | else |
| 125 | echo "Введите DNS-серверы (завершите пустой строкой):" |
| 126 | while true; do |
| 127 | read dns_entry |
| 128 | [[ -z $dns_entry ]] && break |
| 129 | dns+=("$dns_entry") |
| 130 | done |
| 131 | fi |
| 132 | dns_string=$(format_dns "${dns[@]}") |
| 133 | |
| 134 | # Временная настройка |
| 135 | if [[ $config_type == "1" ]]; then |
| 136 | echo "Применение временных настроек..." |
| 137 | # Добавление IPv4 адресов |
| 138 | for ip in "${ipv4_addresses[@]}"; do |
| 139 | sudo ip addr add "$ip/24" dev $interface |
| 140 | done |
| 141 | |
| 142 | # Добавление IPv6 адресов |
| 143 | if [[ $add_ipv6 == "y" ]]; then |
| 144 | for ip in "${ipv6_addresses[@]}"; do |
| 145 | sudo ip addr add "$ip/128" dev $interface |
| 146 | done |
| 147 | fi |
| 148 | |
| 149 | # Настройка маршрутов |
| 150 | if [[ -n "$ipv4_gateway" ]]; then |
| 151 | sudo ip route replace default via $ipv4_gateway dev $interface |
| 152 | fi |
| 153 | if [[ -n "$ipv6_gateway" && $add_ipv6 == "y" ]]; then |
| 154 | sudo ip -6 route replace default via $ipv6_gateway dev $interface |
| 155 | fi |
| 156 | |
| 157 | echo "Временные настройки применены" |
| 158 | |
| 159 | # Постоянная настройка для Ubuntu |
| 160 | else |
| 161 | echo "Применение постоянных настроек для Ubuntu..." |
| 162 | |
| 163 | # Создание IPv4 конфига |
| 164 | if [[ ${#ipv4_addresses[@]} -gt 0 ]]; then |
| 165 | ipv4_file="/etc/netplan/99-ipv4.yaml" |
| 166 | # Форматирование адресов для YAML |
| 167 | ipv4_formatted=() |
| 168 | for ip in "${ipv4_addresses[@]}"; do |
| 169 | ipv4_formatted+=("\"$ip/24\"") |
| 170 | done |
| 171 | ipv4_string=$(IFS=,; echo "${ipv4_formatted[*]}") |
| 172 | |
| 173 | cat << EOF | sudo tee $ipv4_file > /dev/null |
| 174 | network: |
| 175 | version: 2 |
| 176 | renderer: networkd |
| 177 | ethernets: |
| 178 | $interface: |
| 179 | dhcp4: false |
| 180 | addresses: [$ipv4_string] |
| 181 | routes: |
| 182 | - to: 0.0.0.0/0 |
| 183 | via: $ipv4_gateway |
| 184 | nameservers: |
| 185 | addresses: [$dns_string] |
| 186 | EOF |
| 187 | sudo chmod 600 $ipv4_file |
| 188 | fi |
| 189 | |
| 190 | # Создание IPv6 конфига |
| 191 | if [[ ${#ipv6_addresses[@]} -gt 0 && $add_ipv6 == "y" ]]; then |
| 192 | ipv6_file="/etc/netplan/99-ipv6.yaml" |
| 193 | # Форматирование адресов для YAML |
| 194 | ipv6_formatted=() |
| 195 | for ip in "${ipv6_addresses[@]}"; do |
| 196 | ipv6_formatted+=("\"$ip/128\"") |
| 197 | done |
| 198 | ipv6_string=$(IFS=,; echo "${ipv6_formatted[*]}") |
| 199 | |
| 200 | cat << EOF | sudo tee $ipv6_file > /dev/null |
| 201 | network: |
| 202 | version: 2 |
| 203 | renderer: networkd |
| 204 | ethernets: |
| 205 | $interface: |
| 206 | dhcp6: false |
| 207 | addresses: [$ipv6_string] |
| 208 | routes: |
| 209 | - to: ::/0 |
| 210 | via: $ipv6_gateway |
| 211 | nameservers: |
| 212 | addresses: [$dns_string] |
| 213 | EOF |
| 214 | sudo chmod 600 $ipv6_file |
| 215 | fi |
| 216 | |
| 217 | # Резервирование старых конфигов |
| 218 | sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.backup 2>/dev/null |
| 219 | |
| 220 | # Применение настроек |
| 221 | sudo netplan apply |
| 222 | echo "Настройки применены. Рекомендуется перезагрузить сервер." |
| 223 | fi |
| 224 |