免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6394 | 回复: 14
打印 上一主题 下一主题

[Perl][Pty]如何能够知道当前是linux命令行模式还是类似vi的编辑模式中 [复制链接]

论坛徽章:
0
跳转到指定楼层
[收藏(0)] [报告]
发表于 2008-12-12 09:23 |只看该作者 |正序浏览
10可用积分
在linux命令行模式prompt格式一般为[$usr@$host $path]#
在进入vi后可能捕获到的hex可能包含 1b 5b 3f 32等特殊含义的东东在里面
怎样才能正确识别当前是在vi的范围内

抱歉,说的不是非常清楚

目的是想对bash命令行下用户输入的命令进行先检查后执行的过程,对vi等编辑器的输入内容不做检查

1 首先创建pty (/dev/tty)
2 pty创建后exec调用ssh $host
3 STDIN -> pty->syswrite  #向ssh发送操作
4 pty->sysread #ssh回显
5 通过判断pty->sysread来知道当前是否还是在vi中

想在从STDIN输入后先经过命令检查才能发给ssh #每个命令以回车结束
*不想检查vi中的输入内容
*不能使用readline,它会破坏很多东西,例如more命令回显就不正常


现在这个功能可以通过所有pty->sysread返回的prompt部分实现,不过需要将所有sysread读回来的内容转换成hex才能分析出来
为了万无一失的匹配,当终端输入大量文本后,必然cpu会到99%
有什么好的办法吗〉?

[ 本帖最后由 huhuegg 于 2008-12-16 15:37 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2009-11-27 18:48 |只看该作者
pty的控制字符确实很难处理,这些控制字符的keycode 都是大于1个字符的,多的甚至有5个字符,最好用telnet试验,抓包分析,每个控制字符是怎么组成的,而对应的回显是什么样的,做还是能做的,就是异常麻烦……

论坛徽章:
0
13 [报告]
发表于 2009-11-27 17:09 |只看该作者
其实现在有两个问题,一个是从telnet返回的内容有很多控制字符,如何简单处理,就比如vi,一运行起来就很多屏幕控制的字符;另一个就是读取输入都要根据输出情况判断,如果只是readline还好,但是也有很多要实时单字符处理的情况,比较麻烦。

论坛徽章:
0
12 [报告]
发表于 2009-11-27 14:34 |只看该作者
“pty->sysread返回内容,$buf以BELL结尾的才拿出来做hex分析出来”
我自己没有去捕获过 vi 中,回显命令是发送什么样的 keycode,不过看lz上面说的这句,vi中读入的最后一个字符会有 "\a"?ls的可以尝试看看是否如此嘛
其实我觉得最烦的是,你在 pty 中按 char 读入的时候,你的方向键很难控制好,需要专门处理 pty 回显的 ^[[C 类似字符……

论坛徽章:
0
11 [报告]
发表于 2009-11-27 12:00 |只看该作者
谢谢楼上这么快答复,可能我表达的不清楚,我的意思是现在用readline方式没问题了,但是如楼主说的“不能使用readline,它会破坏很多东西,例如more命令回显就不正常”

论坛徽章:
0
10 [报告]
发表于 2009-11-27 11:37 |只看该作者
虽然很长时间的帖子了,不过最近也是研究 pty,处理控制符,确实很麻烦~
Perl_Er,lz说的是,需要知道 pty->slave 所处的模式,不是本地的,而 tty 的配置,只能通过 IO::Stty 提供的方法获取,实在有限的很,只能知道 POSIX 提供有限的参数设置情况~

论坛徽章:
0
9 [报告]
发表于 2009-11-27 11:25 |只看该作者
这样看一下不就行了:
bash-3.2# set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
ignoreeof       off
interactive-comments    on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
notify          off
nounset         off
onecmd          off
physical        off
pipefail        off
posix           off
privileged      off
verbose         off
vi              off    off表示关闭了vi模式,  如果你需要vi模式, 执行" set -o vi "就可以了
xtrace          off
bash-3.2#

论坛徽章:
0
8 [报告]
发表于 2009-11-27 11:17 |只看该作者
最近打算做一个自动登录服务器,方便集中管理,记录每一条指令。大体思路是找一台linux pc,用户登录后自动执行一个程序,只能执行telnet/ssh,密码保存在服务器上,实现自动登录。
楼主能否共享一下代码?
尝试了用expect,但是interact无法实现命令的控制和灵活的log。
用pty处理行命令已经可以了,但是在处理单键输入遇到困难,例如vi内部的命令操作,请大家支个招,谢谢。

论坛徽章:
0
7 [报告]
发表于 2008-12-16 15:35 |只看该作者
问题解决了,方法仍然是过滤所有pty->sysread返回内容,$buf以BELL结尾的才拿出来做hex分析出来,
确定真正的prompt,并在获取到前一个prompt并接受到readline结束标记后判断为命令交互部分开始,
直到下一个prompt收到

论坛徽章:
0
6 [报告]
发表于 2008-12-12 17:57 |只看该作者
看出来了

论坛徽章:
0
5 [报告]
发表于 2008-12-12 17:12 |只看该作者
如果只是监视的话已经实现,不需要那么麻烦
就是cmd的拦截控制有问题。。。。。。
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP