You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSH登录Telegram告警脚本执行时触发语法错误的问题排查求助

SSH登录Telegram告警脚本执行时触发语法错误的问题排查求助

嘿,我帮你揪出脚本里的语法问题啦——你在cinfo变量赋值那一行多打了一个多余的双引号,这直接导致bash解析时懵圈,抛出了syntax error near unexpected token的报错!

具体错误点

看这行代码:

cinfo=($(curl ipinfo.io/${ip}/city))"

末尾的那个"完全是多余的,前面没有对应的开启引号,bash读到这里就识别不了这个意外的语法符号,自然就报错了。

额外优化建议

除了修复这个引号问题,还有几个小细节能让脚本更健壮:

  • 多次调用curl请求ipinfo.io可以合并成一次,减少网络请求次数,提升效率
  • 变量引用时尽量用双引号包裹,避免空格、特殊字符导致的解析异常
  • 告警文本的换行写法可以更规范,避免潜在的语法问题

修正后的完整脚本

#!/usr/bin/env bash

# Import credentials form config file
. /home/roots/credentials.config

URL="https://api.telegram.org/bot${KEY}/sendMessage"
DATE="$(date "+%d %b %Y %H:%M")"

if [ -n "$SSH_CLIENT" ]; then
    # 用双引号包裹变量,避免特殊字符干扰
    ip="$(echo "$SSH_CONNECTION" | cut -d " " -f 1)"
    
    # 一次curl请求获取所有IP信息,减少网络调用
    ip_info=$(curl -s "ipinfo.io/${ip}")
    coinfo=$(echo "$ip_info" | grep -o '"country": "[^"]*"' | cut -d '"' -f 4)
    rinfo=$(echo "$ip_info" | grep -o '"region": "[^"]*"' | cut -d '"' -f 4)
    cinfo=$(echo "$ip_info" | grep -o '"city": "[^"]*"' | cut -d '"' -f 4)
    tinfo=$(echo "$ip_info" | grep -o '"timezone": "[^"]*"' | cut -d '"' -f 4)

    # 用here-doc定义告警文本,写法更清晰规范
    TEXT=$(cat <<-EOF
New login via ssh. user name: ${USER}. IP: (*${ip}*)
date: ${DATE}
Approximate location: country ${coinfo}
Region: ${rinfo}
city: ${cinfo}
time zone: ${tinfo}
Note: Location data is approximate.
EOF
    )

    curl -s -d "chat_id=${USERID}&text=${TEXT}&disable_web_page_preview=true&parse_mode=markdown" "$URL" > /dev/null
fi

最后提醒

把修正后的脚本替换原文件后,记得给脚本加上执行权限(chmod +x /etc/profile.d/你的脚本名.sh),之后再通过SSH连接测试应该就不会报错啦!

备注:内容来源于stack exchange,提问作者ibraheem mohsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 14:27:46