Xshell 录制的操作脚本script 执行起来总是卡住 原因是颜色控制符

如果你需要不断地重复执行shell脚本,比如,搭建测试环境之类的。强烈建议你使用Xshell的操作脚本功能。

录制操作脚本



修改操作脚本

录制的脚本确实是对整个操作流程的记录。从理论上说重新执行一遍应该能重现整个操作流程。但是实际执行起来会卡住。

我排除了中英文的原因,编码格式的原因,最终发现原因是脚本输出了带颜色的字符。在Xshell把流程记录成操作脚本时,是略过了颜色控制字符的;而在Xshell执行操作脚本时,WaitForString函数去取终端输出的字符时是取到了颜色控制字符的。

例如,终端输出的是

实际上是

Xshell在记录操作脚本时,记录的是
xsh.Screen.WaitForString("按  Enter 回车键  继续....或按  Ctrl + C  取消.")
而在执行脚本时,就与终端上的输出不匹配了。

从软件设计的角度来看,我认为是Xshell的一个bug,我认为未来应该会有一个略过颜色控制符的比如叫做 WaitForPlainString 的函数。

所以我不准备在操作脚本里添加颜色控制符,而是会在操作脚本里删减WaitForString判断的关键字。

过程类似如下视频:

执行操作脚本


=======================

如果你是用的这个一键Vless+Websocket+TLS单模式脚本

https://github.com/crazypeace/V2ray_VLESS_WebSocket_TLS_CaddyV2

你可以把下面这段脚本保存成 .vbs 后缀文件,试着在Xshell里执行一下 :)

'请保存为 .vbs 后缀
'你的域名请解析到你的IP,并关闭CDN,再执行脚本
Sub Main
    xsh.Screen.Synchronous = true
    xsh.Screen.Send("apt update" + "\n")
    xsh.Screen.WaitForString("root@")
    xsh.Screen.Send("apt install -y curl" + "\n")
    xsh.Screen.WaitForString("root@")
    xsh.Screen.Send("bash <(curl -L https://github.com/crazypeace/V2ray_VLESS_WebSocket_TLS_CaddyV2/raw/main/install.sh)" + "\n")
    xsh.Screen.WaitForString("Enter 回车键")
    xsh.Screen.Send("\n")
    xsh.Screen.WaitForString("(默认ID:")
    xsh.Screen.Send("你的UUID" + "\n") '适合不想修改自己的节点参数的做法
    '如果你想让脚本自动生成新的ID,就改成这样 xsh.Screen.Send("\n")
    xsh.Screen.WaitForString("(默认端口port:")
    xsh.Screen.Send("\n")
    xsh.Screen.WaitForString("(例如: mydomain.com): ")
    xsh.Screen.Send("你的域名" + "\n")  '这里要替换成真正的域名
    xsh.Screen.WaitForString("for IPv6: ")
    xsh.Screen.Send("\n")
    xsh.Screen.WaitForString("(默认path:")
    xsh.Screen.Send("\n")
    xsh.Screen.WaitForString("(默认site:")
    xsh.Screen.Send("\n")
    xsh.Screen.WaitForString("Enter 回车键") ' 如果你是woiden等NAT小鸡, 已经有了共享的IPv4出站. 不用安装WARP, 请把这行及下面一行删除或注释
    xsh.Screen.Send("\n") 
End Sub

评论

The Hot3 in Last 30 Days

ClouDNS .asia免费域名 托管到CloudFlare开CDN白嫖Websocket WS通道翻墙 / desec.io

无服务器 自建短链服务 Url-Shorten-Worker 完整的部署教程