通过Bash从Cisco C40获取输出

时间:2015-09-29 20:11:10

标签: linux bash shell ssh cisco

背景

我们有一些思科C40,我试图通过bash实现自动化(虽然我对替代品持开放态度)。我需要登录,拨打IP,取回已返回的呼叫ID ,然后使用该CallID向远端发送DTMF音。我能够在那里获得大约90%的路由但由于某些原因使用SSH并不能返回使用交互式会话时返回的所有文本。

Interactive Shell示例:

login as: admin
Using keyboard-interactive authentication.
Password:
Welcome to XXX
TANDBERG Codec Release TC7.1.1.168aadf
SW Release Date: 2014-04-11
*r Login successful

OK

xConfiguration Audio Volume: 0
** end

OK
xCommand Dial Number: FAR_END_IP

OK
*r DialResult (status=OK):
    CallId: 73
    ConferenceId: 44
** end

非交互式Shell样本

没有ssh -Tssh -t -t选项

除了要挂起xConfiguration Audio Volume: 0外,call-init-step1.txt还包含xCommand Dial Number: FAR_END_IPbye

[user@controlserver C40]$ cat call-init-step1.txt | ssh admin@cisco_codec
Pseudo-terminal will not be allocated because stdin is not a terminal.
Welcome to XXX
TANDBERG Codec Release TC7.1.1.168aadf
SW Release Date: 2014-04-11
*r Login successful

OK

** end

OK

OK

我在这里缺少的是

*r DialResult (status=OK):
    CallId: 73
    ConferenceId: 44
** end

这样我就可以为CallID解析它,然后用它来发送下一个命令。

使用ssh -Tssh -t -t选项

一些主题建议使用ssh -Tssh -t -t,在这种情况下似乎没有帮助,下面是输出。

[user@controlserver C40]$ cat call-init-step1.txt | ssh -T admin@cisco_codec
Welcome to XXX
TANDBERG Codec Release TC7.1.1.168aadf
SW Release Date: 2014-04-11
*r Login successful

OK

** end

OK

OK

[user@controlserver C40]$ cat call-init-step1.txt | ssh -t -t admin@cisco_codec
Welcome to XXX
TANDBERG Codec Release TC7.1.1.168aadf
SW Release Date: 2014-04-11
*r Login successful

OK

** end

OK

OK

问题

非常感谢有关如何获取缺失的DialResult块的任何见解。

编辑:我还应该提到,最终命令cat call-init-step1.txt | ssh admin@cisco_codec将被重定向到我的脚本中进一步解析的文件,这意味着它可能看起来像cat call-init-step1.txt | ssh -t -t admin@cisco_codec > results.txt然后被解析。 / p>

编辑2:构建我使用full API guide is found here

的内容

编辑2.5:尝试使用expect

根据@MarkSetchell的建议,我们继续编写了一个半功能的期望脚本,如下所示:

#!/usr/bin/expect
spawn ssh admin@cisco_codec
expect "*r Login successful"
send "xConfiguration Audio Volume: 0"
expect "OK"
send "xCommand Dial Number: FAR_END_IP"
expect "** end"

结果如下:

[user@controlserver C40]$ expect expect-call
spawn ssh admin@cisco_codec
Welcome to XXX
TANDBERG Codec Release TC7.1.1.168aadf
SW Release Date: 2014-04-11
*r Login successful

OK

xConfiguration Audio Volume: 0xCommand Dial Number: FAR_END_IPxConfiguration Audio Volume: 0xCommand Dial Number: FAR_END_IP

1 个答案:

答案 0 :(得分:1)

似乎有一些方法,如果我不得不继续使用bash,似乎使用正确编写的except脚本将是最佳选择。那说a Reddit post的某人我建议使用XML。使用XML已经超出了我的想法,但是我和我立刻不得不帮助我的人都非常精通如何解决这个问题,但是incredibly helpful post我正在使用Python和XML。

最终产品最终看起来像这样:

#!/usr/bin/env python
import time
import requests
from lxml.etree import fromstring, Element, tostring


def putxml_request(xml, **kwargs):
    return requests.post(
        'http://HOSTNAME/putxml',
        auth=('USER', 'PASSWORD'),
        data=xml.format(**kwargs)).content


def xconfiguration_request(*path, **keys_and_values):
    root = Element('Configuration')
    parent = root
    for level in path:
        current = Element(level)
        parent.append(current)
        parent = current

    for k, v in keys_and_values.iteritems():
        node = Element(k)
        node.text = str(v)
        current.append(node)

    xml = tostring(root, pretty_print=True)
    return putxml_request(xml)

xconfiguration_request('Audio', Volume=0)

DIAL = '''\
<Command>
  <Dial>
    <Number>{number}</Number>
    <Protocol>{protocol}</Protocol>
  </Dial>
</Command>'''

outcome = putxml_request(
    DIAL, number='XXX', protocol='Sip')
callid = fromstring(outcome).xpath('//CallId')[0].text

# this gives it some time for the call to connect
time.sleep(10)

DTMFSEND = '''\
<Command>
  <DTMFSend>
    <CallId>{callid}</CallId>
    <DTMFString>{dtmf}</DTMFString>
  </DTMFSend>
</Command>'''
outcome = putxml_request(DTMFSEND, callid=callid, dtmf='1234')
status = fromstring(outcome).xpath('//DTMFSendResult')[0].attrib['status']

if status != 'OK':
    print('bad')
else:
    print('sent dtmf')

最终,我最终安排了这个脚本来启动一个电话(通过cron),然后写了一个非常相似的脚本,用DisconnectAll挂断电话。

我希望这对某人有所帮助,感谢/ u / omgdave对Reddit的帮助(我提供了一个机会回答这个问题并给出了答案,但并没有接受),以获得对此的帮助