wget/curl не следует перенаправлению моего URL-адреса

Только что нашел это -, и оно работает, когда проблема заключается в том, что SELinux блокирует чтение ключей ~/.ssh/authorized _во время входа в систему! Во-первых, убедитесь, что ваш файл ключей ~/.ssh/authorized _правильно заполнен, а его разрешения и разрешения для его папки установлены правильно. Если вы затем запустите «setenforce 0» на целевом хосте SSH и сможете войти на этот хост без ввода пароля, но не сможете сделать это после ввода «setenforce 1» на том же целевом хосте, следующее может решить вашу проблему:

setsebool -P use_nfs_home_dirs 1

ссылка:https://cassjohnston.wordpress.com/2015/06/12/selinux-nfs-home-directories/

0
27.01.2020, 17:30
1 ответ

Изучив html с сайта, можно увидеть, что ссылки «скачать pdf » используют метаэлемент с атрибутом http -eqiv="refresh" для перенаправления на настоящую ссылку. Хотя такие инструменты, как curlили wget, могут обрабатывать стандартные http-перенаправления , они не анализируют и не интерпретируют html и, следовательно, не могут обрабатывать этот тип перенаправления. Поскольку мы используем оболочку, одним из возможных решений является загрузка страницы с помощью curlили wgetи фильтрация html, чтобы увидеть, содержит ли она http-eqiv="refresh".


Поскольку сайт, похоже, перешел от размещения новых выпусков к доступномуhttps://www.raspberrypi.org/magpi-issues/(ничего из прошлого выпуска #86 есть ), кажется, что ваши сценарии работают в настоящее время (т.е. по сути, статическая база данных ссылок в формате PDF )становится контр-интуитивно понятной. специальный -выпуск -скрипт загрузки выглядит так же, как набор PDF-файлов, перечисленных в https://magpi.raspberrypi.org/books, за исключением того, что в скрипте отсутствуют самые последние выпуски.

Так что я попробовал сделать сценарий немного более динамичным. Он просматривает /books и /issues , чтобы узнать, что доступно/последнее. Вы можете использовать любой из них, если хотите — он использует zsh, gawkи curl:

