Вопрос или проблема
Кто-нибудь может помочь мне с этим:
curl -sSL https://pastebin.com/raw/CHCq9VQt | bash
Я знаю, что эта команда извлечет сырой текст из pastebin (просто python --version
) и выполнит это в bash (linux)
Мне нужно что-то подобное для Windows, что, как я помню, я однажды делал. Когда я задавал этот вопрос ИИ, большинство из них сказали следующее:
curl -sSL https://pastebin.com/raw/CHCq9VQt | cmd
что ничего не дало (я ожидал, что версия python вернется):
Некоторые сказали это:
curl -sSL https://pastebin.com/raw/CHCq9VQt | cmd /C
это дало простую строку:
Я пробовал curl -sSL https://pastebin.com/raw/CHCq9VQt | cmd /C "More"
но это просто отобразило python -V
, оно не выполнилось.
Я знаю, что cmd не получает этот вывод от curl в качестве ввода, но как это решить?
Я попробовал и тоже получил ошибку. Я посмотрел решение, это обходной путь, но попробуй это
curl -sSL https://pastebin.com/raw/CHCq9VQt -o temp_script.bat && temp_script.bat && del temp_script.bat
это обходит проблему с тем, что вывод не считывается должным образом cmd, поэтому мы помещаем его во временный файл и выполняем его
Потому что файл по вашей ссылке не имеет новой строки:
$ curl -sSL https://pastebin.com/raw/CHCq9VQt | hexdump -C
00000000 70 79 74 68 6f 6e 20 2d 56 |python -V|
00000009
$ curl -sSL https://pastebin.com/raw/CHCq9VQt | wc -c
9
Как видите, V
– последний символ, нет символа CR/LF. Передача этого в cmd совершенно такая же, как если бы вы ввели команды, не нажимая Enter. Поэтому вы видите More?
на вашем первом скриншоте:
потому что cmd видит EOF без Enter для выполнения команды, поэтому он думает, что получил многострочную команду, и после этой строки все еще есть текст. Вы можете легко воспроизвести это, скачав файл, а затем выполнив type CHCq9VQt.txt | cmd
. Вы также можете увидеть такую же подсказку, когда напишите echo Some text^
, а затем Enter, потому что ^
является символом экранирования в cmd. Это точно так же, как переменная $PS2
в bash
cmd /C
вообще не работает, потому что он запускает новую оболочку с stdin с вашей клавиатуры, а не перенаправленный stdin. curl -sSL https://pastebin.com/raw/CHCq9VQt | cmd /C "More"
тоже не работает, потому что он запускает новую команду More
, которая подключается к предыдущему stdout, поэтому выводит текст из команды curl
Таким образом, правильный способ исправить это – всегда завершать текстовый файл новой строкой. POSIX даже не рассматривает файл без новой строки в конце текстового файла, и многие инструменты могут работать некорректно, такие как wc
. См. также Почему новые строки в концах файлов?
В случае если вы не можете редактировать этот файл, вы можете смягчить это, вручную введя новую строку вот так
C:\> (curl -sSL https://pastebin.com/raw/CHCq9VQt && echo.) | cmd
C:\> (type CHCq9VQt.txt && echo.) | cmd
Ответ или решение
Чтобы перенаправить вывод команды в cmd
и выполнить его в Windows, вы можете столкнуться с проблемой, связанной с отсутствием символа новой строки в конце текстового файла, получаемого через curl
. В следствии этого cmd
может ожидать ввод новой строки и не выполнять команду.
Вот шаги, чтобы правильно выполнить необходимую команду, используя curl
для получения текста и cmd
для его выполнения:
-
Загрузите скрипт в файл: Поскольку
cmd
не может выполнить команды, полученные изcurl
напрямую из-за недостатка новой строки, вы можете сначала сохранить вывод в файл и затем выполнить этот файл. Используйте следующую команду:curl -sSL https://pastebin.com/raw/CHCq9VQt -o temp_script.bat && temp_script.bat && del temp_script.bat
Здесь
-o temp_script.bat
сохраняет вывод в файлtemp_script.bat
, который затем исполняется с помощьюtemp_script.bat
, после чего файл удаляется. -
Добавление новой строки (если необходимо): Если вы не можете изменить источник, чтобы убедиться, что файл заканчивается новой строкой, вы можете добавить новою строку при выполнении команды следующим образом:
(curl -sSL https://pastebin.com/raw/CHCq9VQt && echo.) | cmd
Эта команда сначала выполняет
curl
, затем добавляет пустую строку сecho.
, что позволитcmd
завершить ввод и выполнить команду. -
Проверка содержимого файла: Вы можете проверить, что содержимое загружаемого файла действительно таково, как вы ожидаете, с помощью следующей команды:
type temp_script.bat
Это позволит вам увидеть содержимое файла перед его выполнением.
Эти шаги помогут вам правильно перенаправить выходные данные команд в Windows и успешно выполнить их. Если у вас есть доступ к изменению файла на стороне сервера (например, в Pastebin), убедитесь, что файл заканчивается символом новой строки, так как это облегчает обработку файла cmd
.