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

如何解决远程SSH会话传递变量执行Cassandra查询的类型错误?

远程执行Cassandra CQL查询报错的解决方法

本地正常执行的命令

本地操作时,以下命令可正常查询:

export week='202328'

cqlsh -u $DSE_USERNAME -p $DSE_PASSWORD \
    -e "select backup_id,week,event_time,type,status from \"Opscenter_XXXXX\".backup_reports where week = '$week' and type='backup' LIMIT 1  ALLOW FILTERING ;" | tail -n +4 | head -n -2 

查询结果:

Opscenter_76a7068a-b567-4458-bdc8-3899253c32a2_2023-07-16-15-00-00-UTC | 202328 | 2023-07-16 15:00:00.000000+0000 | backup | success

远程SSH执行的报错情况

通过SSH远程执行时,以下两个命令均报错:

命令1

export week='202328'

ssh -q -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o BatchMode=yes $user@$host ". .bash_profile ;cqlsh -u $user -p  $password   -e 'select backup_id,week,event_time,type,status from \"Opscenter_XXXXX\".backup_reports where week = '$week'   LIMIT 1 ALLOW FILTERING ;'  | tail -n +4 | head -n -2  > lastbackup.txt"

错误信息:

<stdin>:1:InvalidRequest: Error from server: code=2200 [Invalid query] message="Invalid INTEGER constant (202328) for \"week\" of type text"

命令2

ssh -q -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o BatchMode=yes $user@$host ". .bash_profile ;cqlsh -u $user -p  $password   -e 'select backup_id,week,event_time,type,status from \"Opscenter_XXXX\".backup_reports where week = $week   LIMIT 1 ALLOW FILTERING ;'  | tail -n +4 | head -n -2  > lastbackup.txt"     

错误信息与命令1一致。

问题原因与解决方法

核心问题是SSH远程执行时的引号解析逻辑偏差:本地用双引号包裹CQL语句,$week会被替换成带单引号的字符串;但远程命令用单引号包裹CQL时,$week的替换结果没有被引号包裹,导致Cassandra收到的是数字类型值,而week字段为text类型,因此报错。

提供两种可行的解决方式:

方法1:在单引号命令块中转义单引号

修改远程命令的CQL部分,给$week添加转义的单引号,确保最终传入Cassandra的条件是week = '202328':

export week='202328'

ssh -q -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o BatchMode=yes $user@$host ". .bash_profile ;cqlsh -u $user -p  $password   -e 'select backup_id,week,event_time,type,status from \"Opscenter_XXXXX\".backup_reports where week = '\''$week'\''   LIMIT 1 ALLOW FILTERING ;'  | tail -n +4 | head -n -2  > lastbackup.txt"

这里'\''的作用是在单引号包裹的字符串中插入单引号,保证CQL语法正确。

方法2:改用双引号包裹远程命令块

将远程执行的整个命令用双引号包裹,同时转义内部的双引号(包括表名和CQL语句的引号):

export week='202328'

ssh -q -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o BatchMode=yes $user@$host ". .bash_profile ;cqlsh -u $user -p  $password   -e \"select backup_id,week,event_time,type,status from \\\"Opscenter_XXXXX\\\".backup_reports where week = '$week'   LIMIT 1 ALLOW FILTERING ;\"  | tail -n +4 | head -n -2  > lastbackup.txt"

这种方式下,$week会被本地shell正确替换,同时表名的双引号也能正确传递到远程的cqlsh中。


内容的提问来源于stack exchange,提问作者batuhan kırçova

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:06:27