Linux环境下基于SIP(callmonitor)实现来电触发自定义程序执行的方案咨询
Linux环境下基于SIP(callmonitor)实现来电触发自定义程序执行的方案咨询
Hey Marcel, 我懂你要的是什么——在Linux上收到SIP来电时自动触发自定义程序,而且既不用接听电话,也不需要任何GUI对吧?给你几个可行的实操方向:
1. 借助Asterisk的AGI脚本实现
Asterisk是Linux上非常流行的开源SIP服务器,完全能满足你的需求,配置起来也不算复杂:
- 首先编辑Asterisk的拨号计划配置文件
extensions.conf,添加一个处理来电的规则:[incoming] exten => s,1,NoOp(检测到来电,来电ID: ${CALLERID(num)}) same => n,AGI(/path/to/your/trigger-script.sh,${CALLERID(num)}) same => n,Hangup() - 这里的
trigger-script.sh可以是直接调用你自定义程序的脚本,比如脚本里写/usr/bin/mycustomprogramm "$1",$1就会接收传进来的来电ID;最后用Hangup()直接挂断,确保不会接听电话。
2. 用sipgrep+Shell脚本监听SIP包
如果不想部署完整的SIP服务器,用sipgrep抓包监听是个轻量的选择:
- 先安装
sipgrep(大部分发行版的包管理器里都有),然后写一个持续运行的Shell脚本:#!/bin/bash # 监听所有网卡上的SIP INVITE请求(来电初始请求) sipgrep -i -d any 'INVITE' | while read -r line; do # 从SIP头里提取来电ID if [[ "$line" =~ From:.*sip:([^@]+)@ ]]; then caller_id="${BASH_REMATCH[1]}" # 执行你的自定义程序,传入来电ID /usr/bin/mycustomprogramm "$caller_id" fi done - 把这个脚本设为可执行(
chmod +x your-monitor-script.sh),可以用nohup ./your-monitor-script.sh &让它在后台持续运行,或者把它做成systemd服务确保开机自启。
3. 轻量方案:用Kamailio的事件路由
如果需要更轻量的SIP处理服务,Kamailio是个好选择,它的事件模块可以直接监听来电请求:
- 编辑Kamailio的配置文件
kamailio.cfg,添加事件路由规则:event_route[core:request] { # 只处理INVITE请求(来电触发) if (is_method("INVITE")) { # 提取来电ID(SIP From头里的用户名部分) $var(caller_id) = $fU; # 调用你的自定义程序 exec("/usr/bin/mycustomprogramm", "$var(caller_id)"); # 直接退出,不处理后续接听逻辑 exit; } } - 重启Kamailio服务后,它就会在收到来电时自动触发你的程序,全程不会接听电话。
小提醒
- 测试的时候可以先把自定义程序换成简单的日志命令,比如
echo "来电ID: $caller_id" >> /tmp/sip-call-log.txt,先验证来电ID能不能正确提取、脚本能不能正常触发。 - 确保你的自定义程序和监听脚本有足够的权限,比如如果要写入文件或者调用系统资源,可能需要调整权限或者用合适的用户运行。
备注:内容来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

