LINUX.ORG.RU

прочитать JSON файл из скрипта на bash

 , ,


0

2

Понадобился мне на днях добавить некий скрипт в крон. Загвоздка в том, что я хочу брать настройки, у меня это доступ к ftp, из json файла некой программы. Изобразил я такой код

X=$(cat $1 | python -c '
import sys
import json
try:
    ftp = json.load(sys.stdin)["ftp"]
except Exception as why:
    print "PARSE_ERR=\"{0}\"".format(why)
    exit(1)
print "FTPHOST={host}\nUSER={user}\nSECRET={password}".format(**ftp)
')

eval $X

Но скрипт на питоне внутри скрипта на баше это как-то меня смущает. Как тру баш-кодеры, а они на ЛОРе есть, я знаю, решают подобную задачу. Есть ли общепринятые инструменты? Что говорит нам POSIX?

★★

Есть ли общепринятые инструменты?

да, python и perl. не, можно парсить json grep'ами, но так как-то правильнее.

Но скрипт на питоне внутри скрипта на баше это как-то меня смущает.

а скрипт на awk внутри скрипта на sh тебя смущает? думаю, что нет, равно как и кого другого.

f1u77y ★★★★
()
$ apt-cache search json parser | grep ^j  
jparse - JSON parser utility
jshon - Command line tool to parse, read and create JSON
sin_a ★★★★★
()

Например если надо распарсить XML на баше, используют консольные тулзы, делающие XPath-запросы. Для JSON-а найди такую же и всё. Твой вариант так себе, зачем тебе вообще баш, пиши на пайтоне весь скрипт.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

зачем тебе вообще баш, пиши на пайтоне весь скрипт.

Я человек подневольный, заказчику нужен скрипт на bash

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

Я бы на сях парсер забульбенил и из скрипта вызывал.

Бога побойся, подумай о том, что останется после тебя. Я как-то видел инсталятор на баше внутрь которого был инкапсулирован архив tgz

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

Бога побойся

Оккама на тебя нет!

Я как-то видел инсталятор на баше внутрь которого был инкапсулирован архив tgz

Я ж не предлагаю сишный исходник в скрипт внедрять. Отдельно, ясен пень.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Yur4eg

заказчику нужен скрипт на bash

И? У тебя проблема выдернуть жалких 3 параметра из него?

Покажи сам json файл

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

мне кажется, или юзер с паролем " halt -f" будет просто изголятся над горе-админом ?

Ого, это же bash-injection какой-то! Блин

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

И? У тебя проблема выдернуть жалких 3 параметра из него? Покажи сам json файл

Я просто хочу чтобы скрипт без зависимостей работал на centos и debian в минимальной установке, но видимо не судьба

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

Покажи сам json файл

{
    "context" : {
        "from-lb" : "outgoing",
        "from-rt" : "incoming"
    },
    "path": {
        "queues" : "/etc/asterisk/conf"
    },
    "trunks": {
        "lb": "lb-1",
        "rt": "r-1"
    },
    "dialtimeout": 100,
    "libdir": "/opt/pbxd/tests/conf",
    "astspooldir": "/opt/aster-13.1.cert2/var/spool/asterisk/monitor",
    "queue-member": "Local/s@trunk-service",
    "ast-binary": "/opt/aster-13.1.cert2/sbin/asterisk",
    "net": {
        "web_port": 8080,
        "web_ip": "0.0.0.0",
        "agi_port": 4573
    },
    "ftp": {
        "host": "localhost",
        "user": "userxxx",
        "password": "Cghfd0xybr1"
    },
    "scripts": {
        "postprocess": "/opt/pbxd/tests/conf/ps.sh"
    }
}
Yur4eg ★★
() автор топика
Ответ на: комментарий от Yur4eg

Чистый говно-баш

while read f s; do
  [ "$f" == '"host":' ]     && HOST=${s//[\":]})
  [ "$f" == '"user":' ]     && USER=${s//[\":]})
  [ "$f" == '"password":' ] && PASS=${s//[\":]})
done < /tmp/json

В пароле не должно быть символов " и ,

case, functions, ... добавить по вкусу

anonymous
()
Ответ на: комментарий от anonymous
<HOST=${s//[\":]})
>HOST=${s//[\":]}

в тех трех строках ) в конце лишняя случайно

anonymous
()
Ответ на: комментарий от anonymous
while read f s; do
  [ "$f" == '"host":' ]     && HOST=${s//[\",]}
  [ "$f" == '"user":' ]     && USER=${s//[\",]}
  [ "$f" == '"password":' ] && PASS=${s//[\",]}
done < /tmp/json
anonymous
()

jshn из openwrt. Специально под шелл заточен.

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

Что-нибудь типа

#!/bin/bash

declare -A option

while IFS=$':' read v t ; do
    v=$(echo $v)
    t=$(echo $t)
    if [ -n "$v" ] ; then
        v="${v%\"}"
        v="${v#\"}"
        if [ -z "$t" ] ; then
            s=$v
        else
            t="${t%\"}"
            t="${t#\"}"
            option["$s.$v"]="$t"
        fi
    fi
done < <( tr "{},\r\n" "\n" < config.json )

for k in ${!option[@]} ; do
    echo "$k = ${option[$k]}"
done

попробуй.

Не очень красиво, но не сильно длиннее пистона, и парсит все данные конфига в hash array. Можно сделать чтобы несколько уровней вложенности понимал, но мне лень. :)

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 2)
Ответ на: комментарий от Yur4eg

чтобы скрипт без зависимостей работал

скрипт берёт json от какой-то программы. То есть это нечто уже есть в системе, на чём-то написано и умеет в json. Пишешь мельчайшую прокладку (или вообще всё что в крон суешь) на том же инструменте и не превышая зависимости. PROFIT

MKuznetsov ★★★★★
()

Можно использовать jq.

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

инсталятор на баше внутрь которого был инкапсулирован архив tgz

Почти стандарт в линупсе, называется makeself.

anonymous
()

POSIX насчет JSON ничего, вроде, не говорит, но jq задачу решает железно. Да и на питоне у тебя ниче так вышло, чего ты переживаешь?

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

Оккама на тебя нет!

Наркоман? В проге на сях внутри скрипта на баше сущностей побольше будет, чем в одном #!/usr/bin/python

Deleted
()

Но скрипт на питоне внутри скрипта на баше это как-то меня смущает.

Ну так вынеси его:

#!/usr/bin/python
print "DATA=Hello"
print "WORLD=world"
TMPSTR=`./get_data.py`
eval ${TMPSTR}
echo ${DATA} ${WORLD}
Тогда всем будет легче его читать

AlexVR ★★★★★
()
Последнее исправление: AlexVR (всего исправлений: 1)
25 октября 2016 г.
Ответ на: комментарий от AlexVR

Скрипт на bash

У меня через bash команду curl получены данные на короткую ссылку с выводом в файл с именем name в формате json, все эти данные и в конце сама команда выполнения для примера -

{
 "kind": "urlshortener#url",
 "id": "https://goo.gl/f7p8",
 "longUrl": "http://samlab.ws/"
}

Помогите со скриптом именно на bash, как из этого файла вывести в переменную или в другой файл только данные строки с «id»: - "https://goo.gl/f7p8", но без кавычек, типа вот только это - https://goo.gl/f7p8? И возможно ли сразу через curl выполнить все это сразу с получением в итоге этого https://goo.gl/f7p8, и что тогда надо еще добавить в эту мою команду, там естественно введен реальный ключ вместо {Мой ключ из Goo}? -

curl https://www.googleapis.com/urlshortener/v1/url?key={Мой ключ из Goo} -H 'Content-Type: application/json' -d '{"longUrl": "http://samlab.ws/"}' > name
mixmar
()
Ответ на: комментарий от GoNaX

Извините, спасибо конечно,но я просил скрипт именно на bash, в нем нет команды python, и пример мой именно на сервис goo.gl, откуда получен такой ответ. Кстати, это только выдержка из общего моего скрипта, и в моем скрипте в начале вот это -

#/bin/sh
Есть ли какая-то разница в его выполнении со скриптом, в котором в начале вот так?
#!/bin/bash

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