CMD без файла эквивалент <перенаправления - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть пакет, который оборачивает клиентский интерфейс AnyConnect Mobility Client (vpncli.exe) и запрашивает имя пользователя и пароль для последующей обработки их в vpncli.

Упрощенный код:

set /p user_id=Username:
set /p pwd=Password:
echo %user_id%> c:\temp\configvpn.txt
echo %pwd%>> c:\temp\configvpn.txt

set install_dir="C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client"

%install_dir%\vpncli.exe connect myvpn.mydomain.TLD -s < c:\temp\configvpn.txt

net use h: \\fileserver\sharename /user:domain\%user_id% %pwd%

ПоследнийВот почему мы делаем это так: не запрашивать пароль пользователя дважды (сначала для подключения VPN, а затем для подключения сетевого диска)

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

Я пытался:

(
    @echo %user_id%
    @echo %pwd% 
) | %install_dir%\vpncli.exe connect myvpn.mydomain.TLD -s

Пока не удалось.В результате получается такой цикл:

  >> Please enter your username and password.
Group: VPN-TESTGROUP

Username: [myUsername] Password:
  >> Login failed.
Group: VPN-TESTGROUP

Username: [myUsername] Password:
  >> Login failed.

(повторяется бесконечно)

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

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

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

Нужночтобы полностью понять механику труб CMD / Batch, чтобы иметь возможность конструировать и поддерживать рабочее решение таким образом, и это не простая задача для немного более сложных трубопроводных блоков.

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

@echo off
if "%~1"=="/LPipe" goto :/LPipe
if "%~1"=="/RPipe" goto :/RPipe

set /p user_id=Username:
set /p pwd=Password:

"%~f0" /LPipe | "%~f0" /RPipe
exit /b


:/LPipe
REM This will be executed inside a pipe but in batch context

REM Enable delayed expansion to be able to send any special characters
setlocal EnableDelayedExpansion

REM It's easy to take care of trailing spaces, no special hacks needed.
echo !user_id!
echo !pwd!
goto :EOF


:/RPipe
REM This will be executed inside a pipe but in batch context

%install_dir%\vpncli.exe connect myvpn.mydomain.TLD -s
goto :EOF
0 голосов
/ 11 декабря 2018

Вероятно, это проблема конвейерного блока, так как в конце каждой команды добавляются пробелы.

Этот код избегает пробелов и должен решить вашу проблему

(SET LF=^
%=empty=%
)

(
    echo %user_id%%%LF%%rem.
    echo %pwd%%%LF%%rem.
) |  %install_dir%\vpncli.exe connect myvpn.mydomain.TLD -s

Но вы должны проверить его без каких-либо специальных символов в вашем user_id или пароле!

...