2016-05-17 18 views
1

問題

所以我試圖通過SSH對postgres數據庫運行查詢。我的命令是這樣的:使用SSH在遠程服務器上運行命令,但遇到報價問題

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) ;

所以不是'user_1.info'::regclass,這是完全有效的Postgres的,我們得到這樣的: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

不能使用逃過殼單引號內的單引號。

更好地利用這裏-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 
+0

謝謝!我試過這個,但它就像psql不認可heredoc作爲參數。這裏是輸出:'psql:option需要一個參數 - 'c'' – foxygen

+0

雖然你可以使用'$'''進行ansi c轉義,並且可以在那裏轉義單引號。 – 123

+0

感謝@ 123,你會介意發佈完整的例子嗎? – foxygen

相關問題