У меня есть минимальный обезглавленный * nix, который не имеет никаких утилит командной строки для загрузки файлов (например, без curl, wget и т. Д.). У меня есть только Bash.
Как я могу скачать файл?
В идеале мне бы хотелось, чтобы решение работало с широким спектром * nix.
bash
command-line
web
Крис Сноу
источник
источник
gawk
Ответы:
Если у вас установлен bash 2.04 или выше с
/dev/tcp
включенным псевдоустройством, вы можете загрузить файл из самого bash.Вставьте следующий код непосредственно в оболочку bash (вам не нужно сохранять код в файле для выполнения):
Затем вы можете выполнить его как из оболочки следующим образом:
Источник: ответ Мореаки об обновлении и установке пакетов через командную строку cygwin?
Обновление: как упомянуто в комментарии, изложенный выше подход упрощен:
read
воля громит и обратные слэши ведущие пробелы.$line
будет шар.источник
while read
например, он удаляет обратную косую черту и ведущие пробелы, и Bash не может иметь дело с байтами NUL, поэтому двоичные файлы отсутствуют. И без кавычек$line
будет глобус ... Ничего из этого я не упомянул в ответе.Используйте рысь.
Это довольно распространено для большинства Unix / Linux.
-dump: выгрузить первый файл в стандартный вывод и выйти
Или netcat:
Или телнет:
источник
lynx -source
ближе к WgetАдаптировано из ответа Криса Сноу. Это также может обрабатывать двоичные файлы передачи.
Вы можете проверить двоичные файлы, как это
источник
cat
. Я не уверен, что это обман (так как это не просто оболочка) или хорошее решение (такcat
как это стандартный инструмент, в конце концов). Но @ 131, вы можете добавить примечание о том, почему он работает лучше, чем другие решения здесь.Строго говоря, « просто Bash и ничего больше », вот одна адаптация более ранних ответов ( @ Chris's , @ 131's ), которая не вызывает никаких внешних утилит (даже стандартных), но также работает с двоичными файлами:
Используйте с
download http://path/to/file > file
.Мы имеем дело с NUL байтами
read -d ''
. Он читает до байта NUL и возвращает true, если он нашел, и false, если нет. Bash не может обрабатывать NUL-байты в строках, поэтому, когдаread
возвращается с true, мы добавляем NUL-байт вручную при печати, а когда он возвращает false, мы знаем, что больше нет NUL-байтов, и это должно быть последним фрагментом данных. ,Испытано с Bash 4.4 на файлах с NULs в середине, и заканчивается в ноль, один или два NULs, а также с
wget
иcurl
двоичные файлы из Debian.wget
Загрузка двоичного файла объемом 373 КБ заняла около 5,7 секунд. Скорость около 65 кБ / с или чуть больше 512 кб / с.Для сравнения, решение @ 131 для cat завершается менее чем за 0,1 с, или почти в сто раз быстрее. Не очень удивительно, правда.
Это, очевидно, глупо, поскольку без использования внешних утилит мы мало что можем сделать с загруженным файлом, даже не сделать его исполняемым.
источник
echo
и вprintf
качестве встроенных команд (требуется встроенная командаprintf
для реализацииprintf -v
)Если у вас есть этот пакет libwww-perl
Вы можете просто использовать:
источник
lynx
решение, так как Perl, несомненно, с большей вероятностью будет предустановлен, чем Lynx.Вместо этого используйте загрузку через SSH с вашего локального компьютера.
Поле «минимальный безглавый * nix» означает, что вы, вероятно, используете SSH. Таким образом, вы также можете использовать SSH для загрузки на него. Что функционально эквивалентно загрузке (пакетов программного обеспечения и т. Д.), За исключением случаев, когда вы хотите, чтобы команда загрузки включалась в сценарий на вашем автономном сервере.
Как показано в этом ответе , вы должны выполнить следующую команду на своем локальном компьютере, чтобы разместить файл на вашем удаленном автономном сервере:
Быстрая загрузка через SSH с третьего компьютера
Недостатком вышеупомянутого решения по сравнению с загрузкой является более низкая скорость передачи, поскольку соединение с вашим локальным компьютером обычно имеет гораздо меньшую пропускную способность, чем соединение между вашим автономным сервером и другими серверами.
Чтобы решить эту проблему, вы, конечно, можете выполнить вышеуказанную команду на другом сервере с достаточной пропускной способностью. Чтобы сделать это более удобным (избегая ручного входа в систему на третьей машине), вот команда, которую нужно выполнить на вашей локальной машине .
Чтобы быть в безопасности, скопируйте и вставьте эту команду, включая начальный пробел
' '
. Смотрите объяснения ниже по причине.Пояснения:
Команда отправит ssh на вашу третью машину
intermediate-host
, начнет скачивать туда файл черезwget
и начнет загружать егоtarget-host
через SSH. Загрузка и выгрузка используют вашу пропускную способностьintermediate-host
и происходят одновременно (из-за эквивалентов канала 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 pubkey (говоритman sshpass
). В частности, мы предоставляем пароль SSH не в качестве аргумента командной строки, а через файл, который заменяется заменой процесса bash, чтобы убедиться, что он никогда не существует на диске. Этоprintf
встроенный bash, гарантирующий, что эта часть кода неps
будет отображаться как отдельная команда при выводе, так как это предоставит пароль [ source ]. Я думаю, что это использованиеsshpass
так же безопасно, как иsshpass -d<file-descriptor>
рекомендуемый вариантman sshpass
, потому что bash в/dev/fd/*
любом случае сопоставляет его внутренне с таким файловым дескриптором. И это без использования временного файла [ источник]. Но никаких гарантий, может я что-то упустил.Опять же, чтобы сделать
sshpass
использование безопасным, нам нужно запретить запись команды в историю bash на вашем локальном компьютере. Для этого всей команде добавляется один пробел, который имеет этот эффект.Эта
-o StrictHostKeyChecking=no
часть предотвращает сбой команды в случае, если она никогда не подключалась к целевому хосту. (Обычно SSH будет ожидать ввода данных от пользователя для подтверждения попытки подключения. Мы все равно продолжаем.)sshpass
ожидает командуssh
или вscp
качестве последнего аргумента. Таким образом, мы должны переписать типичнуюwget -O - … | ssh …
команду в форму без канала bash, как описано здесь .источник
По рецепту @Chris Snow. Я сделал некоторые улучшения:
Вот код:
источник
echo -en "GET ${PATH} HTTP/1.1\r\nHost: ${HOST}\r\n${tag}\r\n\r\n" >&3
,${tag}
не уточняется.tag
переменной, правильно установлен, теперь он работает хорошо.