windows expect怎么使用

windows expect怎么使用,第1张

你是说shell的expect么,我有个ssh自动登录的脚本,你看下1 [#!/usr/bin/expect]

2 [set timeout 30]

基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒

3 [spawn ssh -l username 19216811]

spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dircom 或 direxe 的可执行文件。

它主要的功能是给ssh运行进程加个壳,用来传递交互指令。

4 [expect "password:"]

这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒

5 [send "ispass\r"]

这里就是执行交互动作,与手工输入密码的动作等效。

温馨提示: 命令字符串结尾别忘记加上 “\r”,如果出现异常等待的状态可以核查一下。

6 [interact]

执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工 *** 作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行

解决的办法:

(一)我的电脑->属性->远程->远程协助和远程桌面;把复选框选上。如果还不行的话,转移到第2步;

(二)在“开始”---“运行”里输入 mstsc /migrate (该命令作用是将使用客户端连接管理器创建的旧连接文件前移到新的rdp 连接文件)。

终端,Shell,“tty”和控制台(console)有什么区别?

控制台,终端和tty是密切相关的。原本它们都表示一台可以和计算机交互的设备:在UNIX的早期阶段,此类设备大多指电传机器(像一台打字机一样),这种设备有时也叫做电传打字机,缩写为TTY。“终端”(terminal)这个名字是从电子的观点来看的,而“控制台”是从设备的角度来看的。在UNIX历史的极早期阶段,电子键盘和显示器就已经是一种规范的终端。

在UNIX术语中,tty是一种特殊的设备文件,它在read和write之外还实现了一些特殊的命令(ioctls)。通常意义上terminal是tty的代名词。有的tty由(软件)内核来代替硬件设备,比如从键盘发送过来的input,以及发送到文本模式的屏幕上的output,或者在串行线上传输的input/output流。还有一种tty——有时候叫做伪tty(pseudo-ttys)的,它是由叫做”终端模拟器“的程序提供的(通过一个中间层),这种tty例如Xterm(运行在X window系统上),Screen(在一个程序和另一个终端之间提供了中间层),SSH(在另一台电脑上,通过程序连接另一台点奥上的终端),Expect(用脚本和终端交互)之类。

"terminal"这个词通常也有一个更加传统的意思,表示一台能够用来和电脑交互的设备——通常有显示器和键盘。比如一个X terminal(一种瘦客户机——一种特殊用途的计算机),它唯一的作用就是驱动键盘,显示器,鼠标,(偶尔还有)别的外围交互设备;而实际上程序是泡在另外一台更加强大的计算机上的。

Console通常的物理意义上是通过一些手段直接连到机器上的主终端(primary teminal),在一些 *** 作系统(比如Linux和FreeBSD)上console一般有好几个tty(用特定的组合键能够在这些tty之间切换)。有时候这些命名让人混乱,比如 *** 作系统可能把那些tty叫做”console“ ”virtual console“ ”virtual terminal“之类的。

那么,既然说一个虚拟终端是”虚拟(virtual)”的,什么又是“真的”终端?

shell,作为用户登录系统时看到的主界面,它主要的用处就是启动别的程序。(我不确定原来的比喻义是指shell是用户的home环境,还是说shell是其他程序在里面跑的环境)

在UNIX圈里,shell 特指命令行shell(并且围绕这这样的描述:  “输入你想要运行的应用的额名字,后面跟着文件或者其他的、应用程序应该据此作出调整的东西(翻译:就是参数啦) ,并按回车键。”) 其他类型的环境并不使用“shell”这个词,比如说窗口系统涉及了”窗口管理器“(window managers) 和”桌面环境“(desktop environments),但并不使用”shell“这个词。

UNIX shell有很多,比较流行的交互式shell包括bash(大多数Linux发行版的默认选择) zsh(重视功能和可定制性) 还有fish(以简单为主旨)。

命令行shell包括了用来组合命令的流程控制结构。除了在交互式提示符下输入命令外,用户还可以编写脚本。大多数shell都有一套共同的语法(基于Bourne shell)。当我们讨论”shell编程”时,shell几乎都指Bourne风格的shell。有的shell经常用来运行脚本,但缺少足够的交互功能(比如说Korn shell——ksh,以及ash的许多变种)。 几乎所有的UNIX-like *** 作系统都有一个Bourne风格的shell(路径一般是/bin/sh)——而且 不是ash ksh 就是bash。

在UNIX系统管理中,一个用户的shell是那个在登录的时候被调用的程序。普通用户账户也拥有命令行shell,受限的用户(比如仅用于传输文件的账户)可能拥有一个受限的shell,或者只能运行特定命令的shell。

expect其实就是产生两个进程,一个模拟用户(expect进程本身),一个执行命令(spawn语句产生的进程)。send就是模拟用户在console下输入字符串,我们输入命令都要回车的,相应的send的字符串要用\r结束。脚本里的expect语句相当于用户等待命令输出以确定接下来输入什么命令。 特殊字符转义不好解释,看Exploring Expect吧。好像有一个笨办法是,send每个特殊字符前面都加上\就可以了,expect每个特殊字符前面加上\\\。 send "\$ax\[sdf\]\@\#\r" expect "\\\r\\\n

详细的内容可以参考下面的参考文档,下面的内容主要是为网络设备运维人员使用的pexpect 跨平台简明教程。

Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况。

pexpect是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。它可以用来实现与ssh, ftp, telnet等程序的自动交互。

send命令后执行结果内容保存在buffer中,这时childexpect('keyword')后,childbefore即为“keyword”之前的字符串,childafter即为匹配的”keyword”字符串。

command的执行结果都保存在一个buffer中,每次执行expect时都从buffer中开始检查匹配的pattern,如果找到了匹配的pattern,则所有在匹配处之前的内容都从buffer中清除。

(这边没有看明白也没有关系,可以看后面的实践篇例子)

通常维护人员有的偏向于用WIN系统,有的偏向于LINUX系统。所以前期团队希望形成一个统一框架的时候就出现了一个难题。框架如何适用于不同的系统。

LInux系统pexpect包,win系统前期尝试使用winpexpect,但是程序改动很大,并没有调试成功。

如何在WIN系统使用python的pexpect包很难找到相关资料,某乎上都是类似的疑问没有解答。

团队成员增加后,终于有了新的思路 , 团结就是力量 。

通过这个模块进行不同系统的适配。

将plinkexe装在python的文件夹在python的安装目录下,win系统可以同样使用pexpect模块

参考信息1:Pexpect 官方文档 New in version 40: Windows support。Pexpect can be used on Windows to wait for a pattern to be produced by a child process, using [ pexpectpopen_spawnPopenSpawn ]

参考信息2:PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。plink是可以独立使用的exe实现形式,可以让我们直接在命令行制定好命令,然后执行,完成后自动关闭session。ssh是一个安全通道协议。plink是这个通道协议的一个实现 [上传中(-572001-1587612890428-0)]

从官方文档来看,

sendline() 和 send() 唯一的区别就是在发送的字符串后面加上了回车换行符,这也使它们用在了不同的地方:

只需要发送字符就可以的话用send()

如果发送字符后还要回车的话,就用 sendline()

但是在调测过程中,WIN系统下命令输入后,childbefore始终得不到预想中的结果。

经过逐步排查,发现在WIN系统下只能使用send() ,如果使用sendline() ,第一次交互没有问题,后续交互就开始问题。

WIN系统下childbefore输出为b'byte型,做判断时要转为str型。具体可以参考最后面一篇讲编码类型的文章,讲的很详细。

例子1

send Username后,childbefore一直到'Tac_Userna',childafter为‘me:’,childbuffer为空。

expect关键字assword:后,childbefore回显一直到keyword之前,childafter为keyword,childbuffer为空。

例子2

下发command命令,childbefore维持原来的不变,expect到keyword以后,childbefore变为下发command命令后的设备回显。

参考文档

官方文档

探索Pexpect

Pexpect示例及使用Tips

Python Pexpect模块讲解

Pexpect模块使用说明

windows下使用plink实现全自动登陆ssh

Python3_字符编码

以上就是关于windows expect怎么使用全部的内容,包括:windows expect怎么使用、计算机无法连接到远程计算机上的另一个控制台会话,您正在运行一个控制台会话,怎么办、在expect里面怎样send一串含有特殊字符的字符串等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10091703.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存