远程执行Cassandra cqlsh COPY命令失败,登录远程机器执行正常
解决远程执行Cassandra cqlsh COPY命令报错的问题
这个问题我之前也碰到过,核心原因是引号在多层shell解析中被破坏了——当你直接在本地通过ssh执行带双引号的命令时,本地shell会先解析外层的双引号,导致远程机器接收到的命令里丢失了必要的引号,最终触发「Improper Copy Command」错误。下面给你几个可行的解决方案:
方案1:转义双引号,让远程机器完整接收命令
在ssh命令里的双引号前加上反斜杠\,告诉本地shell不要解析这些引号,直接传递给远程机器。修改后的命令如下:
ssh xx.xxx.xxx.xx {path_to_cassandra}/bin/cqlsh xx.xxx.xxx.xx 9042 -e \"COPY {keyspace}.{table_name} TO '/tmp/file1.csv'\"
(注意:这里去掉了多余的sh,直接执行cqlsh命令即可,不需要额外套一层shell)
方案2:用单引号包裹整个-e参数
单引号在shell中不会解析内部的特殊字符,所以可以把-e后面的COPY命令用单引号包裹,避免本地shell干扰。如果命令里需要单引号,就用'\''来转义:
ssh xx.xxx.xxx.xx {path_to_cassandra}/bin/cqlsh xx.xxx.xxx.xx 9042 -e 'COPY {keyspace}.{table_name} TO '\''/tmp/file1.csv'\'''
或者更简洁的,把路径改用双引号包裹,这样内部不需要转义:
ssh xx.xxx.xxx.xx {path_to_cassandra}/bin/cqlsh xx.xxx.xxx.xx 9042 -e 'COPY {keyspace}.{table_name} TO "/tmp/file1.csv"'
方案3:用脚本文件执行(最稳妥,适合复杂命令)
如果觉得引号转义太麻烦,把命令写成一个单独的脚本文件,上传到远程机器后执行:
- 本地创建一个
copy_script.sh文件,内容如下:
#!/bin/bash {path_to_cassandra}/bin/cqlsh xx.xxx.xxx.xx 9042 -e "COPY {keyspace}.{table_name} TO '/tmp/file1.csv'"
- 上传脚本到远程机器:
scp copy_script.sh xx.xxx.xxx.xx:/tmp/
- 远程执行脚本:
ssh xx.xxx.xxx.xx "chmod +x /tmp/copy_script.sh && /tmp/copy_script.sh"
这三个方案都能让远程机器接收到和你手动登录后执行完全一致的COPY命令,解决「Improper Copy Command」的错误。
内容的提问来源于stack exchange,提问作者Navdeep Kaur
相关产品推荐
相关产品推荐

