Найти определенные данные из файла и использовать в качестве переменной - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть несколько запросов POST для нескольких профилей.Следующим шагом я отправляю запрос GET, чтобы получить все созданные профили и сохранить результаты в файлы * .txt.Затем я хотел бы найти в этом файле только данные с ID и использовать его для многократного обновления (через запрос PUT) или многократного удаления для всех профилей.

#!/bin/bash
token="Authorization: Bearer 1bcXamxE5sSpT8A-7L_fJIWA"
url="http://ad44fcfa01aad11e9naws.com/api/v0.1/scanprofiles"
curl -X GET $url -H 'Content-Type: application/json' -H "$token" > get.txt

q=15

name=3_Ubuntu_internal

ports=1042

h=12
m=41
for ((i = 0; i < q; i++))
 do
    data='{"target":{"scan_type":"internal","ip_range":"10.142.0.2-10.142.0.5","ports":"'${ports}'"},"name":"'$name$i'","run_immediately":"False", "schedule": {"utc_offset": 120, "time": "'${h}':'${m}'",  "start_date": "2019-02-26T10:13:00+02:00","recurrence":{"recurrence_type": "daily","data":{"spike":"1"}}}}'
    ports=$((ports+1))
    m=$((m+1))
    if [ "${m}" -eq "60" ];
      then 
      h=$((${h}+1)) && m=41
    fi
    if [ "${h}" -eq "15" ];
      then 
      h=12
    fi
    if [ "${ports}" -eq "1238" ];
     then
     ports=1042
    fi

    echo "${data}"
    curl -X POST $url -H 'Content-Type: application/json' -H "$token" -d "$data"
 done   

просто изответ из запроса GET:

