PowerShell: ** чтение ** ввода с клавиатуры И ** перенаправление вывода ** в переменную / файл

620
Free Man

Извините, если мой вопрос тривиален; Я новичок в PowerShell.

Моя программа (plink) ожидает ответа от клавиатуры и выдаст некоторый вывод. Можно ли перенаправить вывод в переменную / файл ?

Подробности:

(Я назначаю саму команду переменной для удобства.)

Без перенаправления вывода - Консольный вывод в порядке:

PS C:\Users\user> $mycmd="plink -v -ssh -l $user $myserver vncserver -list" PS C:\Users\user> invoke-expression $mycmd user@server's password: TigerVNC server sessions: X DISPLAY # PROCESS ID :1 26788 PS C:\Users\user> 

Однако с перенаправлением вывода в переменную:

PS C:\Users\user> $myoutput=invoke-expression "$mycmd"

... все еще жду в этом состоянии ==> Я набираю свой passwd вслепую (приглашение passwd записывается в $ myoutput)

PS C: \ Users \ user> $ myoutput

пароль пользователя @ сервера:

Сеансы TigerVNC-сервера:

X DISPLAY # ID ПРОЦЕССА

PS C: \ Users \ сервер>

Переменная $ myoutput с содержимым в порядке, но запрос пароля также перенаправляется в переменную!

Мой pbm теперь состоит в том, как сделать использование всеобъемлющим: пользователь не может угадать при вводе своего пароля :( (то есть, как обрабатывать запрос пароля?)

Замечания : подробный режим plink (plink -v ...) все еще выводится на консоль при перенаправлении на $ myoutput

$ myoutput = invoke-выражение "$ mycmd"

Looking up host "server" Connecting to xxx.XXX.XXX.XXX port 22 We claim version: SSH-2.0-PuTTY_Release_0.66 Server version: SSH-2.0-OpenSSH_7.4 Using SSH protocol version 2 Doing Diffie-Hellman group exchange Doing Diffie-Hellman key exchange with hash SHA-256 Host key fingerprint is: ssh-rsa 2048 blabklablablablabla Initialised AES-256 SDCTR client->server encryption Initialised HMAC-SHA-256 client->server MAC algorithm Initialised AES-256 SDCTR server->client encryption Initialised HMAC-SHA-256 server->client MAC algorithm Using username "user". Using SSPI from SECUR32.DLL Attempting GSSAPI authentication GSSAPI authentication initialisation failed The target was not recognized. 

Я ввожу свой пароль здесь (в темноте)

Sent password Access granted Opening session as main channel Opened main channel Started a shell/command Server sent command exit status 1 Disconnected: All channels closed 
0
(1) Прежде всего, вы должны знать, что запрос пароля является частью вывода `plink`. Готовы ли вы обработать первую строку `$ myoutput` в качестве запроса пароля? (2) Поскольку запрос пароля является частью выходных данных `plink`, вы должны ожидать, что он войдет в` $ myoutput` ***, а не в консоль. *** При вводе `$ myoutput = invoke-expression "$ mycmd" `, вы получаете другое приглашение PS, или оно просто кажется зависшим? Если кажется, что он зависает, * возможно, он молча читает пароль с клавиатуры! * Попробуйте ввести пароль. (Предупреждение: может отображаться на экране консоли.) G-Man 6 лет назад 0
Я переписал свое руководство в качестве ответа. G-Man 6 лет назад 0
Спасибо G-Man, хороший намек! Действительно, он не зависает, он ждет :) `PS C: \ Users \ user> $ myoutput = выражение-выражение" $ mycmd "` ..... все еще жду в этом состоянии ==> Я набираю passwd вслепую (подскажите passwd записано в $ myoutput) `PS C: \ Users \ user> $ myoutput _user @ пароль сервера: _ Сеансы сервера TigerVNC: X DISPLAY # ID ПРОЦЕССА PS C: \ Users \ server` $ Содержимое myoutput в порядке, но мой pbm теперь как чтобы сделать использование более дружелюбным: пользователь не может догадаться, набрав его passwd :( Замечания: подробный режим plink (plink -v), все еще выводящий на консоль при перенаправлении на $ myoutput Free Man 6 лет назад 0

1 ответ на вопрос

0
G-Man

Запрос пароля является частью выходных данных plink, поэтому вы должны ожидать, что он войдет в $myoutput консоль, а не в нее .   Я ожидаю, что, когда вы печатаете $myoutput=invoke-expression "$mycmd", он просто кажется зависшим и не дает вам другой подсказки PS. Вероятно, он молча читает пароль с клавиатуры!   Если вы просто введете пароль, он будет работать. (Предупреждение: пароль может отображаться на экране консоли.)

Как упомянуто выше, поскольку запрос пароля является частью выходных данных plink, он входит в $myoutput. Итак, вы должны быть готовы обработать первую строку $myoutputзапроса на ввод пароля.

Точно, это вопрос сейчас: как обработать эту первую строку $ myoutput, чтобы отобразить запрос пароля ... Большое спасибо G-man, вы делаете мой вопрос прогрессирующим Free Man 6 лет назад 0

Похожие вопросы