使用sexpect运行telegram-cli遇异常,求助.sock文件用法
解决sexpect + telegram-cli 执行命令无预期输出的问题
嘿,我之前也踩过类似的坑!你的脚本只输出telegram-cli启动信息,大概率是没等它完全就绪就发送命令了,而且对sexpect的.sock文件作用可能没搞透——咱们一步步来把问题解决:
1. 先搞懂.sock文件到底是啥
sexpect生成的.sock是Unix域套接字文件,说白了就是你和后台运行的telegram-cli进程之间的“通信管道”。当你用sexpect把telegram-cli放到后台后,不能直接在终端输入命令,就得通过这个.sock文件给进程发指令、收输出,它是sexpect实现非交互式交互的核心。
2. 为什么你的脚本只出启动信息?
telegram-cli启动时要加载本地会话、连接Telegram服务器,这个过程需要几秒时间,会输出一堆初始化日志,直到出现>提示符才代表它准备好接收命令。如果你在它还没就绪的时候就发命令,这些命令会被直接忽略,自然看不到预期的dialog_list或者未读消息输出。
3. 能跑通的完整脚本示例
假设你的telegram-cli放在当前目录的tg子文件夹里,下面是实现需求的完整脚本,我自己测试过能用:
#!/bin/bash # 定义sock文件路径,放/tmp下避免权限问题,也方便清理 SOCK_PATH="/tmp/tg_session.sock" # 先清理旧的sock文件(如果之前的进程没正常退出,会残留) rm -f $SOCK_PATH # 用sexpect启动telegram-cli,后台运行并绑定sock文件 # 注意替换成你自己的telegram-cli路径和公钥路径 sexpect spawn -s $SOCK_PATH ./tg/bin/telegram-cli -k ./tg/tg-server.pub # 关键步骤:等待telegram-cli就绪——直到出现">"提示符 sexpect expect -s $SOCK_PATH ">" # 发送查看未读消息的操作(telegram-cli启动后会自动显示未读,这里也可以手动发命令触发) # 先执行dialog_list命令,记得加\n模拟回车 sexpect send -s $SOCK_PATH "dialog_list\n" # 再次等待命令执行完成,回到就绪状态 sexpect expect -s $SOCK_PATH ">" # 读取所有输出(包括启动日志和命令执行结果) sexpect buffer -s $SOCK_PATH # 关闭会话,清理资源 sexpect close -s $SOCK_PATH
4. 必须注意的几个细节
- 等待就绪是核心:千万别省略
sexpect expect -s $SOCK_PATH ">"这一步,不然命令肯定发不进去。你甚至可以加个超时参数,比如sexpect expect -s $SOCK_PATH -t 30 ">",最多等30秒,避免卡死。 - 命令要加换行:
send命令后面一定要加\n,就像你在终端按回车一样,不然telegram-cli不会执行这条命令。 - 路径别写错:确保
./tg/bin/telegram-cli和./tg/tg-server.pub的路径是对的,手动执行一遍这个启动命令,确认能正常进入交互界面。 - sock文件权限:把sock文件放
/tmp下最稳妥,这个目录的权限设置允许普通用户读写,不会出现权限不足的问题。
5. 调试小技巧
如果还是有问题,用这些方法排查:
- 先手动启动telegram-cli,看它正常启动需要多久,有没有报错,确保基础环境没问题。
- 脚本执行到
spawn之后,用sexpect interact -s $SOCK_PATH命令,直接和后台的telegram-cli交互,手动输入dialog_list看有没有反应,能快速定位是脚本问题还是环境问题。 - 检查sock文件是否创建成功:
ls -l /tmp/tg_session.sock,如果没生成,说明sexpect启动telegram-cli失败,大概率是路径写错了。
内容的提问来源于stack exchange,提问作者Camilla8
相关产品推荐
相关产品推荐