{
        "status": "ready",
        "last_run_time": "2019-02-27T10:44:34+00:00",
        "found_cert_count": 3,
        "id": "0a3c62a9-2f61-4e78-802a-2a6b31e43af8",
        "tenant_id": "840ccfeb-ee3b-451f-aaf9-7a4fe8f3cbee",
        "target": {
            "ip_range": "10.142.0.2-10.142.0.5",
            "scan_type": "internal",
            "ports": "1045"
        },
        "name": "3_Ubuntu_internal3",
        "scan_run_id": "be263639-cbaa-44e5-a249-f2c38f12c80f",
        "run_immediately": "False",
        "schedule": {
            "utc_offset": 120,
            "time": "12:41",
            "start_date": "2019-02-26T08:13:00+00:00",
            "recurrence": {
                "recurrence_type": "daily",
                "data": {}
            }
        },
        "next_run_time_utc": "2019-02-28T10:41:00+00:00"

Поэтому мне нужно получить все "id" : " 0a3c62a9-2f61-4e78-802a-2a6b31e43af8 " и использовать его(только GUID) для следующих запросов PUT или DELETE в цикле

Последний рабочий код:

  #!/bin/bash
token="Authorization: Bearer XVbusTNtmjAYFoAJQ"
url="http://us-east-1.elb.amazonaws.com/api/v0.1/profiles/"
url_run="http://us-east-1.elb.amazonaws.com/api/v0.1/profiles/run"
local="http://localhost:62183/api/v0.1/profiles/"
local_run="http://localhost:62183/api/v0.1/profiles/run"
q=10
name=New_UbuntuX
host=(15.11.38.43 15.11.49.89 15.11.188.24 15.11.19.83 15.20.155.82 15.20.14.27 15.11.14.31 15.11.14.23 15.11.19.17 15.11.29.47)
data1=""
curl -X GET $url -H 'Content-Type: application/json' -H "$token" > get.txt
id=($(sed -En '/"id"\s*:/ { s/.*"id"\s*:\s*"([^"]+)".*/\1/; p; }' get.txt)) 
printf "%s\n" "${id[@]}"
#next request should be delete all found profiles by id
for i in "${id[@]}"#I know that seems not properly correct just paste it to 
#show how I'm think that should be in there
  do
   curl -X DELETE $url"${id[@]}" -H "Content-Type: application/json" 
  done
"$token"
for ((i = 0; i < q; i++))
 do
    data='{"target": 
 {"scan_type":"external","host":"'${host[$i]}'","ports":"143- 
 184"},"name":"'$name$i'","run_immediately":"False"}'
    curl -X POST $url -H 'Content-Type: application/json' -H "$token" -d 
"$data" #create external profiles with defined host
 done
 curl -X PUT -H "Content-Type: application/json" $url_run -H "$token" -d 
"$data1" #run all profiles

1 Ответ

0 голосов
/ 28 февраля 2019

Опять же, я рекомендую настоящий анализатор JSON, но -
Во-первых, извинения.моя копия / вставка была повреждена.У него есть встроенный ^ C-break, и нет конечных паренов или кавычек.
mea culpa.

Разбивка:

id=$( sed -En '/"id"\s*:/ { s/.*"id"\s*:\s*"([^"]+)".*/\1/; p; }' get.txt )

id= - стандартное присвоение переменной.
$( ... ) запускает его содержимое и возвращает стандартный вывод, который здесь будет назначен в конструкции id=$( ... ).

Итак, давайте посмотрим на использование sed.

-Eрасширенное сопоставление с образцом, поэтому (например) мне не нужно ставить обратную косую черту в скобки, чтобы сделать их метасимволами.
-n говорит, что ничего не печатать, если я явно не запрашиваю это.

программа:

/"id"\s*:/ { ... } говорит о необходимости выполнения команд между фигурными скобками, когда строка соответствует шаблону между косыми чертами.
шаблон представляет собой литерал "id", за которым следует любойчисло (0 или более) символов пробела (\s*), за которыми следует двоеточие.

s/.*"id"\s*:\s*"([^"]+)".*/\1/; p; - список команд для запуска на совпадающих строках.
подстановка: s/<find>/<replace>/;
В этом случае это .*"id"\s*:\s*"([^"]+).*;.* соответствует любому количеству «любого» символа.Смотрите руководство для деталей.Это отбрасывает все до той части, которая нам небезразлична."id"\s*:\s*" говорит, что нужно найти "id", ноль или более пробелов, двоеточие, еще один ноль или более пробелов, за которым следует символ двойной кавычки ([^"]+) - важная часть - парены говорят, что нужно помнить, что между ними;[^"]+ означает один или несколько символов без двойных кавычек.".* выбрасывает кавычку в конце данных и любые / все завершающие символы позади них.

На этом этапе сопоставленные данные должны быть значением между кавычками, обозначенными "id":,и должен быть в storefd в \1.
Часть - это \1, поэтому вся строка должна быть обрезана до нужной вам части.

Например, p;, чтобы напечататьтеперь обрезанная строка, поэтому идентификатор должен храниться в переменной.

Убедитесь, что в ваших данных не более одного идентификатора, соответствующего этим условиям ....

РЕДАКТИРОВАТЬ

Поместить их в массив.Дублировал строку несколько раз.

$: id=( $( sed -En '/"id"\s*:/ { s/.*"id"\s*:\s*"([^"]+)".*/\1/; p; }' get.txt ) )
$: printf "[%s]\n" "${id[@]}"
[first-0a3c62a9-2f61-4e78-802a-2a6b31e43af8]
[second-0a3c62a9-2f61-4e78-802a-2a6b31e43af8]
[3rd-0a3c62a9-2f61-4e78-802a-2a6b31e43af8]
[4th-0a3c62a9-2f61-4e78-802a-2a6b31e43af8]
[5th-0a3c62a9-2f61-4e78-802a-2a6b31e43af8]
[last-0a3c62a9-2f61-4e78-802a-2a6b31e43af8]

Следующее редактирование

cf:

for i in "${id[@]}"
do  curl -X DELETE $url"${id[@]}" -H "Content-Type: application/json" 
done
"$token"

Во-первых, не так ли?получить ошибку в "$token"?
Вероятно, следует сказать что-то неопределенное, например

bash: Authorization:: command not found

Second - for i in "${id[@]}" устанавливает i для каждого id по очереди, но тогда вы никогда не используетеэто в вашей петле.Вместо этого вы используете

curl -X DELETE $url"${id[@]}" -H "Content-Type: application/json" 

, который не будет делать то, что вы хотите.

Посмотрите на этот пример:

$: x=( a b c )
$: for i in "${x[@]}"
>  do echo "Right:  id is '$i'"
>     echo "Wrong:  id is '${x[@]}'"
> done
Right:  id is 'a'
Wrong:  id is 'a b c'
Right:  id is 'b'
Wrong:  id is 'a b c'
Right:  id is 'c'
Wrong:  id is 'a b c'

То, что вы сделали, неправильноодин.Попробуйте это так:

for i in "${id[@]}"
do  curl -X DELETE "$url$i" -H "Content-Type: application/json" 
done

Это, вероятно, все еще не совсем сработает, пока вы не получите правильную авторизацию, так что ...

declare -a stdArgs=( -H "Content-Type: application/json" -H "$token" ) 
for i in "${id[@]}"
do  curl -X DELETE "$url$i" "${stdAtrgs[@]}"
done

Посмотрите, будет ли это лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...