LINUX.ORG.RU

Помогите написать скрипт

 


0

1

Добрый день. Сразу хочу извинится за свою неграмотность. Прошу помощи людей которые могут написать скрипт. Есть сервер ubuntu.У него постоянно меняется IP внешний. Есть конфиг файл в котором фигурирует этот IP. Нужно что бы в конфиг файл вносились изменения о том что IP поменялся, и демон перезапускался. Для определения внешнего ip думаю использовать curl https://ipinfo.io/ip выводит четко. ifconfig не подходит так как сервер за nat. Как записать в файл mtproto-proxy.service:

[Unit] Description=MTProxy After=network.target [Service] ExecStart=/usr/bin/mtproto-proxy -u nobody -p 8888 -H 443 -S XXXXX -P XXXXXX --aes-pwd /etc/mtproto-proxy/proxy-secret /etc/mtproto-proxy/proxy-multi.conf -M 1 --nat-info 10.65.60.39:ВЫВОД КОМАНДЫ (curl https://ipinfo.io/ip) Restart=on-failure [Install] WantedBy=multi-user.target

Как видите нужно вывод дописать там где --nat-info 10.65.60.39:ВЫВОД КОМАНДЫ (curl https://ipinfo.io/ip)

Направьте на путь истинный.......

Ну и где твой минимальной рабочий пример? Или все за тебя писать?

Вот тебе логика программы на баше. Устанавливаешь значение, полученное от курла как ИП_ТЕКУЩИЙ. Устанавливаешь значение, полученное sed/awk/grep или еще чем, из сервиса как ИП_УСТАНОВЛЕННЫЙ. Сравниваешь их. Если отличаются, тогда подставляешь sed в сервис файл ИП_ТЕКУЩИЙ вместо ИП_УСТАНОВЛЕННЫЙ. Профит.

anonymous
()

Ничего не понятно что и куда

  1. Используй лоркод и приведи написанное в читабельное состояние
  2. что в выхлопе curl
  3. покажи файл в котором надо вносить изменения и укажи место где оно вносится
  4. sed и awk помогут распарсить очень многое
Silerus ★★★★
()

Ты бы хоть с ЯП определился. А то есть тут извращенцы, любящие админить скриптами на питоне или даже на всяких zsh/fish и что там сейчас годного из не дефолта.

peregrine ★★★★★
()
i=$(curl https://ipinfo.io/ip); 
sed "s/--nat-info 10.65.60.39:[^ \t]* /--nat-info 10.65.60.39:$i/" mtproto-proxy.service 

systemctl reload mtproto-proxy

скрипт в крон

heilnull ★★
()
Ответ на: комментарий от heilnull

systemctl

скрипт в крон

фейспалмище

anonymous
()
Ответ на: комментарий от Silerus

Сори если кого обидел. В скриптах не силен. Но скрипт пробовал написать на bash Вывод curl https://ipinfo.io/ip Это внешний ip. ВОТ Он 31.122.116.6

Файл лежит по пути /etc/systemd/system/mtproto-proxy.service Содержимое файла есть в шапке, но повторюсь:

  • [Unit]
  • Description=MTProxy
  • After=network.target
  • [Service]
  • ExecStart=/usr/bin/mtproto-proxy -u nobody -p 8888 -H 443 -S 2cb250124dfa835352c5d9a72b619340 -P 35ce9309dd83af466031a673384ddd46 --aes-pwd /etc/mtproto-proxy/proxy-secret /etc/mtproto-proxy/proxy-multi.conf -M 1 --nat-info 172.31.43.57:ВЫВОД КОМАНДЫ (curl https://ipinfo.io/ip)
  • Restart=on-failure
  • [Install]
  • WantedBy=multi-user.target

Я пробовал сделать переменную для IP=${curl https://ipinfo.io/ip} Но не получилось ничего......

testsia
() автор топика

На старте системы положить IP в /tmp/IP

Затем в скрипте в бесконечном цикле проверять, совпадает ли внешний IP с тем, который в файле. Если не совпадает, перезапускать сервис и записывать новый IP в /tmp/IP.

Но надо понимать, что если ты будешь ломиться в https://ipinfo.io/ip примерно всегда, то рано или поздно тебя забанят (whatismyip.com, например, банит после нескольких запросов). Так что в бесконечном цикле имеет смысл поставить приемлемый sleep.

slamd64 ★★★★★
()
Ответ на: комментарий от testsia

лол, это у вас точно работает? потому что абсолютно все команды бредовые и никогда работать не будут

anonymous
()
Ответ на: комментарий от testsia
#!/bin/bash
ip=$(curl https://ipinfo.io/ip)
sed -i "s/(--nat-info\s*\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(\s*:\s*)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/\1\2$ip/" /etc/systemd/system/mtproto-proxy.service 
systemctl reload mtproto-proxy
Silerus ★★★★
()
Ответ на: комментарий от testsia

На, я добрый.

#!/usr/bin/env bash

set -e

# Путь до сервиса
SERV_PATH=/etc/systemd/system/mtproto-proxy.service

while true; do
    # Получение ip, установленного в mtproto-proxy.service
    CUR_IP="$(awk -F: '/ExecStart/ {print $NF}' $SERV_PATH)"

    # Получение текущего внешнего ip
    CURL_IP="$(curl https://ipinfo.io/ip)"

    # Проверка несовпадения CUR_IP с CURL_IP
    if ! [[ "$CUR_IP" = "$CURL_IP" ]]; then

	# Замена CUR_IP на CURL_IP
	sed -i "s/$CUR_IP/$CURL_IP/" "$SERV_PATH"

	# Обновление сервиса
	systemctl daemon-reload

    fi

    # Задрежка между циклами в секундах
    sleep 360

done

Сервис, который скрипт запускает можешь сам написать, если простой цикл не устраивает.

anonymous
()
Ответ на: комментарий от anonymous

Можно еще добавить проверку на ответ от курла на случай получения пустого ответа или ошибок, но это по вкусу.

anonymous
()
Ответ на: комментарий от anonymous

Люди.

  • Спасибо вам огромное всем.
  • Даже не думал что сколько людей откликнутся помочь.
  • Теперь это все переварю и попробую разобраться.
  • Вы лучшие!
testsia
() автор топика
Ответ на: комментарий от anonymous

Прошу вас anonymous выйти на связь личку или на почту testsiausa@gmail.com Есть деловое предложение.

testsia
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.