.
#!/usr/bin/env zsh
typeset -aU standard book ignore directory
typeset all latest list_books all_books baseurl="https://magpi.raspberrypi.org/"
setopt extendedglob
function books() {
    typeset -aU books filter minus
    typeset i
    >&2 echo "getting list of available books..."
    books=( $(2>/dev/null curl -fs ${baseurl}books | gawk -v 'RS=href="' -F '"' \
                                                    '$1 ~ /^[/]books[/][^/]*[/]pdf$/{split($1,a,"/"); print "books/"a[3]}') )
    if [[ -z $books ]]
    then
        >&2 echo "unable to find any books"
        return 0
    fi
    case $1 in
        (list)
            printf '\t%s\n' $books
            return 0
            ;;
        (all)
            >&2 echo "Attempting to download all the books, this may take a while..."
            >&2 printf '\t%s\n' $books
            get_pdfs $books
            return 0
            ;;
        (*)
            for i in $@
            do
                case $i[1] in
                    (-)
                        minus+=( ${(M)books:#*${i:1}*} )
                        books=( ${books:#*${i:1}*} )
                    ;;
                    (*)
                        filter+=( ${(M)books:#*$i*} )
                    ;;
                esac
            done
            if [[ -z $filter && -n $minus ]]
            then
                filter=( ${books:|minus} )
            else
                filter=( ${filter:|minus} )
            fi
            if [[ -z $filter ]]
            then
                >&2 echo "books: no matches found (try book:list)"
                return 0
            else
                >&2 printf '\t%s\n' $filter
                get_pdfs $filter
            fi
        ;;
    esac
}
function issues() {
    typeset -aU issues
    typeset max i
    >&2 printf '%s' "finding most recent issue #..."
    if ! max=${(M)$(2>/dev/null curl -fs https://magpi.raspberrypi.org/issues | gawk -v 'RS=href="' -F '"' \
                                                                                '$1 ~ /^[/]issues.*[0-9]$/{a=$1;exit}
                                                                                END{if(a){print a} else{exit 1}}')%%[0-9]#}
    then
        >&2 echo "couldn't determine what number the latest issue is."
        return 1
    fi
    >&2 echo "it's $max"
    if [[ $1 = all ]]
    then
        >&2 echo "Attempting to download all the issues, this may take a while..."
        get_pdfs issues/{1..$max}
        return 0
    fi
    if [[ -n $latest ]]
    then
        issues+="issues/$max"
    fi
    for i in $@
    do
        if [[ $i -le $max ]]
        then
            issues+="issues/$i"
        else
            >&2 echo "issues/$i is larger than $max, ignoring"
        fi
    done
    if [[ -z $issues ]]
    then
        >&2 printf '\t%s\n' "there are no issues to download"
        return 0
    fi
    >&2 printf '\t%s\n' $issues
    get_pdfs $issues
    return 0
}
function get_pdfs() {
    typeset url i
    for i in $@
    do
        if ! url=$(2>/dev/null curl -fs "$baseurl$i/pdf" | \
            gawk -v 'RS=http-equiv="[rR]efresh".*[0-9 ;]*[uU][rR][lL]=' -F '"' \
            '$1 ~ /^http.*[.]pdf/{a=$1;exit}
            END{if(a){print a} else{exit 1}}')
        then
            >&2 echo "unable to extract url for $i"
            continue
        fi
        if [[ -e ${directory:+$directory[-1]/}${${url##*/}%%\?*} ]]
        then
            >&2 echo "looks like $i was already downloaded to ${directory:+$directory[-1]/}${${url##*/}%%\?*}"
            continue
        fi
        curl -f --create-dirs -o ${directory:+$directory[-1]/}${${url##*/}%%\?*} $url
    done
}
if ! zparseopts -D 'd:=directory'
then
    return 1
fi
if [[ -z $@ ]]
then
    >&2 printf '\t%s\n' \
        "[-d DIRECTORY]" \
        "[NUMBER]... download issue by number" \
        "[latest] download most recent issue" \
        "[all] download all issues" \
        "[book:list] list all books" \
        "[book:WORD]... download books matching WORD" \
        "[book:-WORD]... don't download books matching WORD" \
        "[book:all] download all books" \
        "... no args specified, nothing to do... exiting"
    return 0
fi
if [[ -n $directory ]]
then
    if ! mkdir -p $directory[-1]
    then
        return 1
    fi
    >&2 echo "files will be saved in $directory[-1]"
fi
for (( i=1; i<=${#@}; i++ ))
do
    case ${@[i]} in
        (all) all=all ;;            #download all standard issues
        (latest) latest=1 ;;            #download most recent issue
        (book:list) list_books=list ;;  #print a list of books
        (book:all) all_books=all ;;     #download all books
        (book:[[:alnum:]-]##) book+=( ${@[i]#*:} ) ;;   #download matching books (or books not matching if book:- is used)
        ([0-9]##) standard+=${@[i]} ;;          #download standard issue by number
        (*) ignore+=${@[i]} ;;          #tell user about unused args
    esac
done
if [[ -n $list_books || -n $all_books || -n $book ]]    #book argument was specified - get books
then
    books ${list_books:-${all_books:-$book}}
fi
if [[ -n $standard || -n $latest || -n $all ]]      #issue args - get issues
then
    issues $all $standard
fi
if [[ -n $ignore ]]
then
    >&2 printf '\t%s\n' "the following arguments were ignored:" $ignore
fi
return 0

В конце скрипта есть несколько комментариев, которые, надеюсь, поясняют использование.

  • действительные аргументы, связанные с проблемой, включают :latest, allили NUMBER— вы можете использовать расширение оболочки при вызове скрипта, чтобы указать некоторый диапазон, например. из bash/zsh, чтобы загрузить выпуски 12–15, указание {12..15}должно расширяться до номеров с 12 по 15
  • действительные аргументы, связанные с книгой, включают :book:list, book:allили book:WORDдля соответствия, book:-WORDдля исключения, например. book:{begin,-3rd}загрузит серию книг для начинающих,кроме "3-го"
  • -d DIRвозможность вывода файлов в указанный каталог
  • любая комбинация аргументов должна работать, а недопустимые аргументы игнорируются
  • не пытается возобновить загрузку, вы можете сделать это, добавив параметр -C -в последнюю команду curlв get_pdfs()и удалив continueиз теста на конфликт файлов, предшествующего этому

Возможно, я что-то упустил — используйте на свой страх и риск!


Пример «следования» перенаправлению html с помощью curl приведен выше в функцииget_pdfs():

url=$(curl -fs <url_of_document_using_html_redirect> | \
    gawk -v \
    'RS=http-equiv="[rR]efresh" *content="[0-9 ;]*[uU][rR][lL]=' \
    -F '"' \
    '/^http/{print $1;exit}')

тогда мы сможем скачать"$url"

1
29.01.2020, 07:40

Теги

Похожие вопросы