❶ 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來操作某些互動式的自動化任務是非常方便的。