Python 以root用户身份运行结构脚本
我正在尝试使用fabric自动化一些管理工作,这些工作是我在两台服务器上完成的。一般流程如下所示:Python 以root用户身份运行结构脚本,python,sudo,fabric,su,Python,Sudo,Fabric,Su,我正在尝试使用fabric自动化一些管理工作,这些工作是我在两台服务器上完成的。一般流程如下所示: 本地用户SSH 运行:sudo su-成为root用户(再次提供本地用户密码) 以root用户身份执行此工作:) 不幸的是,使用run('sudosu-')会阻止脚本的执行并允许用户输入。当我键入exit或Ctrl+D时,scipt恢复,但没有root权限 我在中看到过类似的问题,但我仅限于sudo su-,因为我不允许更改包含以下行的/etc/sudoers文件: localuser ALL=/
sudo su-
成为root用户(再次提供本地用户密码)run('sudosu-')
会阻止脚本的执行并允许用户输入。当我键入exit
或Ctrl+D
时,scipt恢复,但没有root权限
我在中看到过类似的问题,但我仅限于sudo su-
,因为我不允许更改包含以下行的/etc/sudoers
文件:
localuser ALL=/usr/bin/su-
我浏览了fabric的来源,试图找到解决方法,但没有成功。有几种解决方案。首先,要使用
sudo
运行命令。您可以使用fabric方法sudo
而不是run
,该方法在远程主机上以超级用户权限运行shell命令
例如,使用sudo
执行这些命令:
sudo("~/install_script.py")
sudo("mkdir /var/www/new_docroot", user="www-data")
sudo("ls /home/jdoe", user=1001)
result = sudo("ls /tmp/")
另一个想法是,您希望包装一组命令(需要sudo
ed)。
您可以使用结构上下文管理器()来实现这一点。特别是,您可以使用前缀
或设置
例如:
with settings(user='root'):
run('do something')
run('do another thing')
将询问您一次root密码,然后以root身份执行命令。
您可以通过设置来存储密码。遇到了与您相同的问题,(管理员只允许sudo su-user
,sudo-u user-c cmd
不允许),下面是我使用fabric
的工作解决方案:
from ilogue.fexpect import expect, expecting, run
def sudosu(user, cmd):
cmd += ' ;exit'
prompts = []
prompts += expect('bash', cmd)
prompts += expect('assword:', env.password)
with expecting(prompts):
run('sudo su - ' + user)
def host_type():
sudosu('root', 'uname -s')
以下问题有一个解决方案对不起,不允许用户localuser在主机名上以root用户身份执行“/usr/bin/su--c/bin/bash-l-c pwd”。
您可以尝试sudo('mkdir~/test\u fabric',shell=False)
。使用paramshell
来避免bash param-l
看看这个例子:如那篇文章所述,使用sudo_prefix='su--c'
需要根密码。如果我使用sudo\u prefix='sudo su--c'
我会收到此错误消息对不起,不允许用户localuser在主机名上执行'/usr/bin/su--c/bin/bash-l-c pwd'作为根用户。
设置shell=False
似乎没有效果。设置pty=False
返回错误sudo:no tty present和no askpass program specified
这两种解决方案对我都不起作用。我尝试了第一个,而sudo('pwd')
转换为sudo-S-p'sudo密码:'/bin/bash-l-c“pwd”
,我收到一条错误消息对不起,不允许用户localuser在主机名上以root用户身份执行“/bin/bash-l-c pwd”。
第二个解决方案意味着我有root密码,而我没有。对于第二个解决方案,您不能使用通常用于获取超级用户访问权限的密码吗?这看起来是一个不错的解决方案,但它要求python位于远程计算机上。