This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
программирование_диалогов_expect [2019/08/14 12:04] val |
программирование_диалогов_expect [2022/03/09 12:49] 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> |