Передача параметра со специальными символами в исполняемый скрипт Socat

У меня есть USB-модем RNDIS, который разрешает AT-команды через порт telnet (5510). Я хочу использовать его для чтения и отправки SMS-сообщений из скрипта. Я использовал вариант аналогичного вопроса, опубликованного здесь, но я использую socat вместо netcat.

  1. У меня есть вспомогательный скрипт atread.sh:
#!/bin/sh

echo -e $@ 

IFS=$'\n' 
while read line; do
    echo $line >&3
    if [ "${line::2}" = "OK" ] || [ "${line::5}" = "ERROR" ] ; then
        break
    fi
done
  1. Затем у меня есть функция в моем основном скрипте:
smsio() {
    response=$(3>&1 socat -T 2 exec:"./atread.sh '$1'" tcp:xxx.xxx.xxx.xxx:5510,crlf)
    ... (some other code to check for a timeout or broken pipe)
}
  1. Я вызываю функцию в основном скрипте так: smsio "AT+CMGF=1".

Это работает очень хорошо, если параметр не содержит специальных символов, а именно:

  • Кавычки (") как в smsio 'AT+CMGL = "ALL"' для чтения всех SMS-сообщений
  • Обратная косая черта (\) как в smsio 'AT+CMGS = "123456789"' ; smsio "Text Message\x1A" для отправки SMS

Я пытался экранировать специальный символ, используя обратную косую черту (\") и/или добавляя двойные кавычки ("".."), но похоже, что socat удаляет все специальные символы перед вызовом сценария exec. Любые предложения, как получить эти специальные символы через socat?

PS: я временно обошел проблему с помощью замены символов (т.е. используя ! for " в строке параметров, затем используя tr '!' '"' в atread.sh, но я ищу более элегантное решение.

Проверьте свой скрипт с помощью shellcheck. Это вообще какой-то странный подход. И вы пометили bash и ash - какой из них вы используете? В любом случае, используйте coproc socat - tcp:... и общайтесь с coproc. И рассмотрите возможность использования python. Написать это в Bash будет сложнее. Для передачи правильно цитируемых значений используйте printf "%q" или просто используйте переменные среды. it appears that socat is stripping Как "оказывается"? Вы его отладили? Запустите tcpdump и посмотрите, что отправляется.

KamilCuk 20.03.2022 11:19

Извините, да, используя пепел. Он работает на маршрутизаторе (OpenWRT), поэтому не может использовать ничего такого тяжелого, как Python. Я добавил несколько отпечатков трассировки как к вызову, так и к вызывающему абоненту и попробовал различные варианты. Я ожидал, что специальный символ появится, когда я использовал обратную косую черту. Я буду исследовать coproc и tcpdump.

Rob P 21.03.2022 05:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Парсер адресов Socats специально интерпретирует несколько символов, например:

: , ! " ' \ ( [ {

Вы должны экранировать их обратной косой чертой. Обратите внимание, что вам также необходимо экранировать несколько специальных символов, включая \, из синтаксического анализатора оболочки.

Используйте опции -d -d -d -d, чтобы увидеть параметры, которые socat получает и использует; попробуйте что-то вроде

socat -u /tmp/nonexistingdir/x\\\\x -

чтобы увидеть в сообщении об ошибке, что осталось от специальных символов, когда socat выполняет последний системный вызов.

Опция -d -d -d -d действительно помогла. Позвольте мне посмотреть, что было передано socat. Я был очень близок. Для работы требуется 3 escape-последовательности (обратная косая черта). Так что призыв читать смс-сообщения - это смс smsio 'AT+CMGL=\\\"ALL\\\"'.

Rob P 24.03.2022 06:45

Сообщение об отправке было немного сложнее: smsio 'AT+CMGS=\\\"123456789\\\"' ; smsio "Text Message"'\\\\x1A' Спасибо за помощь.

Rob P 24.03.2022 06:53

Другие вопросы по теме