bash - 使用 SSH 在远程服务器上运行命令,但遇到引号问题

标签 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) ;'"

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

有人可以帮忙吗?

谢谢:)

最佳答案

您不能在 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

关于bash - 使用 SSH 在远程服务器上运行命令,但遇到引号问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37275459/

相关文章:

bash - 在 WinSCP 中显示日期

postgresql - flyway 无法连接到 docker-entrypoint-initdb.d 脚本中的 postgres 容器

ssh - 通过ansible yum在CentOS 7上安装Xfce

node.js - Hastebin 服务器的 NPM 保持运行

java - PostgreSQL : syntax error at and near null

mysql - 如何从 shell 脚本执行 MySQL 命令?

bash - 新安装docker后无法运行docker命令

linux - 在 linux bash 中反转文件行顺序但对于 block 每 3 行

bash - 为什么grep会忽略包含要忽略的目录的shell变量?

php - 如何调试调用SQL语句的AJAX(PHP)代码?