Как перенаправить вывод команды в cmd и выполнить текст вывода?

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

Кто-нибудь может помочь мне с этим:

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 output

Некоторые сказали это:

curl -sSL https://pastebin.com/raw/CHCq9VQt | cmd /C

это дало простую строку:

curl -sSL https://pastebin.com/raw/CHCq9VQt | cmd /C output

Я пробовал 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 для его выполнения:

  1. Загрузите скрипт в файл: Поскольку 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, после чего файл удаляется.

  2. Добавление новой строки (если необходимо): Если вы не можете изменить источник, чтобы убедиться, что файл заканчивается новой строкой, вы можете добавить новою строку при выполнении команды следующим образом:

    (curl -sSL https://pastebin.com/raw/CHCq9VQt && echo.) | cmd

    Эта команда сначала выполняет curl, затем добавляет пустую строку с echo., что позволит cmd завершить ввод и выполнить команду.

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

    type temp_script.bat

    Это позволит вам увидеть содержимое файла перед его выполнением.

Эти шаги помогут вам правильно перенаправить выходные данные команд в Windows и успешно выполнить их. Если у вас есть доступ к изменению файла на стороне сервера (например, в Pastebin), убедитесь, что файл заканчивается символом новой строки, так как это облегчает обработку файла cmd.

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

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