The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Уязвимость BatBadBut, затрагивающая стандартные библиотеки различных языков программирования

10.04.2024 07:36

Приложения, запускающие сценарии в формате bat и cmd на платформе Windows при помощи штатных функций запуска процессов, подвержены уязвимости, позволяющей добиться выполнения своего кода в случае передачи при запуске аргументов без отдельного экранирования спецсимволов. Уязвимость получила кодовое имя BatBadBut и проявляется в приложениях, использующих стандартные библиотеки таких языков, как Rust, PHP, Node.js, Python, Ruby, Go, Erlang и Haskell.

Проблема отмечена как уязвимость так как затрагивает функции библиотеки, такие как Command::arg и Command::args в Rust, рассчитанные на прямую передачу процессу аргументов, без их обработки командным интерпретатором. Подразумевается, что разработчик приложения может не проверять аргументы, так как они напрямую передаются запускаемому процессу. Если в Unix-системах аргументы передаются процессу по отдельности в массиве, то в Windows при использовании API CreateProcess аргументы оформляются в виде одной строки, разбор которой ложится на плечи запускаемого процесса.

При запуске bat- и cmd-сценариев на платформе Windows функция CreateProcess() неявно привлекает исполняемый файл cmd.exe, даже если приложение не указывает его при вызове. Программа cmd.exe содержит собственную сложную логику разделения аргументов для отделения собственных аргументов, запускаемого сценария и аргументов этого сценария. Для защиты от подстановки аргументов на платформе Windows в стандартных библиотеках языков программирования применяются отдельные обработчики экранирования, которые, как оказалось, можно обойти через манипуляцию с двойными кавычками.

Например, в программе, вызывающей сценарий './test.bat' с аргументом на основе полученных от пользователя данных, атакующий может передать значение '"&calc.exe', которое при запуске сценария будет развёрнуто в строку 'C:\Windows\System32\cmd.exe /c .\test.bat ""&calc.exe"' и приведёт к запуску процесса calc.exe. Метод действует и при неявном запуске сценариев, когда запускается исполняемый файл с именем "test" без указания расширения, а в одном из каталогов, упомянутых в переменной окружения PATH, присутствует файл "test.bat".

В настоящее время исправление уже выпущено (CVE-2024-24576) для стандартной библиотеки языка Rust и вошло в состав обновления Rust 1.77.2. В процессе подготовки находятся обновления с устранением уязвимости для Node.js и PHP (уже выставлены теги 8.2.18 и 8.3.5, но релизы пока не объявлены). Проекты Python, Ruby, Go, Erlang и Haskell пока ограничились внесением в документацию предупреждения о проявлении уязвимости при отсутствии должного экранирования спецсимволов.

В Rust 1.77.2 в стандартную библиотеку добавлена дополнительная проверка, возвращающая ошибку при наличии в аргументе запускаемого сценария спецсимволов, которое невозможно гарантированно безопасно экранировать. Для разработчиков, самостоятельно реализующих логику экранирования предоставлен метод CommandExt::raw_arg, полностью отключающий экранирование на стороне библиотечных вызовов.

Добавлению защиты мешает то, что простого экранирования двойных кавычек недостаточно, так как командный интерпретатор обрабатывает и раскрывает переменные, такие как "%PATH%". Например, кавычку можно подставить через манипуляцию с переменной окружения "%CMDCMDLINE%", указав вместо '"&calc.exe' - '%CMDCMDLINE:~-1%&calc.exe'.

