как загрузить файл, использующий, просто колотят и ничто иное (никакое завихрение, wget, жемчуг, и т.д.)

Из fprintd страницы справочника:

fprintd-enroll [username]
и
-f finger
For fprintd-enroll, the finger to enroll

Похоже на размещение "лево-указательного пальца" как имени пользователя. и пользовательский лево-указательный палец Не Авторизовывается

43
01.08.2013, 18:52
5 ответов

Если у Вас есть удар 2.04 или выше с /dev/tcp псевдоустройство включило, можно загрузить файл с самого удара.

Вставьте следующий код непосредственно в оболочку удара (Вы не должны сохранять код в файл для выполнения):

function __wget() {
    : ${DEBUG:=0}
    local URL=$1
    local tag="Connection: close"
    local mark=0

    if [ -z "${URL}" ]; then
        printf "Usage: %s \"URL\" [e.g.: %s http://www.google.com/]" \
               "${FUNCNAME[0]}" "${FUNCNAME[0]}"
        return 1;
    fi
    read proto server path <<<$(echo ${URL//// })
    DOC=/${path// //}
    HOST=${server//:*}
    PORT=${server//*:}
    [[ x"${HOST}" == x"${PORT}" ]] && PORT=80
    [[ $DEBUG -eq 1 ]] && echo "HOST=$HOST"
    [[ $DEBUG -eq 1 ]] && echo "PORT=$PORT"
    [[ $DEBUG -eq 1 ]] && echo "DOC =$DOC"

    exec 3<>/dev/tcp/${HOST}/$PORT
    echo -en "GET ${DOC} HTTP/1.1\r\nHost: ${HOST}\r\n${tag}\r\n\r\n" >&3
    while read line; do
        [[ $mark -eq 1 ]] && echo $line
        if [[ "${line}" =~ "${tag}" ]]; then
            mark=1
        fi
    done <&3
    exec 3>&-
}

Затем можно выполнить его как от оболочки следующим образом:

__wget http://example.iana.org/

Источник: ответ Moreaki обновляющие и устанавливающие пакеты через cygwin командную строку?

Обновление: как упомянуто в комментарии, подход, обрисованный в общих чертах выше, упрощен:

  • read будут обратные косые черты мусора и ведущий пробел.
  • Bash не может иметь дело с байтами NUL очень приятно, таким образом, двоичные файлы отсутствуют.
  • неупомянутый $line будет шарик.
66
27.01.2020, 19:34
  • 1
    , Таким образом, Вы ответили на свой собственный вопрос в то же время, что и Вы спросили это. Это - интересная машина времени, у Вас есть ;) –  Meer Borg 22.07.2013, 10:59
  • 2
    @MeerBorg - когда Вы задаете вопрос, ищите поле галочки, 'отвечают на Ваш собственный вопрос' - blog.stackoverflow.com/2011/07 / … –  Chris Snow 22.07.2013, 11:08
  • 3
    @eestartup - Я не думаю, что можно голосовать за собственный ответ. Я могу объяснить код?Еще нет! Но это действительно работает над cygwin. –  Chris Snow 22.07.2013, 12:24
  • 4
    Просто примечание: Это не будет работать с некоторыми конфигурациями Bash. Я полагаю, что Debian настраивает эту функцию из их распределения Bash. –   22.07.2013, 18:57
  • 5
    Urgh, в то время как это - хороший прием, он может слишком легко вызвать поврежденные загрузки. while read как этот обратные косые черты мусора и ведущий пробел и Bash не могут иметь дело с байтами NUL очень приятно, таким образом, двоичные файлы отсутствуют. И закрыл кавычки $line будет шарик... Ни одно из этого я вижу упомянутый в ответе. –  ilkkachu 16.05.2017, 14:53

Используйте рысь.

Это довольно характерно для большей части Unix/Linux.

lynx -dump http://www.google.com

- дамп: выведите первый файл к stdout и выходу

man lynx

Или netcat:

/usr/bin/printf 'GET / \n' | nc www.google.com 80

Или telnet:

(echo 'GET /'; echo ""; sleep 1; ) | telnet www.google.com 80
20
27.01.2020, 19:34
  • 1
    OP имеет "*nix, который не имеет никаких утилит командной строки для загрузки файлов", таким образом, никакая рысь наверняка. –  Celada 25.07.2014, 17:06
  • 2
    Примечание lynx -source ближе к Большому wget –  Steven Penny 20.12.2014, 10:34

Если у Вас есть этот пакет libwww-perl

Можно просто использовать:

/usr/bin/GET
4
27.01.2020, 19:34

Вместо этого используйте загрузку через SSH с вашего локального компьютера.

«Минимальный * nix без заголовка» означает, что вы, вероятно, подключились к нему через SSH. Таким образом, вы также можете использовать SSH для загрузки в него . Что функционально эквивалентно загрузке (пакетов программного обеспечения и т. Д.) , за исключением , когда вы, конечно, хотите, чтобы команда загрузки включалась в сценарий на вашем автономном сервере.

Как показано в ответе , вы должны выполнить следующее на своем локальном компьютере, чтобы поместить файл на удаленный сервер без головы:

wget -O - http://example.com/file.zip | ssh user@host 'cat >/path/to/file.zip'

Более быстрая загрузка через SSH с третьего machine

Недостатком вышеупомянутого решения по сравнению с загрузкой является более низкая скорость передачи, поскольку соединение с вашим локальным компьютером обычно имеет гораздо меньшую пропускную способность, чем соединение между вашим автономным сервером и другими серверами.

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

Для безопасности скопируйте и вставьте эту команду , включая начальный пробел '' . Причину см. В объяснениях ниже.

 ssh user@intermediate-host "sshpass -f <(printf '%s\n' yourpassword) \
   ssh -T -e none \
     -o StrictHostKeyChecking=no \
     < <(wget -O - http://example.com/input-file.zip) \
     user@target-host \
     'cat >/path/to/output-file.zip' \
"

Пояснения:

  • Команда отправит ssh на ваш третий компьютер промежуточный хост , начнет загрузку файла на него через wget и начнет загрузку его на цель -host через SSH.Загрузка и выгрузка используют полосу пропускания вашего промежуточного хоста и происходят одновременно (из-за эквивалентов канала Bash), поэтому прогресс будет быстрым.

  • При использовании вам необходимо заменить два входа на сервер ( user @ * - host ), пароль целевого хоста ( yourpassword ), URL-адрес загрузки ( http://example.com/…) и выходной путь на вашем целевом хосте ( /path/to/output-file.zip ) с соответствующими собственными значениями.

  • Чтобы узнать о параметрах -T -e none SSH при его использовании для передачи файлов, см. эти подробные объяснения .

  • Эта команда предназначена для случаев, когда вы не можете использовать механизм аутентификации с открытым ключом SSH - это все еще происходит с некоторыми поставщиками общего хостинга, в частности, с Host Europe . Чтобы автоматизировать процесс, мы полагаемся на sshpass , чтобы иметь возможность указать пароль в команде. Для этого требуется, чтобы на промежуточном хосте был установлен sshpass ( sudo apt-get install sshpass в Ubuntu).

  • Мы пытаемся использовать sshpass безопасным способом, но он все равно не будет таким безопасным, как механизм открытого ключа SSH (говорит man sshpass ). В частности, мы предоставляем пароль SSH не как аргумент командной строки, а через файл, который заменяется подстановкой процесса bash, чтобы убедиться, что он никогда не существует на диске. printf является встроенным в bash, поэтому эта часть кода не всплывает в виде отдельной команды в выводе ps , так как при этом будет открыт источник пароля [ ].Я думаю , что использование sshpass так же безопасно, как и вариант sshpass -d , рекомендованный в man sshpass , потому что bash в любом случае внутренне отображает его в такой файловый дескриптор / dev / fd / * . И это без использования временного файла [ источник ]. Но никаких гарантий, может я что-то пропустил.

  • Опять же, чтобы сделать использование sshpass безопасным, нам нужно предотвратить запись команды в историю bash на вашем локальном компьютере. Для этого перед всей командой ставится один пробел, который имеет такой эффект.

  • Часть -o StrictHostKeyChecking = no предотвращает сбой команды в случае, если она никогда не подключалась к целевому хосту. (Обычно SSH затем ожидает ввода пользователя для подтверждения попытки подключения. Мы все равно заставляем его продолжить.)

  • sshpass ожидает команды ssh или scp в качестве своей последний аргумент. Итак, мы должны переписать типичный wget -O -… | ssh… в форму без канала bash, как описано здесь .

4
27.01.2020, 19:34

На основе рецепта @Chris Snow. Я сделал несколько улучшений:

  • проверка схемы http (она поддерживает только http)
  • проверка ответа http (проверка строки состояния ответа и разделение заголовка и тела строкой '\r\n', а не 'Connection: close', которая иногда не соответствует действительности)
  • ошибка на не-200 коде (важно скачивать файлы из интернета)

Вот код:

function __wget() {
    : ${DEBUG:=0}
    local URL=$1
    local tag="Connection: close"

    if [ -z "${URL}" ]; then
        printf "Usage: %s \"URL\" [e.g.: %s http://www.google.com/]" \
               "${FUNCNAME[0]}" "${FUNCNAME[0]}"
        return 1;
    fi  
    read proto server path <<<$(echo ${URL//// })
    local SCHEME=${proto//:*}
    local PATH=/${path// //} 
    local HOST=${server//:*}
    local PORT=${server//*:}
    if [[ "$SCHEME" != "http" ]]; then
        printf "sorry, %s only support http\n" "${FUNCNAME[0]}"
        return 1
    fi  
    [[ x"${HOST}" == x"${PORT}" ]] && PORT=80
    [[ $DEBUG -eq 1 ]] && echo "SCHEME=$SCHEME" >&2
    [[ $DEBUG -eq 1 ]] && echo "HOST=$HOST" >&2
    [[ $DEBUG -eq 1 ]] && echo "PORT=$PORT" >&2
    [[ $DEBUG -eq 1 ]] && echo "PATH=$PATH" >&2

    exec 3<>/dev/tcp/${HOST}/$PORT
    if [ $? -ne 0 ]; then
        return $?
    fi  
    echo -en "GET ${PATH} HTTP/1.1\r\nHost: ${HOST}\r\n${tag}\r\n\r\n" >&3
    if [ $? -ne 0 ]; then
        return $?
    fi  
    # 0: at begin, before reading http response
    # 1: reading header
    # 2: reading body
    local state=0
    local num=0
    local code=0
    while read line; do
        num=$(($num + 1))
        # check http code
        if [ $state -eq 0 ]; then
            if [ $num -eq 1 ]; then
                if [[ $line =~ ^HTTP/1\.[01][[:space:]]([0-9]{3}).*$ ]]; then
                    code="${BASH_REMATCH[1]}"
                    if [[ "$code" != "200" ]]; then
                        printf "failed to wget '%s', code is not 200 (%s)\n" "$URL" "$code"
                        exec 3>&-
                        return 1
                    fi
                    state=1
                else
                    printf "invalid http response from '%s'" "$URL"
                    exec 3>&-
                    return 1
                fi
            fi
        elif [ $state -eq 1 ]; then
            if [[ "$line" == $'\r' ]]; then
                # found "\r\n"
                state=2
            fi
        elif [ $state -eq 2 ]; then
            # redirect body to stdout
            # TODO: any way to pipe data directly to stdout?
            echo "$line"
        fi
    done <&3
    exec 3>&-
}
5
27.01.2020, 19:34

Теги

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