Bash-скрипты, часть 3: параметры и ключи командной строки

Запуск полной командной строки через PsExec

Да, мы только что показали вам все эти примеры того, как выполнить одну команду через PsExec… и оказалось, что вы можете запустить полную оболочку на локальном компьютере, которая фактически работает на удаленном компьютере. Это как если бы вы были на консоли этого сервера (по большей части). И, к счастью, синтаксис для этого очень прост (добавьте имя пользователя, если вам нужно).

После этого у вас будет командная строка, которая теперь запущена на удаленном ПК.

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

Стоит отметить, что если вы хотите запускать команды PowerShell удаленно на другом компьютере , вы можете сделать это изначально с некоторыми изменениями конфигурации. К сожалению, PowerShell не очень хорошо работает с PsExec, если вы не используете кучу странных обходных путей, которые не стоят.

Другие опции

У команды psexec есть множество других действительно полезных опций, которые вы можете использовать — каждый из них будет использоваться в пробеле сразу после \\ computername и перед любой из других команд. Так что подумайте: psexec \\ computername -option <удаленная команда>.

Если вы просто запустите команду psexec из командной строки без каких-либо дополнительных ключей, вы увидите их все.

Явное связывание с библиотекой DLL

Чтобы использовать библиотеку DLL посредством явного связывания, необходимо вызвать функцию для явной загрузки библиотеки DLL во время выполнения. Для явного связывания с библиотекой DLL приложение должно выполнить следующие действия:

  • Вызвать LoadLibraryEx или аналогичную функцию для загрузки библиотеки DLL и получения дескриптора модуля.

  • Вызвать GetProcAddress, чтобы получить указатель для каждой экспортированной функции, которую вызывает приложение. Поскольку приложения вызывают функции DLL с помощью указателя, компилятор не создает внешние ссылки и нет необходимости связываться с библиотекой импорта. Тем не менее необходимо использовать инструкцию или , определяющую сигнатуру вызова для вызываемых экспортированных функций.

  • По завершении работы с библиотекой DLL вызовите FreeLibrary.

В приведенном ниже примере функции вызывается для загрузки библиотеки MyDLL, затем вызывается для получения указателя на функцию DLLFunc1, далее вызывается эта функция и сохраняется результат, после чего вызывается для выгрузки библиотеки DLL.

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

Это особенно важно, если вы планируете многократно вызывать функции в библиотеке DLL

Не удается установить средство .NET

Установка глобального или локального средства .NET может завершиться сбоем по ряду причин. Если при установке средства происходит сбой, появляется примерно следующее сообщение:

Помимо предыдущего сообщения, пользователю также выводятся сообщения NuGet, помогающие диагностировать эти сбои. Сообщение NuGet может помочь определить причину проблемы.

Изменение имен пакетов

Корпорация Майкрософт изменила правила в отношении идентификаторов пакетов для средств, из-за чего некоторые средства теперь невозможно найти по прежним именам. Согласно новым правилам имена средств Майкрософт должны иметь префикс «Microsoft.». Этот префикс зарезервирован и может использоваться только для пакетов, подписанных с помощью авторизованного сертификата Майкрософт.

Во время перехода некоторые средства Майкрософт будут иметь старую форму идентификатора пакета, а другие — новую форму:

По мере обновления идентификаторов пакетов необходимо будет перейти на новый идентификатор, чтобы получить последние обновления. Пакеты с упрощенными именами средств станут нерекомендуемыми.

Предварительные выпуски

Вы пытаетесь установить предварительный выпуск и не использовали параметр —version для указания версии.

Если средство .NET находится на стадии предварительной версии, это должно быть указано в части имени. Указывать предварительную версию полностью не нужно. Если номера версий имеют ожидаемый формат, можно использовать нечто подобное:

Пакет не является средством .NET

Пакет NuGet с таким именем найден, но не является средством .NET.

При попытке установить пакет NuGet, который является обычным пакетом NuGet, а не средством .NET, вы увидите такое сообщение об ошибке:

Веб-канал NuGet недоступен

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

Для установки средства требуется доступ к веб-каналу NuGet, содержащему пакет средства. Установка завершается сбоем, если этот веб-канал недоступен. Вы можете изменить веб-каналы с помощью , запросить определенный файл или указать дополнительные веб-каналы с помощью параметра . По умолчанию NuGet выдает ошибку для каждого веб-канала, к которому не удается подключиться. Флаг позволяет пропускать недоступные источники.

Неправильный идентификатор пакета

Вы неправильно ввели имя средства.

Распространенной причиной ошибок является неправильное имя средства. Такое может случаться из-за ошибок при вводе или из-за того, что средство было перемещено либо устарело. Если средство размещено на сайте NuGet.org, один из способов гарантировать правильность имени — выполнить поиск средства на сайте NuGet.org и скопировать команду установки.

401 (не санкционировано)

Скорее всего, вы указали альтернативный канал NuGet, и этот канал требует проверки подлинности. Вот несколько разных способов решить проблему:

  • Добавьте параметр , чтобы обойти ошибку из закрытого канала и использовать общедоступный канал Майкрософт.

    Если вы устанавливаете средство из канала Microsoft NuGet, пользовательский канал возвращает эту ошибку, прежде чем канал Microsoft NuGet вернет результат. Ошибка завершает запрос, отменяя любые другие ожидающие запросы канала, который может быть каналом Microsoft NuGet. Добавление параметра приводит к тому, что команда обрабатывает эту ошибку как предупреждение и позволяет другим каналам обработать запрос.

  • Принудительно используйте канал Microsoft NuGet с параметром .

    Возможно, в глобальном или локальном файле конфигурации NuGet отсутствует общедоступный канал Microsoft NuGet. Используйте сочетание параметров и , чтобы избежать ошибочного канала и использовать общедоступный веб-канал Майкрософт.

  • Используйте настраиваемую конфигурацию NuGet, параметр .

    Создайте локальный файл nuget.config, используя только общедоступный веб-канал Microsoft NuGet, и сошлитесь на него с помощью параметра :

    Пример файла конфигурации:

    Дополнительные сведения см. в справочнике по файлу nuget.config.

  • Добавьте необходимые учетные данные в файл конфигурации.

    Если пакет точно существует в настроенном веб-канале, укажите учетные данные для входа в файле конфигурации NuGet. Дополнительные сведения об учетных данных в файле конфигурации NuGet см. в .

Рекомендации для администраторов

Поведение установщика может отличаться в зависимости от того, выполняется ли winget с правами администратора.

  • При запуске winget без прав администратора для установки некоторых приложения может потребоваться повышение уровня прав. При запуске установщика Windows предложит вам повысить уровень права. Если вы откажетесь, приложение не будет установлено.

  • При запуске winget в командной строке администратора запросы на повышение прав до необходимого приложению уровня не отображаются. Будьте осторожны при запуске командной строки от имени администратора и устанавливайте только приложения, которым доверяете.

PsLogList

Эта утилита отображает локальный или удаленный журнал событий в командной строке, и существует ряд опций, которые можно использовать для фильтрации данных.

Есть также опции -h, -d и -m, которые позволяют сузить список событий до последних x часов, дней или минут. Опция -n отображает список записей x, а ключ -r меняет порядок, поэтому самые последние записи будут в нижней части вывода. Последний параметр, который мы установили в этом примере как «Система», на самом деле не нужен — если вы его опустите, системный журнал всегда будет извлечен, но вы можете изменить его на «Приложение» или «Безопасность», чтобы вместо этого получать эти журналы.

Стоит отметить, что если у вас есть доступ администратора к другому компьютеру, вы можете просто открыть Event Viewer и выбрать Connect из меню Action. Введите имя компьютера в списке, измените учетные данные, если вам нужно, и получите доступ к журналам событий таким образом.

Единственный сценарий, в котором мы действительно можем увидеть, что PsLogList действительно полезен, — это если вы хотите написать сценарий для выполнения действия в случае определенных сообщений в журнале событий.

Исправление ошибок DLL

DLL-файлы из-за того, сколько их существует и как часто они используются, как правило, находятся в центре большого процента ошибок, возникающих при запуске, использовании и завершении работы Windows.

Хотя может быть просто нужно загрузить этот отсутствующий или не найденный файл DLL, – это редко лучший способ. В целом, мы противники загрузки отдельных DLL-файлов, но это тема для отдельной статьи. В качестве примера можете почитать: инъекция кода в систему Windows – как это осуществляется.

Если вы получили ошибку DLL, лучше всего найти информацию об устранении неполадок, относящуюся к этой проблеме DLL, чтобы решить её правильно и навсегда. Например: руководство по устранению ошибок с файлом Mfc110u.dll в Windows

Необходимость аргументов командной строки

Как вы узнали из урока «0.4 – Введение в разработку на C++», при компиляции и компоновке программы на выходе получается исполняемый файл. Когда программа запускается, выполнение начинается с функции . До этого момента мы объявляли следующим образом:

Обратите внимание, что эта версия не принимает параметров. Однако для работы со многими программами требуются какие-то входные данные

Например, предположим, что вы пишете программу под названием Thumbnail, которая считывает файл изображения, а затем создает миниатюру (уменьшенную версию этого изображения). Как Thumbnail узнает, какое изображение прочитать и обработать? Пользователь должен каким-то образом указать программе, какой файл открыть. Для этого вы можете использовать следующий подход:

Однако при таком подходе есть потенциальная проблема. Каждый раз, когда программа запускается, она будет ждать, пока пользователь введет данные. Это может не быть проблемой, если вы запускаете эту программу один раз вручную из командной строки. Но это проблематично в других случаях, например, когда вы хотите запустить эту программу для многих файлов или запустить ее другой программой.

Давайте рассмотрим эти случаи подробнее.

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

Теперь рассмотрим случай, когда вы запускаете веб-сайт и хотите, чтобы на вашем сайте создавался эскиз каждый раз, когда пользователь загружает изображение на ваш сайт. Эта программа не настроена для приема входных данных из Интернета, так как же человек, загружающий файл, будет вводить имя файла в этом случае? Хорошим решением здесь было бы, чтобы ваш веб-сервер автоматически вызывал Thumbnail после загрузки.

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

Аргументы командной строки – это необязательные строковые аргументы, которые операционная система передает программе при ее запуске. Затем программа может использовать их в качестве входных данных (или игнорировать). Подобно параметрам функции, которые позволяют функции предоставлять входные данные для другой функции, аргументы командной строки позволяют людям или программам предоставлять входные данные программе.

Запуск из обозревателя файлов

Обычно ярлыки для установленных оболочек помещаются в папку меню «Пуск» для Visual Studio, например в %ProgramData%\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019\Visual Studio Tools. Но если поиск командной строки не дает ожидаемых результатов, попробуйте вручную найти нужные файлы на компьютере.

Командная строка разработчика

Выполните поиск файла командной строки (VsDevCmd.bat) или перейдите в папку «Инструменты» Visual Studio ( %ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\Common7\Tools — путь зависит от версии Visual Studio, выпуска и расположения установки).

Когда вы найдете файл командной строки, откройте его. Для этого введите следующую команду в стандартном окне командной строки:

Кроме того, вы можете ввести следующую команду в диалоговом окне Windows Выполнить:

Dica

Вам необходимо изменить путь в соответствии с расположением установки Visual Studio.

PowerShell для разработчиков

Найдите файл скрипта PowerShell с именем Launch-VsDevShell.ps1 или перейдите в папку «Инструменты» Visual Studio ( %ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\Common7\Tools). Путь зависит от версии, выпуска и расположения установки Visual Studio. После этого выполните следующую команду в командной строке Windows PowerShell или PowerShell 6:

По умолчанию PowerShell для разработчиков запускается с конфигурацией для той версии Visual Studio, путь установки к которой указан в файле Launch-VsDevShell.ps1.

Dica

Чтобы выполнить cmdlet, нужно задать политику выполнения.

Не спеша, эффективно и правильно – путь разработки. Часть 3. Практика

Черновой вариант книги Никиты Зайцева, a.k.a.WildHare. Разработкой на платформе 1С автор занимается с 1996-го года, специализация — большие и по-хорошему страшные системы. Квалификация “Эксперт”, несколько успешных проектов класса “сверхтяжелая”. Успешные проекты ЦКТП. Четыре года работал в самой “1С”, из них два с половиной архитектором и ведущим разработчиком облачной Технологии 1cFresh. Ну — и так далее. Не хвастовства ради, а понимания для. Текст написан не фантазером-теоретиком, а экспертом, у которого за плечами почти двадцать три года инженерной практики на больших проектах.

Windows PowerShell — удаление программ

Помимо командной строки, в операционную систему Windows встроен более мощный инструмент — PowerShell. Выполнение задачи по деинсталляции происходит подобным образом при помощи других команд.

Пройдите следующие шаги:

  1. Запустите Windows PowerShell от имени администратора.
  2. В окне системного средства выполните команду:
Get-WmiObject Win32_Product | ft name,version,vendor,packagename
  1. После выполнения команды, в окне оболочки отобразятся установленные на ПК приложения.
  1. Выполните следующую команду:
(Get-WmiObject Win32_Product -Filter "Name = 'XXX'").Uninstall()

'XXX' — имя программы в одинарных кавычках, находящееся в конструкции с двойными кавычками.
  1. Дождитесь завершения операции по удалению программы.

Как удалить программу через командную строку

В Windows удаление программы из командной строки занимает не так много времени, и это — не сложная операция даже для неопытных пользователей. Необходимо выполнить лишь пару команд.

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

  1. Запустите командную строку от имени администратора.
  2. В окне интерпретатора командной строки введите команду, а затем нажмите на клавишу «Enter»:
wmic product get name
  1. Через некоторое время, в окне консоли появится список установленных приложений.
  1. Чтобы запустить удаление программ из командной строки, необходимо выполнить следующую команду:
wmic product where name="XXX" call uninstall /nointeractive

"XXX" — имя программы, заключенное в двойных кавычках, так как оно отображается в командной строке.

/nointeractive — параметр для немедленного запуска удаления программы, без вызова дополнительных шагов.
  1. После завершения удаления приложения в окне интерпретатора командной строки отобразится информация о завершении этой операции.

Операционная система анализирует аргументы командной строки первой

Когда вы вводите что-то в командной строке (или запускаете свою программу из IDE), операционная система должна преобразовать и направить этот запрос соответствующим образом. Это не только включает в себя запуск исполняемого файла, но также включает анализ любых аргументов, чтобы определить, как они должны обрабатываться и передаваться приложению.

Как правило, в операционных системах действуют особые правила обработки специальных символов, таких как двойные кавычки и обратный слеш.

Например:

печатает:

Обычно строки, переданные в двойных кавычках, считаются частью одной строки:

печатает:

Если вы хотите включить двойную кавычку в состав строки, вам нужно поставить перед двойной кавычкой обратный слеш:

печатает:

Передача аргументов командной строки

Исполняемые программы можно запускать из командной строки, вызывая их по имени. Например, чтобы запустить исполняемый файл «WordCount«, который находится в корневом каталоге диска C: на компьютере с Windows, вы можете ввести:

Чтобы передать аргументы командной строки в WordCount, мы просто перечисляем их после имени исполняемого файла:

Теперь при выполнении WordCount Myfile.txt будет предоставлен в качестве аргумента командной строки. Программа может иметь несколько аргументов командной строки, разделенных пробелами:

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

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

В Microsoft Visual Studio кликните правой кнопкой мыши на своем проекте в обозревателе решений и выберите «Свойства» (Properties). В открывшемся окне разверните дерево «Свойства конфигурации» (Configuration Properties) и выберите «Отладка» (Debugging). На правой панели есть строка с названием «Аргументы команды» (Command Arguments). Вы можете ввести туда аргументы командной строки для тестирования, и они будут автоматически переданы вашей программе при ее запуске.

Рисунок 1 – Задание аргументов командной строки в Microsoft Visual Studio

В Code::Blocks выберите «Project» (Проект) → «Set program’s arguments» (Установить аргументы программы).

Рисунок 2 – Задание аргументов командной строки в Code::Blocks

Параметры

хинстдлл

Маркер модуля DLL. Значение является базовым адресом библиотеки DLL. Значение HINSTANCE библиотеки DLL совпадает с хмодуле библиотеки DLL, поэтому хинстдлл может использоваться в вызовах функций, для которых требуется обработчик модуля.

фдвреасон

Код причины, указывающий, почему вызывается функция точки входа DLL. Этот параметр может принимать одно из указанных ниже значений.

Значение
Значение

Библиотека DLL _ _Присоединение процесса 1
Библиотека DLL загружается в виртуальное адресное пространство текущего процесса в результате запуска процесса или в результате вызова LoadLibrary. Библиотеки DLL могут использовать эту возможность для инициализации любых данных экземпляра или использования функции TlsAlloc для выделения индекса локального хранилища потока (TLS). Параметр lpReserved указывает, загружается ли библиотека DLL статически или динамически.

Библиотека DLL _ _Отключить процесс
Библиотека DLL выгружается из виртуального адресного пространства вызывающего процесса, так как она была загружена неудачно или значение счетчика ссылок достигло нуля (процессы либо прерываются, либо произошел один раз для каждого времени , именуемого LoadLibrary). Параметр lpReserved указывает, выгружается ли библиотека DLL в результате вызова FreeLibrary , сбоя загрузки или завершения процесса. Библиотека DLL может использовать эту возможность для вызова функции TlsFree , чтобы освободить все индексы TLS, выделенные с помощью функции TlsAlloc , и освободить локальные данные потока

Обратите внимание, что поток, получающий уведомление об _ _ отсоединении процесса DLL , не обязательно является тем же потоком, который получил уведомление о _ _ присоединении процесса DLL .

Библиотека DLL _ _Присоединение потока 2
Текущий процесс — создание нового потока. В этом случае система вызывает функцию точки входа для всех библиотек DLL, которые в настоящее время подключены к процессу

Вызов выполняется в контексте нового потока. Библиотеки DLL могут использовать эту возможность для инициализации слота TLS для потока. Поток, вызывающий функцию точки входа DLL с _ _ присоединением процесса DLL , не вызывает функцию точки входа DLL с _ _ присоединением потока DLL. Обратите внимание, что функция точки входа библиотеки DLL вызывается с этим значением только в потоках, созданных после загрузки процессом библиотеки DLL. Когда библиотека DLL загружается с помощью LoadLibrary, существующие потоки не вызывают функцию точки входа вновь ЗАГРУЖЕННОЙ библиотеки DLL.

Библиотека DLL _ _Отсоединение потока 3
Поток завершается чисто. Если библиотека DLL сохранила указатель на выделенную память в слоте TLS, она должна использовать эту возможность для освобождения памяти. Система вызывает функцию точки входа всех загруженных в данный момент библиотек DLL с этим значением. Вызов выполняется в контексте выходного потока.

лпвресервед

Если фдвреасон является _ _ присоединением процесса DLL, лпвресервед имеет значение NULL для динамических нагрузок и не равно null для статических нагрузок.

Если фдвреасон является _ _ отсоединением процесса DLL, лпвресервед имеет значение NULL , если была вызвана FreeLibrary , или если не удалось загрузить DLL и не равно NULL , если процесс завершается.

Почему это небезопасно

Чаще всего строка, содержащая команду, которую необходимо выполнить вызовом system (), формируется с добавлением каких-либо данных. Это может быть текст уведомления или аргументы для другой программы. Затем system () запускает командную оболочку (Bourne Shell или аналогичную) и передаёт команду ей. Это позволяет получить почти полный доступ к системе.

Важно! Если у пользователя есть возможность повлиять на передаваемые функции system () данные, он может попытаться сделать командную инъекцию (англ. Command injection или Shell injection) — добавить к данным вредоносные инструкции, которые будут выполнены в оболочке

Рассмотрим фрагмент кода на C++:

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

Hello!’ && rm -rf /* && echo ‘a

В итоге оболочка получит три команды вместо одной:

  1. notify-send ‘Hello!’ — вывод уведомления, задуманный разработчиками.
  2. rm -rf /* — удаление всех файлов на компьютере.
  3. echo ‘a — вывод буквы a. Эта команда нужна для того, чтобы не было конфликтов с кавычками.

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

Вот пример для сайта, написанный на Python:

Каждый раз, когда пользователи будут заходить на эту страницу, на сервере будет выводиться уведомление.

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


Результат работы программы

В веб-приложениях функции вроде os.system () нужны очень редко, но последствия их небрежного использования могут оказаться весьма серьёзными: утечка данных пользователей, поломка оборудования, потеря прибыли и так далее.

Даже если программа запущена не от root и разрушительное действие напрямую невозможно, взломщик может выполнить эскалацию привилегий (англ. Privilege escalation) — с помощью известных уязвимостей получить повышенный уровень доступа к системе. Перечень таких незакрытых лазеек время от времени публикуется на различных хакерских сайтах.

Что касается языков, которые не имеют доступа к командной оболочке (например, JavaScript в браузере), то в них возможна инъекция кода (англ. Code injection) — передача вредоносного кода текущей программе.

Самый простой пример — попытка ввести JavaScript-код в какую-нибудь форму на сайте. Например, взломщик может оставить комментарий следующего вида:

Hello! <script>window.location=’http://other_site/’;</script>

Пользователи, которые будут открывать страницу с этим комментарием, будут перенаправляться на другой сайт.

Другой пример — функция eval () в JavaScript:

Использование аргументов командной строки

Теперь, когда вы знаете, как предоставить программе аргументы командной строки, следующим шагом будет доступ к ним из нашей программы на C++. Для этого мы используем другую форму . Эта новая форма принимает два аргумента (по соглашению названные и ) следующим образом:

Иногда вы также можете увидеть и такое:

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

– это целочисленный параметр, содержащий счетчик числа аргументов, переданных программе ( = argument count, число аргументов). всегда будет не меньше 1 потому, что первым аргументом всегда является имя самой программы. Каждый аргумент командной строки, предоставляемый пользователем, приведет к увеличению на 1.

– это место, где хранятся фактические значения аргументов ( = argument values, значения аргументов, хотя на самом деле расшифровывается как «argument vectors»). Хотя объявление выглядит устрашающе, на самом деле представляет собой просто массив строк в стиле C. Длина этого массива – .

Давайте напишем короткую программу с именем MyArgs для вывода значений всех параметров командной строки:

Теперь, когда мы вызываем эту программу (MyArgs) с аргументами командной строки «Myfile.txt» и «100«, вывод будет следующим:

Аргумент 0 – это путь и имя текущей запущенной программы. Аргументы 1 и 2 в данном случае – это два параметра командной строки, которые мы передали.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: