使用SSH在远程服务器上运行命令,但引号

时间:2016-05-17 11:55:54

标签: bash postgresql ssh

问题

所以我试图通过SSH对postgres数据库运行查询。我的命令如下:

ssh myserver.com sudo -u postgres psql -t -A -F"," -d web_user -c "'SELECT reltuples::BIGINT as estimate, relname FROM pg_class WHERE oid in ('user_1.info'::regclass, 'user_1.addresses'::regclass) ;'"

但我在查询中传递引号时遇到问题。以下是从上面的命令中提取的查询:

"'SELECT reltuples::BIGINT as estimate, relname FROM pg_class WHERE oid in ('user_1.info'::regclass, 'user_1.addresses'::regclass) ;'"

根据我的理解,外部双引号首先被删除,因此字符串变为:

'SELECT reltuples::BIGINT as estimate, relname FROM pg_class WHERE oid in ('user_1.info'::regclass, 'user_1.addresses'::regclass) ;'

现在我们有两对单引号(包含整个查询字符串的外部对,以及在我的查询中包含模式名称的内部对(例如'user_1.addresses'::regclass)。不幸的是,这些单引号围绕模式名称postgres要求,所以我不能删除它们或用双引号替换。

这是问题,第二次删除引号(通过SSH我猜?),查询无效,因为删除了模式名称周围的单引号:

SELECT reltuples::BIGINT as estimate, relname FROM pg_class WHERE oid in (user_1.info::regclass, user_1.addresses::regclass) ;

因此,对于postgres完全有效的'user_1.info'::regclass而不是user_1.info::regclass

我尝试了什么

我尝试转义架构名称中的单引号(请参阅:\'user_1.addresses\'::regclass):

ssh myserver.com sudo -u postgres psql -t -A -F"," -d web_user -c "'SELECT reltuples::BIGINT as estimate, relname FROM pg_class WHERE oid in (\'user_1.info\'::regclass, \'user_1.addresses\'::regclass) ;'"

我也试过从一个文件运行整个命令,但这很有效,但我试图在内联运行这个命令。据我所知,这是一个问题,如何删除引号(首先是所有双引号,然后是所有单引号),而我无法找到解决方案。

有人可以帮忙吗?

谢谢:)

1 个答案:

答案 0 :(得分:1)

您不能在shell中使用单引号内的转义单引号。

更好地使用here-doc并避免逃避问题:

ssh -t -t myserver.com sudo -u postgres psql -t -A -F"," -d web_user -c<<'EOF'
SELECT reltuples::BIGINT as estimate, relname FROM pg_class WHERE oid in ('user_1.info'::regclass, 'user_1.addresses'::regclass) ;
exit
EOF
相关问题