❶ python 脚本中pexpect模块问题~
亲不清楚你为什么匹配两次y/n
我给你个例子说明expect的用法
例如我ssh连接一台服务器
连接之后会有提示,此时我们可以使用expect
ssh.expect('continueconnecting(yes/no)?')
之前的字符应该自动正则了
expect之后我们就可以根据提示输入要输入的信息
ssh.sendline('yes
')
哦shit我发现个问题你是不是应该试试crt.sendline('y
')
❷ python中的Pexpect模块使用时,child.expect('参数')中的参数到底应该填什么内容谢谢!
当你发布一条命令后,系统会给你一个反馈。
参数:就是你所期望的反馈!
比如说,当你发布一条命令后,期望系统提示 "Password" 让你输入密码,那语句就是
child.expect ('Password:')
参数也可以用正则表达式,注意是最小匹配模式。
❸ python pexpect 为什么无法接收过多的输出信息
ssh-keygen -f id_rsa -t rsa -N '' 直接执行这个bash命令就可以了,不用python脚本
当你发布一条命令后,系统会给你一个反溃 参数:就是你所期望的反馈! 比如说,当你发布一条命令后,期望系统提示 "Password" 让你输入密码,那语句就是 child.expect ('Password:') 参数也可以用正则表达式,注意是最小匹配模式。
❹ 怎样用python实现scp
scp 功能很强大,但需要人工输入 password, 当然可以通过把 公钥保存在远程主机的 ~/.ssh 目录中,而后就不用输入password,但这需要配置.
用 sshpass 可能在命令输入 password, 但 需要用 “sudo apt-get install sshpass” 安装
如果不想用上面两种方法,可以用 expect 编写脚本可以帮助我们自动交互
虽然 Python 也提供 pexpect 模块,但既然 expect 很简单,为何不直接用 os.system() 去执行呢?
下面是我编写的类,实现了远程复制
[html] view plain
class RemoteShell:
def __init__(self, host, user, pwd):
self.host = host
self.user = user
self.pwd = pwd
def put(self, local_path, remote_path):
scp_put = '''
spawn scp %s %s@%s:%s
expect "(yes/no)?" {
send "yes\r"
expect "password:"
send "%s\r"
} "password:" {send "%s\r"}
expect eof
exit'''
os.system("echo '%s' > scp_put.cmd" % (scp_put % (os.path.expanser(local_path), self.user, self.host, remote_path, self.pwd, self.pwd)))
os.system('expect scp_put.cmd')
os.system('rm scp_put.cmd')
但发现每次文件都没有复制完,我想看expect 究竟做了什么事情,还好 expect 提供 -d 参数给出更多的信息。
最后发现是被复制文件太大,expect 超时退出了
在脚本前加入 “set timeout -1" 就OK了
[html] view plain
scp_put = '''
set timeout -1
spawn scp %s %s@%s:%s
expect "(yes/no)?" {
send "yes\r"
expect "password:"
send "%s\r"
} "password:" {send "%s\r"}
expect eof
exit'''
❺ pexpect python有什么好处
child.expect(r']\$')
child.sendline("echo hallo >> /home/benny/2.txt")
child.expect(r']\$')
child.sendline("echo abc >> /home/benny/3.txt")
#############################################
ssh连接上后,匹配到 "]$"时 "echo hallo >> /home/benny/2.txt",匹配到 "]$" 时,"echo abc >> /home/benny/3.txt"
为什么第二个没有写入呢,不知道是没有匹配到没有执行,还是其他原因
对于pexpect帮助中的这段也不明白,
Please note, however, that buffering can affect this behavior, since
input arrives in unpredictable chunks. For example::
# the input is 'foobar'
index = p.expect (['foobar', 'foo'])
# returns 0 ('foobar') if all input is available at once,
# but returs 1 ('foo') if parts of the final 'bar' arrive late
❻ aexpect属于python哪个包
听说过pexpect
❼ python的公共变量如何管理
全局变量管理模块
首先定义一个全局变量管理模块
# common/gloabalvar.py
# -*- coding:utf-8 -*-
"""
global var mole
"""
def _init():
global _global_dict
_global_dict = {}
def set_value(name, value):
"""定义一个全局变量"""
_global_dict[name] = value
def get_value(name, defValue=None):
"""获取一个全局变量值,不能存在则返回默认值"""
try:
return _global_dict[name]
except KeyError:
return defValue
二、初始化及定义(设置)全局变量
# main.py
import app.common.globalvar as globalvar
if __name__ == "__main__":
# init global var
globalvar._init()
globalvar.set_value('itsm_deadline', SettingConfig.ITSM_DAILY_DEADLINE)
globalvar.set_value('email_subject', SettingConfig.EMAIL_SUBJECT)
globalvar.set_value('email_recipients', SettingConfig.EMAIL_RECIPIENTS)
globalvar.set_value('auto_submit_status', SettingConfig.AUTO_SUBMIT_STATUS)
1
2
3
4
5
6
7
8
9
10
11
三、获取全局变量
# business.py
import app.common.globalvar as globalvar
status = globalvar.get_value('auto_submit_status')
附加:API管理全局变量,都是基于上述三点完成
对于flask-restful的web应用则可以通过API接口查看全局变量的值以及通过API接口设置和管理它们
# app/api/v1/test/test.py
from flask_restplus import Resource
import app.common.globalvar as globalvar
from .marshal_model import admin_api_ns as api
@api.route('/')
class GlobalVar(Resource):
"""全局变量管理API"""
@api.doc('Get all the global var')
@api.response(HTTP_GET_SUCCESS, 'query success')
def get(self):
"""查询所有的全局变量"""
glist = globalvar._global_dict
return glist, HTTP_GET_SUCCESS
@api.route('/auto')
class AutoSubmit(Resource):
"""查看及修改自动状态的API"""
@api.doc('check auto submit status')
@api.marshal_with(set_autosubmit)
@api.response(HTTP_GET_SUCCESS, 'query success')
def get(self):
"""测试查看自动状态开关状态"""
status = globalvar.get_value('auto_submit_status')
# status = query_autojob_status()
return {'status': status}, HTTP_GET_SUCCESS
@login_required
@admin_required
@api.doc('set auto submit the planlist everyday')
@api.expect(set_autosubmit)
def post(self):
"""设置每天定时自动开关"""
data = request.json
status = data.get('status')
globalvar.set_value('auto_submit_status', status)
# resp, returncode = update_autojob_status(status)
return {'message': 'success'}, HTTP_POST_SUCCESS
❽ python pexpect 模块
Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块,它可以用来和像 ssh、ftp、passwd、telnet 等命令行程序进行自动交互。
下面这个实例功能是:以ssh远程登录,登录成功后执行命令‘ls -lh’
pexpect之spawn类
当然,ssh登录还可以使用pexpect的run函数实现:
#events是一个字典,定义了expect和sendline的对应关系pexpect.run('ssh [email protected]',events={'password:','123456'})
针对ssh远程登录,pexpect又派生出了pxssh类,在ssh会话操作上再做一层封装
其常用方法是:
login() #建立ssh连接
logout()#断开ssh连接
prompt()#等待系统提示符,用于等待命令执行结束
❾ python 的pexpect模块怎么安装
当然,ssh登录还可以使用pexpect的run函数实现:
#events是一个字典,定义了expect和sendline的对应关系
pexpect.run('ssh [email protected]',events={'password:','123456'})
针对ssh远程登录,pexpect又派生出了pxssh类,在ssh会话操作上再做一层封装
其常用方法是:
login() #建立ssh连接
logout() #断开ssh连接
prompt() #等待系统提示符,用于等待命令执行结束
❿ 如何Python3.4使用pexpect来实现SSH登陆
Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。 Pexpect 的使用范围很广,可以用来实现与 ssh、ftp 、telnet 等程序的自动交互;可以用来自动复制软件安装包并在不同机器自动安装;还可以用来实现软件测试中与命令行交互的自动化。
在shell里面用过pexpect的人,相信都会很熟悉这种工具,pexpect是expect的python的一个实现,利用python来操作某些交互式的自动化任务是非常方便的。