[英]Unable to run psql commands on remote server from local python script
我正在編寫一個在本地調用的腳本,以在遠程服務器上運行psql查詢。 我正在使用subprocess模塊在Python 2.7中編寫腳本。 我正在使用subprocess.Popen SSH到遠程服務器並直接運行psql命令。 我的本地計算機是osx,我認為服務器是CentOS。
當我在本地調用腳本時,我得到一個錯誤,提示psql: command not found
。 如果我在遠程服務器上運行完全相同的psql命令,那么我將獲得正確的查詢結果。
我懷疑ssh代碼可能有問題,因此,我嘗試通過簡單的命令(例如ls
, cd
, mkdir
甚至scp
發送而不是通過psql命令發送到遠程服務器。 所有這些都工作正常,所以我認為我的代碼中沒有問題,ssh將命令傳遞給了遠程服務器。
有誰知道我的代碼出了什么問題以及為什么我找回psql: command not found
? 我研究並發現了這個較早的SO問題,但是psql已安裝在遠程服務器上,這一事實證明了我可以在那里手動運行psql命令。
PostgreSQL -bash:psql:找不到命令
從外部類文件:
def db_cmd(self, query):
# check that query ends in semicolon
if query[-1] != ';':
query = query + ';'
formatted_query = 'psql ' + self.db_string + \
' -c "begin; ' + query + ' ' + self.db_mode + ';"'
print formatted_query
ssh = subprocess.Popen(['ssh', self.host, formatted_query],
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
if not result:
error = ssh.stderr.readlines()
print >>sys.stderr
for e in error:
print 'ERROR: %s' % e,
else:
for r in result:
print r,
摘錄自上面的類並向遠程服務器發送psql命令的本地腳本的摘錄:
s = Jump(env, db_mode)
s.db_cmd('select * from student.students limit 5;')
在本地運行我的腳本。 請注意,該腳本會打印出psql命令進行調試。 如果我復制並粘貼相同的psql命令並在遠程服務器上運行它,我將獲得正確的查詢結果。
$ ./script.py 1 PROD ROLLBACK
psql -h <server_host> -d <db_name> -U <db_user> -p <port> -c "begin; select * from student.students limit 5; ROLLBACK;"
ERROR: bash: psql: command not found
謝謝
當您在遠程系統上為交互式會話運行ssh時,ssh會請求遠程系統的PTY(偽TTY)。 當您運行ssh在遠程系統上運行命令時,默認情況下ssh不會分配PTY。
擁有TTY / PTY會更改您的Shell初始化自身的方式。 您的實際問題是您需要執行以下任何一項或全部操作才能在遠程系統上運行psql:
您正在外殼啟動文件(例如,.bash_profile)中執行這些操作,並且僅在交互式會話中發生。 當您使用ssh遠程運行psql時,您的外殼會跳過允許psql運行的初始化。
有兩種簡單的解決方法:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.