curl не может читать или записывать куки из файлов, созданных командой mktemp

Вопрос или проблема

Я работаю над скриптом bash, который требует захвата куки из веб-запросов.

Что я пытаюсь достичь

  • Создать временный файл с помощью mktemp
  • Использовать curl для выполнения веб-запроса
  • Захватить все куки, установленные сервером, в этот временный файл
  • Уметь читать и использовать эти куки в последующих запросах

Мой текущий подход, который работает

COOKIE_FILE=~/cookies.txt
curl https://example.com -c "$COOKIE_FILE" -b "$COOKIE_FILE"

Подход с временным файлом (неудачен)

COOKIE_FILE=$(mktemp)
curl https://example.com -c "$COOKIE_FILE" -b "$COOKIE_FILE"

и

COOKIE_FILE=$(tempfile --mode=666)
curl https://example.com -c "$COOKIE_FILE" -b "$COOKIE_FILE"

Окружение

  • vagrantbox – ubuntu/focal64 (virtualbox, 20240821.0.1)
  • Linux ubuntu-focal 5.4.0-193-generic #213-Ubuntu SMP Пт Авг 2 19:14:16 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
  • версия curl
     curl 8.1.2 (x86_64-pc-linux-gnu) libcurl/8.1.2 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 zstd/1.4.4 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3 libgsasl/1.8.1
     Дата выпуска: 2023-05-30
     Протоколы: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
     Возможности: alt-svc AsynchDNS brotli gsasl GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL потокобезопасный TLS-SRP UnixSockets zstd
    
  • для установки этой версии curl я выполнил следующие шаги.
    sudo apt purge curl
    sudo apt autoremove
    sudo snap install curl
    

Ответ или решение

Проблема с чтением и записью файлов cookie с помощью curl и временных файлов, созданных с помощью команды mktemp, действительно может возникнуть из-за ряда причин. Давайте разберем это подробно и рассмотрим, как вы можете решить эту проблему.

Понимание задачи

Цель вашего скрипта заключается в том, чтобы:

  1. Создать временный файл для хранения cookie.
  2. С помощью curl выполнить веб-запрос к серверу.
  3. Захватить cookie, установленные сервером, и сохранить их во временный файл.
  4. Использовать эти cookie для последующих запросов.

Проблема с временным файлом

Вы указали, что использование команды mktemp приводит к проблемам с записью и чтением файлом cookie, в то время как ваш исходный подход, использующий ~/cookies.txt, работает без нареканий. Причины, по которым временные файлы могут не работать, могут быть следующими:

  1. Настройки прав доступа: Временные файлы, создаваемые mktemp, могут иметь права доступа, которые не позволяют curl записывать в них. По умолчанию mktemp создает файлы с правами пользователя, которые могут не соответствовать требованиям curl.

  2. Удаление файла: Некоторые скрипты могут настроить автоматическое удаление временных файлов сразу после выхода из контекста, что может приводить к тому, что curl не сможет записать данные, так как файл уже будет удален.

Рекомендации по исправлению

  1. Проверьте права доступа: Убедитесь, что временный файл имеет разрешения на запись для текущего пользователя. Вы можете изменить права доступа к файлу с помощью команды chmod:

    COOKIE_FILE=$(mktemp)
    chmod 666 "$COOKIE_FILE"
  2. Явно указывайте путь к временным файлам: Возможно, лучше использовать временную директорию, к которой у вас есть доступ. В Linux часто используется /tmp, и вы можете явно указать путь:

    COOKIE_FILE=$(mktemp /tmp/cookies.XXXXXX)
  3. Проверяйте, существует ли файл: Перед использованием файла проверьте, успешно ли он был создан:

    COOKIE_FILE=$(mktemp /tmp/cookies.XXXXXX)
    if [ ! -f "$COOKIE_FILE" ]; then
       echo "Не удалось создать временный файл"
       exit 1
    fi

Финальная конфигурация скрипта

Вот как ваш скрипт может выглядеть с вышеупомянутыми изменениями:

#!/bin/bash

COOKIE_FILE=$(mktemp /tmp/cookies.XXXXXX)
if [ ! -f "$COOKIE_FILE" ]; then
    echo "Не удалось создать временный файл"
    exit 1
fi

# Установите права на файл cookies
chmod 666 "$COOKIE_FILE"

# Выполнение запроса curl
curl https://example.com -c "$COOKIE_FILE" -b "$COOKIE_FILE"

# Проверьте состояние выполнения
if [ $? -ne 0 ]; then
    echo "Ошибка при выполнении curl"
    exit 1
fi

# В дальнейшем можете использовать $COOKIE_FILE для других запросов

Заключение

Использование временных файлов может быть проблематичным из-за прав доступа и других факторов. Следуя вышеуказанным рекомендациям и проверкам, вы сможете обойти эти проблемы и достичь желаемого результата в вашем скрипте. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...