【发布时间】:2015-10-28 07:53:22
【问题描述】:
问题:
我正在尝试执行一个从 PostgreSQL 数据库读取的 cmd。我可以手动切换到 root,然后切换到 postgre 用户并访问我想要的信息。
我遇到的问题是,当我运行它时,它只是挂起,没有任何反应。
我有root密码,从当前用户切换时需要这个密码但是没有提示我输入它。
我怎样才能让它不挂起并提示密码?
为简单起见,下面的代码仅执行“ls”。
代码:
def popen_cmd_shell(command):
print command
process = subprocess.Popen(command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=True)
proc_stdout = process.communicate()[0].strip()
return proc_stdout
if __name__ == '__main__':
querylist = popen_cmd_shell('su - root; ls;')
print querylist
更新一:
我无法在 Linux SUSE 上使用任何不附带 python 2.7 的库。我只需要执行一个命令并退出。
更新二:
我无法以 root 身份运行脚本,因为我需要执行其他需要我不是 root 身份的任务。
更新三:
根据 LeBarton 的建议,我已经获得了登录 root 的脚本,虽然 ls 命令永远不会以 root 身份执行,但它会以我原来的用户身份执行。当我运行该命令时,系统会提示我输入 root 密码并从 "@host" 转移到除了退出之外无法执行任何命令的 "host"。当我退出时,所有执行的命令都会出现输出。
我不希望像 LeBarton 那样将用户密码存储在代码中。如何以 root 身份执行命令并返回并继续脚本的其余部分,而不会被锁定到新用户并需要输入“退出”。
"stderr=subprocess.STDOUT" 似乎是导致它挂起的原因。
代码:
if __name__ == '__main__':
def subprocess_cmd(command):
process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
proc_stdout = process.communicate()[0].strip()
print proc_stdout
subprocess_cmd('echo a; su - root; ls; cd;ls;')
...continue with rest of script where I execute commands as original user
答案:
感谢 Tripleee 的出色回答。
我已经实现了我打算用以下代码做的事情:
if __name__ == '__main__':
def subprocess_cmd(command):
process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=False)
proc_stdout = process.communicate()[0].strip()
print proc_stdout
subprocess_cmd(['su','-','root','-c','su -s /bin/sh postgres -c \'psql -U msa ..........])
我只需要在 -c 之后以 root 身份执行的命令。所以它现在切换到 postgres 用户,然后从 root 中找到它需要的数据返回给普通用户。
【问题讨论】:
-
为什么不简单地创建脚本,然后使用 sudo 以 root 身份运行脚本?而且您甚至不需要 root 即可访问数据库。
-
(1) 您应该能够在不切换到 root 的情况下访问数据库。如果您不知道如何专门询问一个单独的问题 (2) 为避免被询问 root 密码,请使用
sudo,您可以配置为以 root 身份运行您的命令而无需密码:output = check_output(['sudo', 'get-db-data.sh'])。在我的系统上,如果您需要传递 root 密码但又想避免在源代码中对其进行硬编码,只需将一行文件放入/etc/sudoers.d/目录 (3) 就足够了,那么您可以使用root_password = getpass.getpass('root password:')来询问运行时的密码。
标签: python postgresql shell python-2.7 subprocess