Пользовательский ввод командного файла с использованием Echo отличается от ручного ввода - PullRequest
0 голосов
/ 03 апреля 2020

Я создаю пакет для автоматизации начальной настройки. Я заметил, что ввод командного файла не совпадает с вводом пользователя. Когда я использую пакетный файл для ввода PIN-кода, а затем пытаюсь ввести его вручную, он не совпадает. Я пробовал ввод с пробелом, как [пробел] 1111, но он также не был действительным PIN-кодом. Я знаю, что есть способ установить пользовательский ввод из другого файла, но я хотел, чтобы все это было в одном пакетном файле.

(Echo 1111&Echo 1111&Echo 1111&Echo 1111)|ctconf 

Вывод командной строки:

C: \ windows \ system32> (Эхо 1111 и Эхо 1111 и Эхо 1111 и Эхо 1111) | ctconf

Инициализация токена администратора SO и PIN-коды администратора (устройство 0, S / N: 0000): введите новый PIN-код администратора SO: подтвердите новый PIN-код администратора SO:

Пожалуйста, введите новый пин-код администратора: подтвердите новый пин-код администратора:

Команда echo должна установить PIN на 1111. Когда я go и войти в систему вручную, это не правильный PIN-код. Я предполагаю, что эхо добавляет пробел или изменяет PIN-код ввода.

C: \ windows \ system32> ctkmu l -s1

Хотите ли вы sh просматривать частные (пользовательские) объекты [y / N]: y

Пожалуйста, введите ПИН-код пользователя для токена в слоте 1:

Метка = AdminToken (0000) Флаги = 0x1001064d (RNG LOGIN-REQ USER-PIN-INIT ЧАСЫ TOKEN-INIT DUAL-CRYPTO USER-LOW)

Не удалось войти в систему (0xa0 - неверный ПИН-код)

ctkmu: Ошибка в работе списка 0xa0 - неверный ПИН-код

C: \ windows \ system32>

ЕСЛИ я запускаю процесс заново и ввожу ПИН 1111 вручную, тогда он работает:

Вывод командной строки:

C: \ windows \ system32> ctconf

Инициализация идентификатора Admin SO токена и PIN-кода администратора (устройство 0, S / N: 0000): Пожалуйста, введите новый вывод Admin SO: Пожалуйста, подтвердите новый вывод Admin SO:

Пожалуйста, введите новый пин-код администратора: Подтвердите новый Пин администратора:

C: \ windows \ system32> ctkmu l -s1

Вы хотите sh просматривать частные (пользовательские) объекты [y / N]: y

Пожалуйста, введите PIN-код пользователя для токена в слоте 1:

Метка = AdminToken (0000) Флаги = 0x1000064d (RNG LOGIN-REQ USER-PIN-INIT CLOCK TOKEN-INIT DUAL-CRYPTO)

Publi c и частные объекты: слот 0 - HIMK слота - SECRET_KEY DES3 Конфигурация адаптера - ADAPTER FwUpgradeCert - СЕРТИФИКАТ RSA (доверенный)

C: \ windows \ system32>

Спасибо за ваш совет.

1 Ответ

0 голосов
/ 04 апреля 2020

Чтение stdin из канала | отличается от чтения из файла <, как вы заметили.

У меня нет ctconf для проверки, хотя я знаю Python 3 имеет аналогичное поведение с трубопроводом. Итак, я покажу некоторые примеры с Python, которые могут работать с ctconf.

Пакетный файл:

@prompt $G$S

rem 1. No escaping.
(echo 1111&echo 1111&echo 1111&echo 1111) | py test1.py

rem 2. Escape ampersand and end with a dummy command.
(echo 1111^&echo 1111^&echo 1111^&echo 1111^&echo:>nul) | py test1.py

rem 3. Escape ampersand, newline and end with a dummy command.
(   echo 1111^&^
    echo 1111^&^
    echo 1111^&^
    echo 1111^&^
    echo:>nul
) | py test1.py

pause

Python файл test1.py:

# Use these inputs to catch the stdin.
in1 = input('input1: ')
in2 = input('input2: ')
in3 = input('input3: ')
in4 = input('input4: ')

# Add a newline as inputs display no newlines.
print('\n---')

# Repr is representation so the space can be seen.
print(repr(in1), repr(in2), repr(in3), repr(in4))

Запустите пакетный файл и выведите:

> rem 1. No escaping.

> (echo 1111  & echo 1111  & echo 1111  & echo 1111 )  | py test1.py
input1: input2: input3: input4:
---
'1111 ' '1111 ' '1111 ' '1111 '

> rem 2. Escape ampersand and end with a dummy command.

> (echo 1111&echo 1111&echo 1111&echo 1111&echo: 1>nul )  | py test1.py
input1: input2: input3: input4:
---
'1111' '1111' '1111' '1111'

> rem 3. Escape ampersand, newline and end with a dummy command.

> (echo 1111&    echo 1111&    echo 1111&    echo 1111&    echo: 1>nul )  | py test1.py
input1: input2: input3: input4:
---
'1111' '1111' '1111' '1111'

> pause
Press any key to continue . . .

Примечание: одинарные кавычки в выходных данных являются просто представлением строкового значения, а не самим значением.

В первом примере экранирование не выполнено, как в OP, а у выхода есть завершающий пробел, т. Е. '1111 '.

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

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

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

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

...