Я хотел, чтобы сценарий ожидания запрашивал пароль? [Дубликат]

Другим сценарием является то, что вы нанесли нулевой объект в тип значения . Например, код ниже:

object o = null;
DateTime d = (DateTime)o;

Он выкинет NullReferenceException в роли. В приведенном выше примере это кажется совершенно очевидным, но это может произойти в более «поздних связующих» сложных сценариях, где нулевой объект был возвращен из некоторого кода, которого вы не являетесь, и приведение, например, генерируется некоторой автоматической системой.

Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления календарем:

" />

Здесь SelectedDate на самом деле является свойством - типа DateTime - типа Calendar Web Control, и привязка может отлично вернуть что-то null. Неявный генератор ASP.NET создаст кусок кода, который будет эквивалентен приведенному выше методу. И это поднимет NullReferenceException, что довольно сложно определить, потому что он лежит в сгенерированном ASP.NET коде, который компилирует отлично ...

18
задан MiniQuark 25 March 2009 в 15:47
поделиться

3 ответа

Используйте команду expect stty следующим образом:

# grab the password
stty -echo
send_user -- "Password for $user@$host: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set pass $expect_out(1,string)

#... later
send -- "$pass\r"

Обратите внимание, что для вызова stty -echo перед важно вызвать send_user - я не уверен именно поэтому: я думаю, что это вопрос времени.

Ожидайте, что программисты должны прочитать книгу: «Изучение ожиданий дон Либес»

29
ответ дан glenn jackman 3 September 2018 в 14:34
поделиться
  • 1
    Хорошо, спасибо! Удивительно, насколько нетерпим этот язык: я написал «set pass $ expect_out (1, string)» с пробелом перед словом «строка» и бомбы. Я тоже не могу найти документацию. Хотелось бы, чтобы было другое решение, чем ожидалось. Во всяком случае, большое спасибо. – MiniQuark 26 March 2009 в 09:32
  • 2
    & quot; не может найти много документации & quot; ?!? Есть целая книга, которая, как правило, считается настолько хорошо написанной, что ей не требуется второе издание. Серьезно, проверьте эту книгу. – glenn jackman 30 March 2009 в 14:10
  • 3
    Re: пробел между "1", " и "строка" - Tcl (и, следовательно, ожидание) не имеет многомерных массивов. Ключ массива - это просто строка, а «1, строка» - и "1, строка" разные. – glenn jackman 30 March 2009 в 14:10
  • 4
    «Ssty -echo» - это значит, что пароль, который вы вводите, не вызывается из кли. Это эмуляция поведения ожидания ssh w / out. – frogstarr78 17 August 2011 в 19:15

ОК, слияние двух ответов выше (или ниже или где бы они ни были!):

#!/usr/bin/expect
log_user 0
set timeout 10
set userid  "XXXXX"
set pass    "XXXXXX"

### Get two arguments - (1) Host (2) Command to be executed
set host    [lindex $argv 0] 
set command [lindex $argv 1]

# grab the password
stty -echo
send_user -- "Password for $userid@$host: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set pass $expect_out(1,string)

spawn /usr/bin/ssh -l $userid $host
match_max [expr 32 * 1024]

expect {
    -re "RSA key fingerprint" {send "yes\r"}
    timeout {puts "Host is known"}
}

expect {
     -re "username: " {send "$userid\r"} 
     -re "(P|p)assword: " {send "$pass\r"}
     -re "Warning:" {send "$pass\r"}
     -re "Connection refused" {puts "Host error -> $expect_out(buffer)";exit}
     -re "Connection closed"  {puts "Host error -> $expect_out(buffer)";exit}
     -re "no address.*" {puts "Host error -> $expect_out(buffer)";exit}

     timeout {puts "Timeout error. Is host down or unreachable?? ssh_expect";exit}
}

expect {
   -re "\[#>]$" {send "term len 0\r"}
   timeout {puts "Error reading prompt -> $expect_out(buffer)";exit}
}


expect {
   -re "\[#>]$" {send "$command\r"}

   timeout {puts "Error reading prompt -> $expect_out(buffer)";exit}
}

expect -re "\[#>]$"
set output $expect_out(buffer)
send "exit\r"
puts "$output\r\n"

Обратите внимание, что я изменил переменную $ password на $ pass, чтобы соответствовать другому ответу.

6
ответ дан dr-jan 3 September 2018 в 14:34
поделиться

В качестве альтернативы вы можете позволить ssh собирать пароль через X11 с использованием переменной среды SSH_ASKPASS.

На странице man:

> SSH_ASKPASS
>     If ssh needs a passphrase, it will read the passphrase from the
>     current terminal if it was run from a terminal.  If ssh does not
>     have a terminal associated with it but DISPLAY and SSH_ASKPASS
>     are set, it will execute the program specified by SSH_ASKPASS
>     and open an X11 window to read the passphrase.  This is particularly
>     useful when calling ssh from a .xsession or related script.
>     (Note that on some machines it may be necessary to redirect the
>     input from /dev/null to make this work.)
0
ответ дан qneill 3 September 2018 в 14:34
поделиться
Другие вопросы по тегам:

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