关于命令行交互自动化,及pyinstaller打包wexpect的问题
Python自动化工具
用来执行命令并进行交互,比如需要输入账号密码或者确认的场景
linux平台可以用pexpect,但是windows平台有一些差异,比较好用的是pexpect的变种wexpect,如果脚本中用了wexpect,并且要打包成onefile,可以
参考github首先打包wexpect
1.进入wexpect目录执行
pyinstaller __main__.py -n wexpect
会生成dist文件夹
2.python代码A.py中使用wexpect,注意wexpect.spawn前后必须按照下面添加代码
import sys,os,wexpect
#spawn前
real_executable = sys.executable
try:if sys._MEIPASS is not None:sys.executable = os.path.join(sys._MEIPASS, "wexpect", "wexpect.exe")
except AttributeError:pass
child = wexpect.spawn('ssh root@192.168.47.128')
sys.executable = real_executable
#spawn后
try:child.expect('password',timeout=1)child.sendline("root@123")child.expect('#',timeout=1)child.sendline("touch wexpect")child.sendline("exit")
except Exception as e:print("timeout")
print('1.before = ',child.before)
print('2.after = ',child.after)
child.wait()
3.打包成onefile
pyinstaller --onefile --add-data “wexpect路径\dist;.” A.py
Windows伪控制台
很少用到,只能参考windows官方文档自己写,启动伪控制台,并且通过管道直接和伪控制台交互,非常方便,传送门
自己随便写的demo如下:
// PseudoConsoleDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <thread>
#include <string>
#include <codecvt>
#include <memory>
using namespace std;void Log(string info)
{//string cmd = "echo " + info;printf(info.c_str());
}std::string UTF8ToLocale(const std::string& utf8Str)
{//Convert utf8 to Unicodestd::wstring_convert<std::codecvt_utf8<wchar_t> > conv;std::wstring tmpWstr = conv.from_bytes(utf8Str);//Conver widestr to system code pageint len = WideCharToMultiByte(CP_ACP, NULL, tmpWstr.c_str(), -1, NULL, NULL, NULL, NULL);char *str = new char[len];WideCharToMultiByte(CP_ACP, NULL, tmpWstr.c_str(), -1, str, len, NULL, NULL);return str;
}HRESULT PrepareStartupInformation(HPCON hpc, STARTUPINFOEXW* psi)
{// Prepare Startup Information structureSTARTUPINFOEXW si;ZeroMemory(&si, sizeof(si));si.StartupInfo.cb = sizeof(STARTUPINFOEX);// Discover the size required for the listSIZE_T bytesRequired;InitializeProcThreadAttributeList(NULL, 1, 0, &bytesRequired);// Allocate memory to represent the listsi.lpAttributeList = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, bytesRequired);if (!si.lpAttributeList){return E_OUTOFMEMORY;}// Initialize the list memory locationif (!InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &bytesRequired)){HeapFree(GetProcessHeap(), 0, si.lpAttributeList);return HRESULT_FROM_WIN32(GetLastError());}// Set the pseudoconsole information into the listif (!UpdateProcThreadAttribute(si.lpAttributeList,0,PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE,hpc,sizeof(hpc),NULL,NULL)){HeapFree(GetProcessHeap(), 0, si.lpAttributeList);return HRESULT_FROM_WIN32(GetLastError());}*psi = si;return S_OK;
}
bool WritePipe(HANDLE pipeHd, const char DataBuffer[])
{DWORD dwBytesToWrite = (DWORD)strlen(DataBuffer);DWORD dwBytesWritten = 0;BOOL bErrorFlag = FALSE;bErrorFlag = WriteFile(pipeHd, // open file handleDataBuffer, // start of data to writedwBytesToWrite, // number of bytes to write&dwBytesWritten, // number of bytes that were writtenNULL);return bErrorFlag;
}bool ReadPipe(HANDLE pipeHd)
{const int BUFFERSIZE = 4096;char ReadBuffer[BUFFERSIZE] = { 0 };if (pipeHd == INVALID_HANDLE_VALUE){//printf(("Terminal failure: unable to open file \"\" for read.\n"));return false;}// Read one character less than the buffer size to save room for// the terminating NULL character. DWORD dwBytesRead;DWORD dwBytesToRead = BUFFERSIZE - 1;if (FALSE == ReadFile(pipeHd, ReadBuffer, dwBytesToRead, &dwBytesRead, NULL)){//printf("Terminal failure: Unable to read from file.\n GetLastError=%08x\n", GetLastError());return false;}// This is the section of code that assumes the file is ANSI text. // Modify this block for other data types if needed.if (dwBytesRead > 0 && dwBytesRead <= dwBytesToRead){ReadBuffer[dwBytesRead] = '\0'; // NULL character//printf(("Data read from (%d bytes): \n"), dwBytesRead);//PseudoConsole use utf8 encodeLog(UTF8ToLocale(ReadBuffer));return true;}else if (dwBytesRead == 0){//printf(("No data read from file\n"));}else{//printf("\n ** Unexpected value for dwBytesRead ** \n");}return false;
}
PWSTR String2PWSTR(const string& str)
{PWSTR pwstr;int len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.size(), NULL, 0);pwstr = new WCHAR[len + 1];MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.size(), pwstr, len);pwstr[len] = '\0';return pwstr;
}
HPCON SetUpPseudoConsole(std::string cmd, HANDLE& read, HANDLE& write, PROCESS_INFORMATION& proc)
{COORD size = { 1000, 500 };HRESULT hr = S_OK;// Create communication channels// - Close these after CreateProcess of child application with pseudoconsole object.HANDLE inputReadSide, outputWriteSide;// - Hold onto these and use them for communication with the child through the pseudoconsole.HANDLE outputReadSide, inputWriteSide;if (!CreatePipe(&inputReadSide, &inputWriteSide, NULL, 0)){return NULL;}if (!CreatePipe(&outputReadSide, &outputWriteSide, NULL, 0)){return NULL;}HPCON hPC;hr = CreatePseudoConsole(size, inputReadSide, outputWriteSide, 0, &hPC);if (FAILED(hr)){return NULL;}STARTUPINFOEXW siEx;PrepareStartupInformation(hPC, &siEx);// Create mutable text string for CreateProcessW command line string.const string cmdStr = "C:\\windows\\system32\\cmd.exe /k \"echo off\"";PCWSTR childApplication = String2PWSTR(cmdStr);//PCWSTR childApplication = L"C:\\windows\\system32\\cmd.exe /k \"net use \\\\192.168.47.128\"";// Create mutable text string for CreateProcessW command line string.const size_t charsRequired = wcslen(childApplication) + 1; // +1 null terminatorPWSTR cmdLineMutable = (PWSTR)HeapAlloc(GetProcessHeap(), 0, sizeof(wchar_t) * charsRequired);if (!cmdLineMutable){return NULL;}wcscpy_s(cmdLineMutable, charsRequired, childApplication);PROCESS_INFORMATION pi;ZeroMemory(&pi, sizeof(pi));// Call CreateProcessif (!CreateProcessW(NULL,cmdLineMutable,NULL,NULL,FALSE,EXTENDED_STARTUPINFO_PRESENT,NULL,NULL,&siEx.StartupInfo,&pi)){HeapFree(GetProcessHeap(), 0, cmdLineMutable);return NULL;}CloseHandle(inputReadSide);CloseHandle(outputWriteSide);//if (!WritePipe(inputWriteSide, "net use \\\\192.168.47.128\r")) {// printf("write error");//}read = outputReadSide;write = inputWriteSide;proc = pi;return hPC;
}
int main()
{auto t = std::thread([]() {HANDLE read, write;PROCESS_INFORMATION pi;HPCON hpc = SetUpPseudoConsole("net use \\\\192.168.47.128", read, write, pi);DWORD exitCode;if (GetExitCodeProcess(pi.hProcess, &exitCode)) {//printf("get exit code success ,code=%d", exitCode);STILL_ACTIVE;if (exitCode == STILL_ACTIVE) {//printf("process alive");}}else {Log("get exit code failed");}if (!ReadPipe(read)) {Log("read error");}if (!WritePipe(write, "net use \\\\192.168.47.128\r")) {Log("write error");}if (!ReadPipe(read)) {Log("read error");}if (!WritePipe(write, "smbshare\r")) {Log("write error");}if (!ReadPipe(read)) {Log("read error");}if (!WritePipe(write, "smbshare\r")) {Log("write error");}if (!ReadPipe(read)) {Log("read error");}Sleep(100);if (GetExitCodeProcess(pi.hProcess, &exitCode)) {Log("get exit code success ,code=" + exitCode);STILL_ACTIVE;if (exitCode == STILL_ACTIVE) {Log("process alive");}}WaitForSingleObject(pi.hProcess, 0);WaitForSingleObject(pi.hThread, 0);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);ClosePseudoConsole(hpc);//TerminateProcess});t.join();
}
相关文章:
关于命令行交互自动化,及pyinstaller打包wexpect的问题
Python自动化工具 用来执行命令并进行交互,比如需要输入账号密码或者确认的场景 linux平台可以用pexpect,但是windows平台有一些差异,比较好用的是pexpect的变种wexpect,如果脚本中用了wexpect,并且要打包成onefile&a…...
8.4 【MySQL】文件系统对数据库的影响
因为 MySQL 的数据都是存在文件系统中的,就不得不受到文件系统的一些制约,这在数据库和表的命名、表的大小和性能方面体现的比较明显,比如下边这些方面: 数据库名称和表名称不得超过文件系统所允许的最大长度。 每个数据库都对应…...
Python WEB框架FastAPI (二)
Python WEB框架FastAPI (二) 最近一直在使用fastapi,随着使用的深入发现我对于它的了解还是太少了,以至于踩了一些坑。所以在这里记录一下,愿看到的小伙伴不迷路。 路径传参并发问题 一、路径传参 这是对上一个传参…...
基于Java网络书店商城设计实现(源码+lw+部署文档+讲解等)
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
怒刷LeetCode的第3天(Java版)
目录 第一题 题目来源 题目内容 解决方法 方法一:动态规划 第二题 题目来源 题目内容 解决方法 方法一:模拟 方法二:数学规律 方法三:分组 第三题 题目来源 题目内容 解决方法 方法一:数学方法 方法…...
JavaScript数组去重常用方法
数组去重是在 JavaScript 开发中经常遇到的问题。本文将从前言、分析、使用场景、具体实现代码和注意事项等方面,详细讨论 JavaScript 数组去重的方法。 前言: 在 JavaScript 中,数组是一种常用的数据结构,用于存储多个值。然而…...
蓝牙电话之HFP—电话音频
1 媒体音频: 播放蓝牙音乐的数据,这种音频对质量要求高,数据发送有重传机制,从而以l2cap的数据形式走ACL链路。编码方式有:SBC、AAC、APTX、APTX_HD、LDAC这五种编码方式,最基础的编码方式是SBC࿰…...
JDBC基本概念
什么是JDBC JDBC概念 JDBC(Java DataBase Connectivity)是一套统一的基于Java语言的关系数据库编程接口规范。 该规范允许将SQL语句作为参数通过JDBC接口发送给远端数据库, …...
leetcode876 链表的中间节点
题目 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结点,值为 3 。 输入&a…...
了解方法重写
父类 package com.mypackage.oop.demo07;//重写都是方法的重写,与属性无关 public class B {public static void test(){System.out.println("B>test.()");}public void test2(){System.out.println("B2>test.()");} }子类 package com…...
2、从“键鼠套装”到“全键盘游戏化”审核
1、风行内容仓的增效之路 - 前言 内容仓成立初期,安全审核组是规模最大的小组,占到部门人数的半壁江山,因此增效工作首先就从安全审核开始。 早期安全审核每天的达标值在800条左右,每天的总审核量不到1万,距离业务部门…...
【flutter】架构之商城main入口
架构之商城main入口 前言一、项目模块的划分二、入口main的配置三、配置文件怎么做总结 前言 本栏目我们将完成一个商城项目的架构搭建,并完善中间的所有功能,总页面大概200个,如果你能看完整个栏目,你肯定能独立完成flutter 项目…...
linux学习实操计划0103-安装软件
本系列内容全部给基于Ubuntu操作系统。 系统版本:#32~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 18 10:40:13 UTC 1 安装deb格式软件 Debian包是Unixar的标准归档,将包文件信息以及包内容,经过gzip和tar打包而成。 处理这些包的经典程序是…...
git vscode
01:工作区 **02:暂存区 git add . 3:本地库 git commit -m ’ 4:远程库 git push example 点击箭头之后...
Linux命令行批量删除文件
1、 删除当前目录下60min前的所有.log结尾文件 find ./ -type f -name "*.log" -mmin 60 -delete 2、删除当前目录下30天前的所有.log结尾文件 find ./ -type f -name "*.log" -mtime 30 -delete...
CAN - 基础
CAN 基础 概念分类特点物理层收发器线与编码方式通信方式采样点/位 常见故障 数据链路层CAN控制器数据帧分类数据帧格式数据帧DBC解析CRC校验远程帧 总线竞争与仲裁非破坏性仲裁机制 节点状态与错误处理机制节点状态错误处理机制错误帧 概念 分类 CANCAN FD高速CAN低俗容错CA…...
【Hash表】找出出现一次的数字-力扣 136
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...
Resize和centerCrop的区别
首先要记住,transforms只能对PIL读入的图片进行操作,而且PIL和opencv只能读取H * W * C形式的图片。 resize(size):将图片的短边缩放成size的比例,然后长边也跟着缩放,使得缩放后的图片相对于原图的长宽比不变。如果想要resize成自己想要的图…...
无涯教程-JavaScript - SUM函数
描述 SUM函数可添加值。 语法 SUM (number1, [number2]...)争论 Argument描述Required/Optionalnumber1The first number you want to add. The number can be a value, a cell reference, or a cell range.Requirednumber2, …You can specify up to 255 additional numbe…...
ChatGLM P-Tuningv2微调定制AI大模型
前言 什么是模型微调 想象一下,你正在学习如何弹奏一首钢琴曲目。你已经学会了一些基本的钢琴技巧,但你想要更进一步,尝试演奏一首特定的曲目。这时,你会选择一首你感兴趣的曲目,并开始深度练习。 Fine-tuning(微调)在机器学习中也是类似的概念。当我们使用预先训练好…...
关于RISC-V安全性的全面综述
目录 摘要引言RISC-V安全综述通用平台的安全要求信任的根源与硬件安全模块OTP管理模块安全内存对称加密(如AES)引擎不对称加密[131](例如,公钥RSA)引擎HASH/HAMC引擎随机数/位生成(例如TRNG[136]࿰…...
Python基础语法规则和Java不同的地方
Java是现在最流行的语言,也是广大程序员最熟悉的语言。然而,随着人工智能领域的快速发展,Python作为新星崭露头角。通过对比Java语言来学习Python语言,可以事半功倍。 首先,我们来看Python和Java在注释上的区别。在Jav…...
振弦采集仪安全监测路基边坡的解决方案
振弦采集仪安全监测路基边坡的解决方案 随着人们对交通安全的重视和公路工程的发展,路基边坡安全监测成为了重要的课题之一。路基边坡作为公路的基础,其稳定性直接关系到公路的使用寿命和行车安全。而振弦采集仪作为一种新型的安全监测设备,可…...
如何与QVC 建立EDI连接?
QVC,全称为Quality, Value, Convenience(品质、价值、便利),成立于1986年,是一家全球领先的零售电视和在线零售商。作为一家多渠道零售商,QVC致力于为客户提供高品质、独特的商品,通过电视、互联…...
脑网络图谱
前言 研究人脑面临的一个挑战是其多尺度组织和系统复杂性。我们对大脑组织的认识主要来源于离体组织学检查,如细胞结构映射。通过研究全脑微观结构特征的变化,可以划分为不同的脑区。然而,这种研究大脑组织的“局部”方法非常耗时、耗资源&a…...
无涯教程-JavaScript - SQRTPI函数
描述 SQRTPI函数返回(number * pi)的平方根。 语法 SQRTPI (number)争论 Argument描述Required/OptionalNumberThe number by which pi is multiplied.Required Notes If the specified number < 0, SQRTPI returns the #NUM! error value.如果指定的数字为非数字,则S…...
Nacos使用教程(四)——命名空间(Namespace)、配置分组(Group)和配置集ID(Data ID)
文章目录 Nacos命名空间(Namespace)一、什么是命名空间二、命名空间的作用1. 隔离环境2. 分类管理3. 权限控制 三、命名空间的使用四、总结 Nacos配置分组(Group)一、什么是配置分组二、配置分组的作用1. 分类管理2. 隔离控制3. 动…...
三、双指针(two-point)
文章目录 一、算法核心思想二、算法模型(一)对撞指针1.[704.二分查找](https://leetcode.cn/problems/binary-search/)(1)思路(2)代码(3)复杂度分析 2.[15.三数之和](https://leetco…...
Redis 是什么和使用场景概述(技术选型)
一、Redis 是什么 Redis是一款开源的高性能键值存储系统。它支持多种数据结构,如字符串、列表、集合、哈希表、有序集合等,并提供了丰富的操作命令和功能。Redis的主要特点包括: 内存存储:Redis将数据存储在内存中,因此…...
【数据结构】七大排序
文章目录 💐1. 插入排序🌼1.1 直接插入排序🌼1.2 希尔排序 💐2. 选择排序🌼2.1 直接选择排序🌼2.2 堆排序 💐3. 交换排序🌼3.1 冒泡排序🌼3.2 快速排序🌼3.2.…...
做公司网站需要花钱吗/百度投放广告联系谁
01串 时间限制:1000 ms | 内存限制:65535 KB难度:2描述ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个,他希望你能帮帮他。 注:01串的长度为…...
现代农业建设 乡网站/贵阳网站建设公司
Docker下配置redis主从复制详细过程 2019年03月19日 16:00:37 累了困了喝六神 阅读数:116 标签: redis主从 docker docker搭建redis docker-redis 更多 个人分类: 学习笔记 环境 同一宿主机两个docker容器,请提前安装好docke…...
青岛标志设计公司/优化师是干嘛的
XSS XSS全称跨站脚本攻击(Cross Site Scripting),顾名思义,就是通过向某网站写入js脚本来实现攻击。如果熟悉或了解SQL注入的话,这么一说大概就十分清楚了。 如果是刚接触web开发的同学,可能乍想不明白,自己的网站&…...
郑州做网站制作的公司/北京百度快速排名
一.类的静态成员变量,以及静态函数。 静态成员变量: 1.静态成员共享机制 2.静态成员局部属于类,它不是对象的成员,位于静态区。 3.静态成员变量需要在外部进行初始化。 静态函数: 1.静态成员函数都在代码区&…...
html5网站搭建/电脑优化大师有用吗
作者:老K玩代码来源:toutiao.com/i6882755471015576072Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。…...
网站怎么做的有创意/百度安全中心
现在项目有需要对数据进行脱敏处理,要求保留前三位和最后四位,中间对用*处理。如18912341234脱敏处理之后应该变成189****1234。处理方法如下:var str"18912341234"var pat/(\d{3})\d*(\d{4})/var bstr.replace(pat,$1****$2);cons…...