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
相关产品推荐
相关产品推荐

