在pexpect脚本中使用scp时出错

0 投票
1 回答
944 浏览
提问于 2025-04-17 22:48

我正在尝试制作一个备份工具,它可以从xml文件中读取数据,并制作备份文件的副本。这个xml文件里包含了所有设备的数据,格式如下:

<data>
    <devices>
        <device name='cisco' ip='10.10.10.10' uname='username' password='passpass' backup_make='Write memory' backup_location_device='nvram:/startup-config' backup_location='idan/backup_fiels/backup1.cfg' ></device>     
        </devices>
</data> 

我用这些数据来通过ssh连接,效果很好:

xmldoc = minidom.parse('xmlfile.xml')
devicelist = xmldoc.getElementsByTagName('device')

    address=('ssh ',devicelist[0].attributes['uname'].value,'@',devicelist[0].attributes['ip'].value)
    password = (devicelist[0].attributes['password'].value)

    ssh_device = pexpect.spawn(address)
    ssh_device.expect('.assword:')
    .
    .
    .

但是当我用同样的方法进行scp时,我遇到了一个错误。

backup = ('scp ',devicelist[0].attributes['uname'].value,'@',devicelist[0].attributes['ip'].value,':',devicelist[0].attributes['backup_location_device'].value,' test.cfg')

ssh_device = pexpect.spawn(backup)
ssh_device.expect('.assword:')
.
.
.

当我运行这个脚本时:

Traceback (most recent call last):
  File "xmltest.py", line 34, in <module>
    backup_make = pexpect.spawn(backup)
  File "/usr/local/lib/python2.7/site-packages/pexpect/__init__.py", line 485, in __init__
    self._spawn(command, args)
  File "/usr/local/lib/python2.7/site-packages/pexpect/__init__.py", line 590, in _spawn
    'executable: %s.' % self.command)
pexpect.ExceptionPexpect: The command was not found or was not executable: scp Netadmn9@10.10.10.10:nvram:/startup-config test.cfg.

以下命令也能正常工作:

backup = ('scp Netadmn9@10.106.11.111:nvram:/startup-config HSBU1a1_idan.cfg')

ssh_device = pexpect.spawn(backup)
ssh_device.expect('.assword:')
.
.
.

有人能帮忙吗?谢谢!

1 个回答

0

Pexpect 需要一个命令和一系列参数,所以我们需要把它们分开。

可以试试:

backup = "scp %s@%s:%s test.cfg" % (devicelist[0].attributes['uname'].value,devicelist[0].attributes['ip'].value,devicelist[0].attributes['backup_location_device'].value)

split_command = shlex.split(backup)
ssh_device = pexpect.spawn(split_command)

顺便说一下,如果你设置了公钥和私钥的登录方式,那么就不需要用 pexpect 来备份了,可以直接用 subprocess 调用。

详细信息可以在 这里 查看。

split_command = shlex.split(backup)
subprocess.call(split_command)

我添加了一行字符串格式化的代码,替代了你生成的元组。

这样应该可以通过 shlex.split() 合理地分割。

撰写回答