簡體   English   中英

無法從本地python腳本在遠程服務器上運行psql命令

[英]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代碼可能有問題,因此,我嘗試通過簡單的命令(例如lscdmkdir甚至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運行的初始化。

有兩種簡單的解決方法:

  1. 使用“ -t”或“ -tt”選項運行ssh,這將導致ssh在遠程系統上為psql分配TTY。
  2. 更改遠程系統上的Shell啟動文件,以在非交互式會話上執行必要的初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM