通过SSH远程执行psql查询时的引号问题求助
解决SSH远程执行psql带引号查询的问题
你的问题核心是本地Shell解析引号时提前拆分了远程命令,导致psql的-c参数只获取到部分查询语句,后续内容被当成多余参数。以下是几种可行的解决方法:
方法1:转义内部双引号
在本地命令中,把psql查询语句的双引号用反斜杠\转义,让本地Shell不会提前闭合外层双引号:
ssh user@host "psql -U USER -d DATABASE -c \"select A,B,C from TABLE where A='string1';\""
方法2:改用单引号包裹远程命令
用单引号包裹整个远程执行的命令,避免本地Shell解析内部引号。如果查询里有单引号,可以用'\''来转义(bash语法),或者利用PostgreSQL支持的双单引号写法:
方式A:转义单引号
ssh user@host 'psql -U USER -d DATABASE -c "select A,B,C from TABLE where A='\''string1'\'';"'
方式B:PostgreSQL双单引号写法
把查询里的'string1'改成''string1'',这样可以直接用单引号包裹整个命令:
ssh user@host 'psql -U USER -d DATABASE -c '\''select A,B,C from TABLE where A=''string1'';'\'''
方法3:通过本地脚本传递查询
如果查询逻辑复杂,建议把查询写到本地SQL脚本中,再通过SSH标准输入传递给psql:
- 创建本地脚本
query.sql:
select A,B,C from TABLE where A='string1';
- 执行远程命令:
ssh user@host "psql -U USER -d DATABASE -f -" < query.sql
错误原因说明
你之前的命令ssh user@host "psql -U USER -d DATABASE -c "select ...""中,本地Shell遇到第二个双引号时就会闭合外层的双引号,导致远程Shell收到的命令被拆分成不完整的片段。实际执行时,-c只拿到了"select,后面的A,B,C等都被当成psql的额外参数,因此出现忽略提示。而ssh user@host "psql -U USER -d DATABASE -c '\l'"能运行,是因为内部用了单引号,外层双引号没有被提前闭合,远程Shell收到的是完整的-c '\l'参数。
内容的提问来源于stack exchange,提问作者darthV
相关产品推荐
相关产品推荐

