Как подписать сценарий Bash как клиент MQTT

Я не уверен, чего Вы пытаетесь достигнуть с фрагментом кода, но вот пример использования оценки наряду со сравнением с подобными операторами замены команды:

$ echo `echo 2 + 2 | bc`
4
$ echo $(echo 2 + 2 | bc)
4
$ eval "echo 2 + 2 | bc"
4
$ echo "date"
date
$ eval "date"
Thu Oct 10 21:20:01 EDT 2013

Таким образом, оценка "оценивает" команду или ряд команд, и возвращает результат выполнения той команды. Ни за что в жизни я не могу выяснить использование для eval кроме того, который может быть сделан или выполнением команд непосредственно или использованием одинарной левой кавычки или $(...) синтаксис.

2
07.03.2015, 03:09
2 ответа

Лично мне биш-бош показалось мне немного сложным на мой вкус. Я не очень разбираюсь в sql, но я возьму удар по части mqtt. Вам понадобится слушатель, запускающий mosquitto_sub для чтения и выполнения команд, а на вашем терминале вам необходимо подписаться на выходной поток. Наконец, вам понадобится обработчик для отправки команд. Для слушателя вы можете попробовать что-то вроде этого:

#!/bin/bash
##########################
# MQTT Shell Listen & Exec
host=$2
clean="output input cmds";p="backpipe";pid=$(cat pidfile)
ctrl_c() {
  echo "Cleaning up..."
  rm -f $p;rm "$clean";kill $pid 2>/dev/null
  if [[ "$?" -eq "0" ]];
  then
     echo "Exit success";exit 0
  else
     exit 1
  fi
}

listen(){
([ ! -p "$p" ]) && mkfifo $p
(mosquitto_sub -h $host -t input >$p 2>/dev/null) &
echo "$!" > pidfile
while read line <$p
do
  echo $line > cmds
  if grep -q "quit" cmds; then
    (rm -f $p;rm $clean;kill $pid) 2>/dev/null
    break
  else
    (bash cmds | tee out) && mosquitto_pub -h $host -t output -f out;>out
  fi
done
}

usage(){
echo "    Mqtt-Exec Listener Via Bash"
echo "  Usage: $0 <mqtt server>"
echo "  Subscripe to topic \"output\", publish to topic \"input\""
}

case "$1" in
-h|--host)
trap ctrl_c INT
listen
;;
*)
usage
exit 1
;;
esac

Это отлично работает, если вы не пытаетесь передавать данные в потоковом режиме, и в этом случае вам нужно будет как-то его закодировать или вывести новые строки. Но это должно работать для простой отправки команд через mqtt.

Затем подпишитесь на выходной поток, чтобы вы могли видеть вывод оболочки.

mosquitto_sub -h $host -t input

Наконец, для обработчика, что-то вроде этого:

#!/bin/sh
cmds="$@"
echo $cmd | mosquitto_pub -h $host -t input -l
exit

Тогда вы можете запустить его в сеансе tmux вместе с обработчиком, и у вас будет интерактивная оболочка: Окно 1:

./handle echo "This is an interactive mqtt shell!"

Окно 2:

This is an interactive mqtt shell!
4
27.01.2020, 21:56

Вы видели Биш-Бош? Это должно сделать работу.

Клиент скрипта Shell MQTT, для Bash, Dash, Ashbox Ash и другие

https://github.com/raphaelcohn/bish-bosh

1
27.01.2020, 21:56

Теги

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