User Tools

Site Tools


программирование_диалогов_expect

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
программирование_диалогов_expect [2019/08/14 12:04]
val
программирование_диалогов_expect [2022/03/09 12:49] (current)
val [Вариант использования с элементами конфигурации в коде скрипта]
Line 1: Line 1:
 ====== Программирование диалогов expect ====== ====== Программирование диалогов expect ======
  
 +===== Установка =====
 <​code>​ <​code>​
 server# apt install expect server# apt install expect
 +</​code>​
 +
 +===== Cisco CLI =====
 +
 +==== Вариант использования с элементами конфигурации в коде скрипта ====
 +
 +!!! Не обрабатывается ситуация первого подключения (подтверждения ключа)
 +
 +<​code>​
 +server# ssh switchN
  
-server# cat router.exp+server# cat cisco_change_conf.exp
 </​code><​code>​ </​code><​code>​
 #​!/​usr/​bin/​expect #​!/​usr/​bin/​expect
-spawn telnet router+ 
 +set sw [lindex $argv 0]; 
 + 
 +spawn ssh $sw
 send "​\n"​ send "​\n"​
 expect "​sword:"​ { send "​cisco\n"​ } expect "​sword:"​ { send "​cisco\n"​ }
-expect ">" { send "​enable\n"​ } + 
-expect "sword:" { send "cisco\n" } +expect "#" { send "conf t\n" } 
-expect "#"​ { send "copy tftp://​server/​router.acl runn\n"​ }+expect "#"​ { send "ip scp server ​enable\n"​ } 
 +expect "#" { send "end\n" } 
 + 
 +#expect "#"​ { send "vlan database\n"​ } 
 +#expect "#"​ { send "vtp transparent\n"​ } 
 +#expect "#"​ { send "vlan 2 name LAN2\n"​ } 
 +#expect "#"​ { send "​exit\n"​ } 
 + 
 +expect "#"​ { send "​write\n"​ } 
 +expect "#"​ { send "​exit\n"​ } 
 +send_user "​\n"​ 
 +exit 0 
 +</​code><​code>​ 
 +server# chmod +x cisco_change_conf.exp 
 + 
 +server# ./​cisco_change_conf.exp switchN 
 +</​code>​ 
 + 
 +==== Вариант использования с элементами конфигурации в файле на tftp сервере ==== 
 +<​code>​ 
 +server# cat /​srv/​tftp/​cisco_change_conf.txt 
 +</​code><​code>​ 
 +ip scp server enable 
 +end 
 +</​code><​code>​ 
 +server# cat cisco_change_conf.exp 
 +</​code><​code>​ 
 +... 
 +expect "#"​ { send "copy tftp://​server/​cisco_change_conf.txt runn\n"​ }
 send "​\n"​ send "​\n"​
 send "​\n"​ send "​\n"​
-expect "#" { send "exit\n" }+... 
 +</​code>​ 
 + 
 +===== Communigate CLI ===== 
 + 
 +<​code>​ 
 +mail# cat cgp_cli.exp 
 +</​code><​code>​ 
 +#​!/​usr/​bin/​expect 
 + 
 +set cmd [lindex $argv 0]; 
 + 
 +spawn telnet localhost 106 
 + 
 +expect "200" { 
 +        ​send "USER postmaster\n" 
 +} 
 + 
 +expect "​300"​ { 
 +        send "PASS Pa\$\$w0rd\n"​ 
 +
 + 
 +expect "​200"​ { 
 +        send "​$cmd\n\n"​ 
 +
 + 
 +expect "​200"​ {} 
 + 
 +sleep 1 
 +send "​QUIT\n"​
 send_user "​\n"​ send_user "​\n"​
 exit 0 exit 0
 </​code><​code>​ </​code><​code>​
-server# chmod +x router.exp+mail# chmod +x cgp_cli.exp
  
-server# ./router.exp+mail# ./cgp_cli.exp '​CREATEACCOUNT user2 {Password = "​password2";​RealName = "​Петр Петрович Петров";​}'​ 
 + 
 +mail# ./​cgp_cli.exp '​GETACCOUNTSETTINGS user2'
 </​code>​ </​code>​
  
 +===== Asterisk AMI =====
 +
 +  * [[http://​the-asterisk-book.com/​1.6/​asterisk-manager-api.html#​manager-interface-beispiel-expect|Example:​ Getting the number of voicemail messages with expect]]
 +<​code>​
 +# cat /​usr/​share/​originate_ami.exp
 +</​code><​code>​
 +#​!/​usr/​bin/​expect
 +
 +set username "​admin"​
 +set secret "​admin"​
 +set host "​127.0.0.1"​
 +set port "​5038"​
 +
 +set channel [lindex $argv 0];
 +set num [lindex $argv 1];
 +set name [lindex $argv 2];
 +
 +send_user "Args: $channel $num $name\n"​
 +
 +spawn telnet $host $port
 +
 +expect "​Manager"​ {
 +        send "​Action:​ Login\n"​
 +        send "​Username:​ $username\n"​
 +        send "​Secret:​ $secret\n\n"​
 +}
 +
 +expect "​Response:​ Success"​ {
 +        send "​Action:​ Originate\n"​
 +        send "​Channel:​ SIP/​$channel\n"​
 +        send "​Context:​ default\n"​
 +        send "​Exten:​ $num\n"​
 +        send "​Callerid:​ $name<​$num>​\n"​
 +        send "​Priority:​ 1\n\n"
 +}
 +
 +sleep 1
 +
 +send "​Action:​ Logoff\n\n"​
 +
 +exit 0
 +</​code><​code>​
 +# /​usr/​share/​originate_ami.exp 403 301 "Hello World"
 +</​code>​
 +
 +===== Docker ======
 +<​code>​
 +webinar BBB# cat /​root/​scripts/​ch_web_pass.exp
 +</​code><​code>​
 +#​!/​usr/​bin/​expect
 +
 +set email [lindex $argv 0];
 +set password [lindex $argv 1];
 +
 +spawn docker exec -it greenlight-v2 bash
 +send "​\n"​
 +expect "​bash*#"​ {send "​bundle exec rails c\n"}
 +expect "​irb*>"​ { send "​User.find_by(email:​ \"​$email\"​).update_attribute(:​password,​\"​$password\"​)\n"​ }
 +expect "​irb*>"​ { send "​exit\n"​ }
 +expect "​bash*#"​ { send "​exit\n"​ }
 +send_user "​\n"​
 +exit 0
 +</​code>​
программирование_диалогов_expect.1565773491.txt.gz · Last modified: 2019/08/14 12:04 by val