我正在尝试使用fabric来自动执行我在几台服务器上执行的一些管理工作。一般流程如下:
sudo su -
成为root(再次提供本地用户密码)不幸的是,使用run('sudo su -')
会阻止脚本的执行并允许用户输入。当我键入exit
或Ctrl+D
时,scipt会恢复,但没有root权限。
我在Switching user in Fabric中看到了类似的问题,但我被限制为sudo su -
,因为我不允许更改包含以下行的/etc/sudoers
文件:
localuser ALL = /usr/bin/su -
我浏览了织物的来源,试图找到一种解决方法,但没有成功。
答案 0 :(得分:4)
遇到与您相同的问题(管理员仅允许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')
答案 1 :(得分:2)
您的问题有多种解决方案。首先,您希望使用sudo
运行命令。您可以使用结构方法sudo
代替run
runs a shell command on a remote host, with superuser privileges
(sudo ref)的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
另一个想法是你要包装一组命令(需要prefix
编辑)。
您可以使用Fabric上下文管理器(ref)来执行此操作。特别是,您可以使用settings
或with settings(user='root'):
run('do something')
run('do another thing')
。
例如:
{{1}}
一旦root密码问你,然后以root身份执行命令。 您可以通过tweek设置来存储密码。
答案 2 :(得分:0)
针对以下问题有一种解决方案Sorry, user localuser is not allowed to execute '/usr/bin/su - -c /bin/bash -l -c pwd' as root on hostname.
您可以尝试sudo('mkdir ~/test_fabric',shell=False)
。使用参数shell
来避免使用bash参数-l
。