cURL Bash сохранить тело ответа в файл - PullRequest
0 голосов
/ 30 июня 2019

Я создал create curl в bash, и здесь я хочу сохранить файл в виде журнала с вызовом функции save_log(), но когда я открыл txt-файл, он просто показывает, что выполняется только при , а Код заголовка и Тело ответа пусто (пусто)

вот мой скрипт:

SECRET_KEY='lolz'
FILE_NAME="test.txt"


function save_log()
{
  printf '%s\n' \
    "Header Code  : $1" \
    "Executed at  : $(date)" \
    "Response Body  : $2" \
    "====================================================================================================="$'\r\n\n'  >> output.log
}

# while IFS= read -r line; do
while IFS= read -r line || [[ -n "$line" ]]; 
    do
      HTTP_RESPONSE=$(curl -L -w "HTTPSTATUS:%{http_code}" -H "X-Gitlab-Event: Push Hook" -H 'X-Gitlab-Token: '$SECRET_KEY --insecure $line 2>&1) &
      HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g') &
      HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://') &
      echo $HTTP_RESPONSE
      save_log "$HTTP_STATUS" "$HTTP_BODY" &
done < $FILE_NAME

и вот вывод

    Header Code  : 
    Executed at  : Mon Jul 1 07:01:40 WIB 2019
    Response Body  : 
    =====================================================================================================

Кто-нибудь может мне помочь?

1 Ответ

3 голосов
/ 30 июня 2019

Просто удалите оператор управления &, который заставляет ваши команды выполняться в фоновом режиме и асинхронно из вашего собственного потока управления сценарием.

Это приведет к тому, что ваша функция save_log() будет вызываться без аргументов (потому что они находятся в фоновом режиме и, вероятно, даже не завершили, когда вы вызвали save_log()).

Я протестировал, и это работает (я не знал, какие URL у вас были в вашем FILE_NAME, поэтому я просто добавил несколько случайных URL):

SECRET_KEY='lolz'
FILE_NAME="test.txt"


function save_log()
{
  printf '%s\n' \
    "Header Code  : $1" \
    "Executed at  : $(date)" \
    "Response Body  : $2" \
    "====================================================================================================="$'\r\n\n'  >> output.log
}

# while IFS= read -r line; do
while IFS= read -r line || [[ -n "$line" ]]; 
    do
      HTTP_RESPONSE=$(curl -L -w "HTTPSTATUS:%{http_code}" -H "X-Gitlab-Event: Push Hook" -H 'X-Gitlab-Token: '$SECRET_KEY --insecure $line 2>&1)
      HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g')
      HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
      echo $HTTP_RESPONSE
      save_log "$HTTP_STATUS" "$HTTP_BODY"
done < $FILE_NAME

Выход:

Header Code  : 200
Executed at  : Sun Jun 30 18:05:12 UTC 2019
Response Body  : <!DOCTYPE html> (...)
...