Дополнение: Уязвимость проявляется в yt-dlp, популярном приложении для загрузки видео с Youtube.

  1. Главная ссылка к новости (https://blog.rust-lang.org/202...)
  2. OpenNews: Уязвимости в просмотрщике документов Xreader, развиваемом проектом Linux Mint
  3. OpenNews: Уязвимости в LibreOffice, позволяющие выполнить скрипт или плагин Gstreamer
  4. OpenNews: Уязвимость в сетевых библиотеках языков Rust и Go, позволяющая обойти проверку IP-адресов
  5. OpenNews: Уязвимость в пакетном менеджере Composer, допускающая компрометацию PHP-репозитория Packagist
  6. OpenNews: Опасные уязвимости в системе управления конфигурацией SaltStack
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/60964-windows
Ключевые слова: windows, exec, rust, node.ls, python, ruby, go, erlang, haskell
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (67) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Шарп (ok), 11:05, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +17 +/
    А ещё остались люди, кто серваки на винде держит?
     
     
  • 2.2, Аноним (2), 11:12, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Это будет использоваться не на серваках, совсем не на серваках.
    Вернее, подозреваю, давно используется не на серваках.
     
  • 2.3, Анон666 (?), 11:12, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • –3 +/
    В mission critical сегменте куча винды.
     
     
  • 3.6, Аноним (6), 11:24, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Прям настолько жёстком?

     
     
  • 4.65, Минона (ok), 22:59, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Не, жесткое это mission impossible.
     
  • 3.66, Аноним (-), 23:34, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > В mission critical сегменте куча винды.

    Вот только на винде бы mission critical и делать, да...

     
  • 3.67, Аноним (-), 23:42, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > В mission critical сегменте куча винды.

    Пример Йорктауна так никого ничему и не научил...

     
     
  • 4.84, Аноним (84), 07:11, 18/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    О чём речь?
     
     
  • 5.85, randomize (?), 21:01, 07/06/2024 [^] [^^] [^^^] [ответить]  
  • +/
    https://www.wired.com/1998/07/sunk-by-windows-nt/
    > The source of the problem on the Yorktown was that bad data was fed into an application running on one of the 16 computers on the LAN. The data contained a zero where it shouldn't have, and when the software attempted to divide by zero, a buffer overrun occurred -- crashing the entire network and causing the ship to lose control of its propulsion system.

    Зачем проверять данные, лол.

     
  • 2.12, Аноним (12), 11:53, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Apache c PHP 5 под 98 виндой гоняю на ретропк, наполняю базу данных через Web-морду. Одновремено захожу с IE5 и смартфона. Если система тянет, пусть живет. Уникод поддерживается, через JSON-файлы можно осуществлять экспорт на продакшен под Linux.
     
  • 2.58, Аноним (58), 19:42, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Еще осталось очень много людей, а среди них каких только нет, есть даже такие, кто серваки на винде держит.
     
  • 2.83, Аноним (83), 22:23, 15/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Печально, когда и если ещё и батнички живы... Такая махровая халтура и так долго прожила.

    Занятно. Но тоскливо.

     

  • 1.4, Аноним (4), 11:13, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +17 +/
    > Уязвимость BatBadBut, затрагивающая стандартные библиотеки различных языков программирования

    Правильный заголовок будет "Уязвимость BatBadBut, затрагивающая стандартные библиотеки различных языков программирования в Windows"

    Дело не в языках, а в супер надежной проприетарной системе (как нам завещал товарищ birdie)

     
     
  • 2.14, Аноним (-), 12:00, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • –6 +/
    > Дело не в языках, а в супер надежной проприетарной системе (как нам
    > завещал товарищ birdie)

    Как хорошо что в линуксе нет башскиптов, которые могут и рут подарить, и обфуцировать код для бекдора и даже нафиг удалить все файлы юзеров!
    Или есть?


     
     
  • 3.36, Анании.orig (?), 14:15, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +2 +/
    При чем тут скрипты вообще?
    > в Windows при использовании API CreateProcess аргументы оформляются в виде одной строки

    Зыж
    Вот взял и раст скриптами обозвал
    Да так любой экзешник можно заставить cmd.exe вызвать.

     
  • 3.43, Аноним (43), 16:05, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    И питонятины повсюду тоже нет.
     
  • 3.61, AKTEON (?), 20:48, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > линуксе нет башскиптов

    В линуксе даже и  обход антивируса gmail из коробки стоит ,бггг

     
  • 3.72, Аноним (72), 15:07, 11/04/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > башскиптов, которые могут и рут подарить

    После ввода пароля рута.

    > удалить все файлы юзеров!

    Только те, с правами которых запущен процесс. А ты хотел бы вводить пароль пользователя при создании/удалении/перемещении каждого файла? ACL и sudoers тебе в руки. Но зачем? Может, просто ставить программы пакетником и не запускать всякую дрянь с файлопомоек, как принято в Винде?

     

  • 1.5, Аноним (6), 11:18, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    >В Rust 1.77.2 в стандартную библиотеку добавлена дополнительная проверка, возвращающая ошибку при наличии в аргументе запускаемого сценария спецсимволов, которое невозможно гарантированно безопасно экранировать.

    Не понял, а что Rust ещё и в качестве интерпретатора используется?

     
     
  • 2.44, ананим.orig (?), 16:13, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > в Windows при использовании API CreateProcess аргументы оформляются в виде одной строки

    в Windows любой экзешник превращается в интерпретатор

     

  • 1.7, Аноним (-), 11:28, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Что, Fabric уже посчитали одной большой уязвимостью?
     
  • 1.8, bOOster (ok), 11:42, 10/04/2024 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • –2 +/
     
  • 1.9, Аноним (-), 11:43, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    > Проекты Python, Ruby, Go, Erlang и Haskell пока ограничились внесением в документацию предупреждения о проявлении уязвимости при отсутствии должного экранирования спецсимволов.

    Не, ну это не серьезно...
    И вообще, какое отношение виндопроблемы имеют к этому сайту?

    А уязвимость нужно переименовать в BatBadButt.

     
     
  • 2.17, Аноним (17), 12:05, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > И вообще, какое отношение виндопроблемы имеют к этому сайту?

    Rust, node.js,  Python, Ruby, Go, Erlang и Haskell уже перестали быть открытыми проектами?
    Ах да, давайте тогда прекратим публиковать новости о ядре Linux, ведь оно запускается на оборудовании с проприетарными прошивками.

     
     
  • 3.21, Аноним (-), 12:16, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > уже перестали быть открытыми проектами

    Не перестали. И?

    Проблема из новости характерна исключительно для винды.
    И это виндопроблемы мало кого интересуют.

    > тогда прекратим публиковать новости о ядре Linux, ведь оно запускается на оборудовании с проприетарными прошивками.

    Не нужно пытаться натянуть сову на глобус.

     
     
  • 4.54, Анониссимус (?), 18:09, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Почему же не интересуют. После тонны линуксовых дыр очень приятно почитать, что вантузе всё ещё хуже.
     
     
  • 5.71, Аноним (72), 15:03, 11/04/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > После тонны линуксовых дыр

    Закрытых дыр.

    > что вантузе всё ещё хуже

    И останется во веки веков.

     
  • 2.82, Аноним (82), 13:08, 12/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Для опеннета эта новость скорее характерна.
     

  • 1.10, Аноним (-), 11:48, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Для хаскеля уже есть патч.

    В списке еще забыли жабу. Они оригинально решили проблему
    Java Won’t fix

    Appendix B: Status of the affected programming languages
    flatt.tech/research/posts/batbadbut-you-cant-securely-execute-commands-on-windows/

     
     
  • 2.24, Массоны Рептилоиды (?), 12:30, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Проблемы индейцев шерива не волбуют
     

  • 1.11, Аноним (11), 11:52, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Это же не баг, а фича.
     
  • 1.25, Аноним (25), 12:34, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    >Приложения, запускающие сценарии в формате bat и cmd на платформе Windows при помощи штатных функций запуска процессов

    Столько лет - и всё одно и то же: "я разраб, мне так удобно, программа поставляется AS IS, не нравится - не используй". Это не уязвимости, это всё by design. Даже упоминания не стоит.

     
  • 1.28, n00by (ok), 13:30, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > The application doesn’t specify the file extension of the command,
    > or the file extension is .bat or .cmd

    Что бы могло сработатать, надо запускать экзешник, указав его имя без расширения. Кто и зачем мог бы такое прописать в своём коде?

     
     
  • 2.33, Аноним (-), 13:50, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    >> The application doesn’t specify the file extension of the command,
    >> or the file extension is .bat or .cmd
    > Что бы могло сработатать, надо запускать экзешник, указав его имя без расширения.
    > Кто и зачем мог бы такое прописать в своём коде?

    С другой стороны никто ж не запрещает делать так
    rm -rf /usr /lib/nvidia-current/xorg/xorg

     
     
  • 3.53, балдымалдыбар (?), 17:40, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    почему не
    rm -rf /usr /lib / nvidia-current/xorg/xorg
    ?
     
     
  • 4.62, Зазнайка (?), 21:07, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Потому-что это мем про код из бамблби (насколько помню)
     
  • 3.55, n00by (ok), 19:23, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    В Винде для запуска чего ни попадя есть ShellExecute.
     

  • 1.31, Пряник (?), 13:49, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Уже 12 часов назад вроде пофиксили в Rust 1.77.2.
     
     
  • 2.38, Аноним (38), 14:55, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А сколько там еще уязвимостей и бэкдоров не пофикшено и тихо ждут своего времени?
     
     
  • 3.39, Аноним (4), 15:55, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    В windows? За десятилетия не разгрести, но ms-индусы не спешат, и потому приходится лепить велосипеды внутри стандартных либах ЯП.
     

  • 1.32, Аноним (32), 13:50, 10/04/2024 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • –1 +/
     

  • 1.34, DiabloPC (ok), 14:00, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    В конце названия уязвимости еще одной буквы "t" не хватает
     
  • 1.37, Аноним (38), 14:53, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    >В Rust 1.77.2 в стандартную библиотеку добавлена дополнительная проверка, возвращающая ошибку при наличии в аргументе запускаемого сценария спецсимволов, которое невозможно гарантированно безопасно экранировать. Для разработчиков, самостоятельно реализующих логику экранирования предоставлен метод CommandExt::raw_arg, полностью отключающий экранирование на стороне библиотечных вызовов.

    То есть уязвимость как бы закрыта, но все равно остается возможность прострелить себе ногу. А те кто не экранировали ввод с raw_arg и с ним не будут. Вот такая она безопасность, в основном на словах.

     
     
  • 2.41, Аноним (41), 15:58, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Делаешь поехавшим безопасно - верещат про ограничения. Даёшь полный контроль - верещат, что не безопасно. Прямо агенты спецслужб, у которых отбирают сишку, в которой можно бекдоры внешне корректным кодом писать.
     
     
  • 3.51, Tron is Whistling (?), 17:09, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Это две совершенно разных категории попрыгавших.
    Причём вторая куда опаснее.
     
     
  • 4.64, Зазнайка (?), 21:09, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Может и так, но слышно их одинаково громко
     
  • 2.42, Аноним (4), 15:59, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > Вот такая она безопасность, в основном на словах.

    У microsoft в windows? Не наговаривайте - birdie нам вещал, что там нет бекдоров! Это не уязвимость, а фича. Да еще за ваши деньги.

     

  • 1.47, Xasd7 (?), 16:52, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    вот прикол!

    то есть на венде Ядро передаёт СТРОКУ в процесс а не СПИСОК_аргументов...

    и при этом -- каждая программа эту страку как хочет так и разбивает?!?! по своим правилам?!

    ВОТ СМЕХУТО!! АХАХАХА!! ща умру!

    то есть простая операция "убери первый аргумент и то что останется передай в другой следущий процесс" -- становится НЕ РЕАЛИЗУЕМОЙ по факту ВООБЩЕ! потому что возникает вопрос -- "погоди! а по каким правилам следущий процесс будет разбивать строку? по тем же самым что и мы сами тут у себя разбили?!"

    я просто валяюсь! это сделало мой день!! :-D :-D :-D

     
     
  • 2.57, n00by (ok), 19:33, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Ядро там не передаёт в процесс строку. Процесс создаётся из пространства пользователя. Ядро лишь создаёт объекты ядра (секция, основной поток).
     
     
  • 3.70, Аноним (72), 14:59, 11/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    А запуск процесса от основного потока и создание дополнительных потоков выполняется системными вызовами?
     
     
  • 4.80, n00by (ok), 12:17, 12/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Процесс никуда не запускается - в Виндос это всего лишь изолированное от остальных адресное пространство, плюс вспомогательные структуры данных. Ядро отображает в то АП образ "экзешника", а всякие аргументы командной строки заполняет поток, вызвавший CreateProcess(). Основной поток нового процесса создаётся (если утрировать) через CreateRemoteThread(). Дополнительный поток процесса создаёт основной поток, естественно, системными вызовами.
     

  • 1.48, Аноним (48), 17:04, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Зачем чинить уязвимости проявляющиеся только на венде? Да ещё если это уязвимости самой венды.
     
     
  • 2.56, Вы забыли заполнить поле Name (?), 19:27, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Чтобы было безопасно! Сейчас в моде безопасные языки, которое позволяют безопасно работать с памятью и не только. Все должно быть безопасно по умолчанию. Пользователь должен ощущать себя в безопасности. Надеюсь мой комментарий достаточно безопасно объясняет необходимость безопасности в современном небезопасном мире. Если нет, то прошу в безопасной манере описать проблему безопасности, чтобы я мог безопасно вам ответить.
     
     
  • 3.60, DiabloPC (ok), 20:23, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +7 +/
    Два чая этому господину! (Не сильно горячих, чтобы безопасно. И наливать в безопасную небьющуюсь кружку неразливайку)
     
     
  • 4.86, Bottle (?), 21:39, 13/08/2024 [^] [^^] [^^^] [ответить]  
  • +/
    И подавать механическим контроллером на Ос реального времени, написанной на Ada Spark.
     

  • 1.49, 1 (??), 17:07, 10/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > При запуске bat- и cmd-сценариев на платформе Windows функция CreateProcess() неявно привлекает исполняемый файл cmd.exe, даже если приложение не указывает его при вызове.

    В чём проблема-то ? Всё описано в мануале. Сколько раз при вызове system в *NIX это проходили ? Никто это уязвимостью не называл.

    А писать
    CreateProcess( NULL,"test", ...
    вместо
    CreateProcess( NULL,"/my/path/test.exe", ...
    такое себе ...

     
     
  • 2.59, n00by (ok), 19:50, 10/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > В чём проблема-то ? Всё описано в мануале.

    Они уже сделали такое открытие.

    In fact CreateProcess actively documents against using it this way:

        To run a batch file, you must start the command interpreter; set lpApplicationName to cmd.exe and set lpCommandLine to the following arguments: /c plus the name of the batch file.

    https://github.com/rust-lang/rust/issues/123728

     

  • 1.73, Аноним (73), 17:11, 11/04/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Господа, приведите пожалуйста пример как на С правильно обрабатывать аргументы командной строки. Как дорвусь до компьютера напишу как это делаю я — сможете раскритиковать, но напишите как правильно это делать пожалуйста.
     
     
  • 2.74, Аноним (74), 17:17, 11/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > Господа, приведите пожалуйста пример как на С правильно обрабатывать аргументы командной
    > строки. Как дорвусь до компьютера напишу как это делаю я —
    > сможете раскритиковать, но напишите как правильно это делать пожалуйста.

    man 3 getopt

     
     
  • 3.76, Аноним (73), 22:18, 11/04/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А чем getopt безопаснее? Тем более что у него только определённое применение. Разве возможно с помощью getopt обработать данные с одинаковыми названиями? Ну или если вдруг последовательность имеет значение. Более того, обрабатывает ли он в целом аргументы на такие проблемы как специальные символы?
    Насколько я вижу исходный код - вроде не похоже.
    https://codebrowser.dev/glibc/glibc/posix/getopt.c.html
     
     
  • 4.77, Аноним (74), 22:34, 11/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Поищи CVE в getopt, если тебе нужен ответ Помню пару лет назад было что-то подо... большой текст свёрнут, показать
     
     
  • 5.78, Аноним (78), 23:19, 11/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Ну вот так: echo hello & \e\c\h\o wo\rld \n
    я получу что-то такое:
    [2] 15915
    world n
    [1]   Done                    echo hello
    hello
    А вот так: echo hello \& \e\c\h\o wo\rld \n
    получается такое:
    hello & echo world n
    [2]+  Done                    echo hello
    То есть в консоле символ & почему-то не экранируется а \ экранируется как \\, но самим echo не выводится. Я в целом не С программист, но иногда использую дома и не понимаю почему символ & не экранируется? В целом в Linux та же может быть проблема при вызове system. И вот getopt мне кажется в этой проблеме никак не поможет.
     
     
  • 6.79, Аноним (74), 23:46, 11/04/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Я в целом не С программист

    тебе надо не С, а какой-нибудь учебник по юникс-лайк системам для чайников для начала. Шеллы там, пайпы, {fore,back}ground процессы, и т.д. И потом уже С.

     
  • 2.75, Аноним (73), 22:08, 11/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Как-то так:
    int main(int количествоАргументов, char *аргументы[])
    {
        if (аргументы != NULL)
        {
            for (int и=1; и < количествоАргументов; и++)
            {
                if (аргументы[и] != NULL)
                {
                    const char * аргумент = аргументы[и];
    ...
    В итоге получается warning: unsafe buffer access [-Wunsafe-buffer-usage]|
     
     
  • 3.81, n00by (ok), 12:32, 12/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > Как-то так:
    > int main(int количествоАргументов, char *аргументы[])
    > {
    >     if (аргументы != NULL)
    >     {
    >         for (int и=1; и
    > < количествоАргументов; и++)
    >         {

    А где "аргументы" могут быть NULL? Вот требование стандарта:

    If the value of argc is greater than zero, the array members argv[0] through argv[argc-1]
    inclusive shall contain pointers to strings, which are given implementation-defined values
    by the host environment prior to program startup.

     

  • 1.87, Bottle (?), 21:40, 13/08/2024 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +/
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру