Я пишу командный файл для выполнения некоторых других программ. В этом случае мне нужно запросить пароль. Есть ли у меня способ замаскировать вводимый текст? Мне не нужно печатать символы ******* вместо вводимых символов. Достаточно поведения запроса пароля Linux (ничего не печатать при вводе).
@echo off
SET /P variable=Password :
echo %variable%
Pause
Это прочитает ввод, но я не могу замаскировать текст, используя этот подход.
batch-file
cmd
command-prompt
Чатуранга Чандрасекара
источник
источник
Ответы:
Вплоть до XP и Server 2003 вы можете использовать другой встроенный инструмент (VBScript) - следующие два скрипта выполняют нужную вам работу.
Во-первых
getpwd.cmd
:Тогда
getpwd.vbs
:getpwd.vbs
Просто использует объект пароля для ввода пароля от пользователя , а затем распечатать его на стандартный вывод (в следующем параграфе будет объяснить , почему не появляется в терминале).getpwd.cmd
Сценарий команды немного сложнее , но он в основном работает следующим образом .Результатом этой
"<nul: set /p passwd=Password: "
команды является вывод приглашения без символа новой строки в конце - это хитрый способ эмулировать"echo -n"
команду изbash
оболочки. Он устанавливаетpasswd
пустую строку в качестве несущественного побочного эффекта и не ждет ввода, поскольку принимает ввод сnul:
устройства."for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"
Утверждение хитрая бит. Он запускает VBScript без «рекламы» Microsoft, поэтому единственная строка вывода - это пароль (из VBscript"Wscript.StdOut.WriteLine strPassword"
.Установка разделителей на нулевое значение требуется для захвата всей строки ввода с пробелами, иначе вы получите только первое слово. В
"for ... do set ..."
битовых наборахpasswd
быть фактическим выходным пароль от VBScript.Затем мы выводим пустую строку (чтобы завершить
"Password: "
строку), и пароль будет вpasswd
переменной среды после выполнения кода.Теперь, как уже упоминалось,
scriptpw.dll
доступен только до XP / 2003. Чтобы исправить это, вы можете просто скопироватьscriptpw.dll
файл изWindows\System32
папки системы XP / 2003 в папкуWinnt\System32
илиWindows\System32
в вашей собственной системе. После того, как DLL будет скопирована, вам нужно будет зарегистрировать ее, запустив:Чтобы успешно зарегистрировать DLL в Vista и более поздних версиях, вам потребуются права администратора. Я не проверял законность такого шага, так пещерный лектор.
Если вы не слишком заинтересованы в поиске и регистрации старых DLL-файлов (для удобства или по юридическим причинам), есть другой способ. Более поздние версии Windows (те, в которых нет необходимой DLL) должны иметь доступный Powershell.
И, на самом деле, вам действительно следует подумать об обновлении ваших скриптов, чтобы использовать его в полной мере, поскольку это гораздо более функциональный язык сценариев, чем
cmd.exe
. Однако, если вы хотите сохранить основную часть кода в видеcmd.exe
сценариев (например, если у вас много кода, который вы не хотите преобразовывать), вы можете использовать тот же прием.Во-первых, измените
cmd
скрипт так, чтобы он вызывал Powershell, а не CScript:Скрипт Powershell столь же прост:
хотя с некоторым упорядочением, чтобы получить фактический текст пароля.
Помните, что для запуска локальных неподписанных сценариев Powershell на вашем компьютере вам может потребоваться изменить политику выполнения с (драконовского, хотя и очень безопасного) значения по умолчанию, примерно таким:
изнутри самого Powershell.
источник
scriptpw.dll
.Да, я опоздал на 4 года.
Но я нашел способ сделать это одной строкой, не создавая внешний скрипт; вызывая команды PowerShell из командного файла.
Благодаря TessellatingHeckler - без вывода в текстовый файл (я установил команду powershell в переменной, потому что одна длинная строка внутри цикла for довольно беспорядочная).
Первоначально я писал его для вывода в текстовый файл, а затем читал из этого текстового файла. Но вышеописанный способ лучше. В одной очень длинной, почти непонятной строке:
Я разобью это - вы можете разделить его на несколько строк с помощью каретки
^
, что намного приятнее ...В этой статье объясняется, что делают команды PowerShell; по сути, он получает ввод с помощью
Read-Host -AsSecureString
- следующие две строки конвертируют эту защищенную строку обратно в простой текст, вывод (пароль в виде обычного текста) затем отправляется в текстовый файл с использованием>.tmp.txt
. Затем этот файл считывается в переменную и удаляется.источник
for /f "usebackq tokens=*" %%p in (``powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"``) do set password=%%p
а затемecho %password%
. NB. Я не могу заставить этот комментарий правильно экранировать обратные кавычки - перед "powershell" и перед концом ")" два обратных кавычки, но должно быть одно обратное.1. Чистое пакетное решение, в котором (ab) используется
XCOPY
команда и ее/P /L
переключатели, которые можно найти здесь (некоторые улучшения можно найти здесь ):1.2 Другой способ, основанный на команде replace
2. Средство отправки пароля, которое использует всплывающее окно HTA . Это файл Hybrit .bat / jscript / mshta, который следует сохранить как .bat :
3. Самостоятельно скомпилированный гибрид .net. Снова следует сохранить как.
.bat
В отличие от других решений, он создаст / скомпилирует небольшой файл .exe, который будет вызываться (при желании его можно удалить). Также требуется установленный .net framework, но это не проблема:источник
Я бы, наверное, просто сделал:
Таким образом, вы получаете приглашение, а затем экран очищается после ввода.
Обратите внимание, что введенный пароль будет сохранен в истории CMD, если командный файл запускается из командной строки (спасибо @Mark K Cowan ).
Если этого было недостаточно, я бы либо переключился на python, либо написал исполняемый файл вместо скрипта.
Я знаю, что ни один из этих рецептов не идеален, но, возможно, вам подойдет один :)
источник
doskey /reinstall
очистку буфера предыдущей команды сразу после этогоcls
, если история команд в консоли для вас не важна.C:\>start "console" cmd /c ireadconsole.bat
Вы можете использовать подпрограмму ReadFormattedLine для всех видов форматированного ввода. Например, приведенная ниже команда считывает пароль из 8 символов, отображает звездочки на экране и автоматически продолжает работу без необходимости нажимать Enter:
Эта подпрограмма написана в чистом пакетном режиме, поэтому она не требует какой-либо дополнительной программы и позволяет выполнять несколько операций форматированного ввода, таких как чтение только чисел, преобразование букв в верхний регистр и т. Д. Вы можете загрузить подпрограмму ReadFormattedLine из Прочитать строку в определенном формате .
РЕДАКТИРОВАТЬ 2018-08-18 : Новый метод для ввода «невидимого» пароля
У команды FINDSTR есть странная ошибка, которая происходит, когда эта команда используется для отображения символов в цвете, И вывод такой команды перенаправляется на устройство CON. Подробнее о том, как использовать команду FINDSTR для отображения текста в цвете, см. В этом разделе .
Когда вывод этой формы команды FINDSTR перенаправляется на CON, после вывода текста желаемого цвета происходит что-то странное: весь текст после него выводится как "невидимые" символы, хотя более точное описание состоит в том, что текст является выводить как черный текст на черном фоне. Исходный текст появится, если вы используете команду ЦВЕТ для сброса цветов переднего плана и фона всего экрана. Однако, когда текст «невидим», мы можем выполнить команду SET / P, поэтому все введенные символы не будут отображаться на экране.
источник
другой альтернативой являются мои инструменты командной строки EditV32 (x86) или EditV64 (x64). Например:
-m означает «маскированный ввод», а -p - приглашение. Ввод пользователя сохраняется в переменной среды PWD. Вы можете получить его здесь:
https://westmesatech.com/?page_id=19
источник
Если вас беспокоит отсутствие исходного кода, у меня есть другая альтернатива.
Вы можете получить его на https://westmesatech.com/?page_id=49 . Исходный код прилагается.
источник
Если у вас установлен Python, вы можете использовать:
выход:
источник
Я использовал вышеуказанное решение Blorgbeard, которое, на мой взгляд, действительно здорово. Затем я улучшил его следующим образом:
Используйте это так:
При этом консоль становится серой на серый цвет для ввода пароля и переключается обратно, когда вы закончите. На самом деле ESC должен быть непечатаемым символом, который вы можете скопировать из загруженного образца текстового файла (отображается как стрелка влево в Блокноте) в свой командный файл. Вы можете использовать образец текстового файла, чтобы найти коды для всех цветовых комбинаций.
Если вы не являетесь администратором компьютера, вы, вероятно, сможете установить файлы в несистемный каталог, тогда вам нужно добавить каталог в PATH в вашем сценарии перед вызовом программы и использованием escape-последовательностей. Возможно, это может быть даже текущий каталог, если вам нужен не-администраторский распространяемый пакет всего из нескольких файлов.
источник
создайте пакетный файл, который вызывает тот, который нужен для невидимых символов, затем создайте ярлык для вызываемого пакетного файла.
щелкните правой кнопкой мыши
свойства
цвета
текст == черный
фон == черный
подать заявление
хорошо
надеюсь таким образом поможет вам !!!!!!!!
источник
ОБНОВЛЕНИЕ:
я добавил два новых метода, которые вместо использования cls для скрытия ввода создают новое всплывающее окно только с одной строкой.
Недостатки в том, что один метод (метод 2) оставляет в реестре мусор - «При запуске без соответствующих прав», а другой (метод 3) добавляет в скрипт мусор. Излишне говорить, что его можно легко записать в любой файл tmp и удалить, я просто попытался придумать альтернативу.
Ограничение: пароль может быть только буквенно-цифровым - никаких других символов!
Обновление: я нашел сообщение Сашади идеальным, и я просто добавил к нему свою «всплывающую» причуду.
источник
Я написал программу с открытым исходным кодом,
editenv
которая заменяет мои старыеeditv32
/editv64
утилиты:https://github.com/Bill-Stewart/editenv
Параметр
--maskinput
(-m
) [*] позволяет скрыть (замаскировать) введенный ввод и имеет настраиваемый символ (символ по умолчанию*
); например:Параметр
--prompt
(-p
) позволяет указать приглашение для ввода. Приведенное выше отобразитPassword:
подсказку и будет ждать, пока вы что-то введете. Введенные символы будут отображаться как*
. Нажатие Ctrl+ Cзавершит программу с кодом выхода 1223.Скачать здесь:
https://github.com/Bill-Stewart/editenv/releases
[*] Обратите внимание, что опция
--maskinput
(-m
) небезопасна - введенная строка вводится в среде как обычный текст. Эта функция предназначена только для удобства.источник
Это может быть более старая тема, но если вы используете Windows Vista или 7, у меня есть решение, которое будет работать очень хорошо. Я снял это видео здесь: http://www.youtube.com/watch?v=mk8uAa6PIFM
Pastebin для командного файла находится здесь
источник
источник
Другой вариант, аналогичный тому, что отсутствует у Blorgbeard , - это использовать что-то вроде:
Это
^
экранирует,>
так что запрос пароля будет выглядеть как стандартное приглашение консоли cmd.источник
Я читал все неуклюжие решения в сети о том, как маскировать пароли в пакетном файле, те, которые используются с помощью решения hide.com, и даже те, которые делают текст и фон одинаковым цветом. Решение hide.com работает прилично, не очень безопасно и не работает в 64-битной Windows. Так или иначе, используя 100% утилиты Microsoft, выход есть!
Во-первых, позвольте мне объяснить, как я использую. У меня около 20 рабочих станций с автоматическим входом в Windows. У них на рабочем столе есть один ярлык - к клиническому приложению. Машины заблокированы, они не могут щелкнуть правой кнопкой мыши, они не могут ничего делать, кроме доступа к одному ярлыку на своем рабочем столе. Иногда техническому специалисту необходимо запустить некоторые отладочные приложения, просмотреть проводник Windows и просмотреть файлы журнала без выхода из учетной записи пользователя autolog.
Итак, вот что я сделал.
Делайте это, как хотите, но я поместил два своих командных файла в общий сетевой ресурс, к которому у заблокированного компьютера есть доступ.
В моем решении используется 1 основной компонент Windows - runas. Разместите на клиентах ярлык для runas.bat, который вы собираетесь создать. К вашему сведению, на своих клиентах я переименовал ярлык для лучшего просмотра и изменил значок.
Вам нужно будет создать два командных файла.
Я назвал командные файлы runas.bat и Debug Support.bat.
runas.bat содержит следующий код:
Вы можете добавить столько, если «% un%», а если не «% un%», для всех пользователей, которым вы хотите предоставить доступ. @Ping - это мой способ создания секундного таймера.
Итак, это касается первого командного файла - довольно просто, а?
Вот код для Debug Support.bat:
Я не программист и действительно только начал заниматься пакетным скриптингом около года назад, и этот раунд способа, который я обнаружил для маскировки пароля в пакетном файле, довольно крутой!
Я надеюсь услышать, что кто-то другой, кроме меня, сможет извлечь из этого пользу!
источник