以root身份运行fabric脚本
我正在尝试使用fabric来自动化我在几个服务器上进行的一些管理工作。大致流程如下:
- 用本地用户进行SSH连接
- 运行:
sudo su -
来切换到root用户(需要再次输入本地用户的密码) - 以root身份进行工作 :)
不过,使用run('sudo su -')
会阻塞脚本的执行,并且需要用户输入。当我输入exit
或Ctrl+D
时,脚本会继续运行,但没有root权限。
我在Fabric中切换用户的讨论中看到过类似的问题,但我只能使用sudo su -
,因为我不被允许更改/etc/sudoers
文件,而这个文件中有以下内容:
localuser ALL = /usr/bin/su -
我查看了fabric的源代码,试图找到解决办法,但没有成功。
3 个回答
针对这个问题,有一个解决办法:抱歉,用户 localuser 没有权限以 root 身份在主机上执行 '/usr/bin/su - -c /bin/bash -l -c pwd'。
你可以试试这个命令:sudo('mkdir ~/test_fabric',shell=False)
。这里使用了参数 shell
,是为了避免使用 bash 的 -l
参数。
你遇到的问题有几种解决办法。首先,你需要用 sudo
来运行命令。你可以用 Fabric 的 sudo
方法,代替 run
,这样就可以在远程主机上以超级用户的权限执行命令(查看 sudo 的说明)。
比如,下面这些命令是用 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
的命令包起来。你可以使用 Fabric 的上下文管理器(查看说明)来实现。特别是,你可以使用 prefix
或 settings
。
例如:
with settings(user='root'):
run('do something')
run('do another thing')
这会让你输入一次根用户的密码,然后以根用户的身份执行命令。你可以调整设置来保存密码。
我也遇到过和你一样的问题(只有管理员允许使用 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')