[英]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.