Плагин Xfce4 genmon ‹txt› не отображает переменный контент

У меня проблема с плагином xfce4-genmon. Я использую его для мониторинга моего VPN-соединения. Всякий раз, когда я подключаюсь к своей VPN (NordVPN с использованием openpyn), он отображает символ и сервер, к которому я подключен, с помощью этой команды: $(ps ax | grep $(pidof openvpn) | perl -n -e '// (\w+) .nordvpn.com/ && напечатать $1')

Недавно я решил, что хочу, чтобы он также отображал мой текущий IP-адрес (WAN).

Я написал короткий bash-скрипт, который регулярно проверяет IP-адрес с помощью команды $(wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\‹ -f 1) Это хранится в переменной среды с именем IPPUBLIQUE и работает нормально.

Следующим шагом было написать скрипт для универсального плагина монитора, который находится здесь:

#!/bin/bash
echo $IPPUBLIQUE
ip=$IPPUBLIQUE
echo $ip
ip="IP:$ip"
echo $ip
checkvpn=$(nmcli con |grep tun0)

if [ -n "$checkvpn" ]
 then
   echo "<img>/home/richard/Scripts/vpn.png</img>"
   echo "<txt>$ip; "$(ps ax | grep $(pidof openvpn) | perl -n -e '/\/(\w+)    \.nordvpn\.com/ && print $1')"</txt>"
   echo "<click>/home/richard/bin/./killvpngenmon.sh</click>"
   echo "<tool>Connected to VPN</tool>"
   echo "<img>/home/richard/Scripts/novpn.png</img>"

 else
   echo "<img>/home/richard/Scripts/novpn.png</img>"
   echo "<txt>$ip</txt>"
   echo "<click>gksudo /home/richard/bin/autovpn</click>"
   echo "<tool>Not connected to VPN</tool>"
   echo "<img>/home/richard/Scripts/vpn.png</img>"
fi

Когда я тестирую сценарий в консоли, значения каждой переменной верны и распечатываются с помощью эхо-команд. Они будут содержать правильные IP-адреса. Однако монитор отображает только $ip как «IP:». Что бы я ни делал, он отказывается отображать мой IP-адрес, но если я задаю переменную вручную (например, ip=192.168.0.1 вместо ip=$IPPUBLIQUE), то все работает.

Консольный вывод

Выход плагина Genmon

Может ли кто-нибудь помочь понять, что происходит и как я могу это исправить?

Большое спасибо


person RHarris    schedule 30.05.2018    source источник
comment
Да, это не сработает, если вы не установите для него значение, установите значение как IPPUBLIQUE для IP-адреса после #!/bin/bash или передайте его как один из аргументов из командной строки.   -  person Inian    schedule 30.05.2018
comment
Что ты имеешь в виду? Не могли бы вы показать мне пример?   -  person RHarris    schedule 30.05.2018
comment
Сценарий, который у вас есть, не устанавливает значение переменной. Как еще вы ожидаете, что он будет содержать IP   -  person Inian    schedule 30.05.2018
comment
На самом деле IPPUBLIQUE установлен в другом сценарии, и когда я запускаю консоль, я получаю следующий вывод: 77.136.204.197 77.136.204.197 IP: 77.136.204.197 ‹img›/home/richard/Scripts/novpn.png‹/img› ‹txt ›IP: 77.136.204.197‹/txt› ‹click›gksudo /home/richard/bin/autovpn‹/click› ‹tool›Не подключен к VPN‹/tool› ‹img›/home/richard/Scripts/vpn.png ‹/img› Таким образом, переменные кажутся установленными, но впоследствии не отображаются   -  person RHarris    schedule 30.05.2018


Ответы (2)


Итак, скрипт, запускаемый из genmon, не имеет значения IPPUBLIQUE. Почему бы вам просто не получить общедоступный IP-адрес в скрипте?

#!/bin/bash
IPPUBLIQUE=$(wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1)
echo $IPPUBLIQUE
.... rest of the script ...

Вы можете экспортировать значение IPPUBLIQUE в файл:

echo "IPPUBLIQUE=$(wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1)" > /tmp/.IPPUBLIQUE

А затем импортируйте файл из вашего скрипта:

#!/bin/bash
. /tmp/.IPPUBLIQUE
echo $IPPUBLIQUE
.... rest of the script ...
person KamilCuk    schedule 30.05.2018
comment
Я не хотел запускать #IPPUBLIQUE=$(wget checkip.dyndns.org -O - -o /dev/null | cut -d: -f 2 | cut -d\‹ -f 1) потому что скрипт запускается каждые 5 секунд. Попробую экспортировать в файл. Большое спасибо - person RHarris; 30.05.2018

Я попытался создать файл и затем импортировать его в скрипт genmon.

Один скрипт получает WAN-адрес и сохраняет его в файле /tmp/.adresse: (вот он)

#!/bin/bash
ip=$(wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1)
ip="${ip:1}"
echo $ip > /tmp/.adresse

как предложил Камиль Кук (спасибо), который отлично работает, однако вторая часть не работает, но я нашел обходной путь (в основном, если я сохраняю содержимое файла с «кошкой» в переменной, он не отображается, а будет, если я выполню кошку напрямую)

Код 1 (не работает)

#!/bin/bash

ip= cat /tmp/.adresse
echo $ip
checkvpn=$(nmcli con |grep tun0)
echo $checkvpn

if [ -n "$checkvpn" ]
 then

  echo "<img>/home/richard/Scripts/vpn.png</img>"
  echo "<txt>$ip; "$(ps ax | grep $(pidof openvpn) | perl -n -e '/\/(\w+)\.nordvpn\.com/ && print $1')"</txt>"
  echo "<click>/home/richard/bin/./killvpngenmon.sh</click>"
  echo "<tool>Connected to VPN</tool>"
  echo "<img>/home/richard/Scripts/novpn.png</img>"

 else

  echo "<img>/home/richard/Scripts/novpn.png</img>"
  echo "<txt>$ip</txt>"
  echo "<click>gksudo /home/richard/bin/autovpn</click>"
  echo "<tool>Not connected to VPN</tool>"
  echo "<img>/home/richard/Scripts/vpn.png</img>"

fi

Код 2 (обходной путь)

#!/bin/bash

checkvpn=$(nmcli con |grep tun0)
echo $checkvpn

if [ -n "$checkvpn" ]
 then

  echo "<img>/home/richard/Scripts/vpn.png</img>"
  echo "<txt>"$(cat /tmp/.adresse)"; "$(ps ax | grep $(pidof openvpn) | perl -n -e '/\/(\w+)\.nordvpn\.com/ && print $1')"</txt>"
  echo "<click>/home/richard/bin/./killvpngenmon.sh</click>"
  echo "<tool>Connected to VPN</tool>"
  echo "<img>/home/richard/Scripts/novpn.png</img>"

 else

  echo "<img>/home/richard/Scripts/novpn.png</img>"
  echo "<txt>"$(cat /tmp/.adresse)"</txt>"
  echo "<click>gksudo /home/richard/bin/autovpn</click>"
  echo "<tool>Not connected to VPN</tool>"
  echo "<img>/home/richard/Scripts/vpn.png</img>"

fi

Все работает, так что все хорошо, но я не понимаю, почему код 1 не работает, может ли кто-нибудь объяснить мне, почему работает решение 2, а не 1?

Спасибо за вашу помощь

person RHarris    schedule 30.05.2018