gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:23:53 25 4
gpt4 key购买 nike

问题

所以我试图通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com