如何解决远程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
相关产品推荐
相关产品推荐

