以 root 身份运行结构脚本
Posted
技术标签:
【中文标题】以 root 身份运行结构脚本【英文标题】:Running fabric scripts as root 【发布时间】:2013-02-13 08:31:48 【问题描述】:我正在尝试使用结构来自动化我在几台服务器上执行的一些管理工作。一般流程如下:
-
SSH 与本地用户
运行:
sudo su -
成为root(再次提供本地用户密码)
以 root 身份完成工作 :)
不幸的是,使用run('sudo su -')
会阻止脚本的执行并允许用户输入。当我输入 exit
或 Ctrl+D
时,scipt 恢复,但没有 root 权限。
我在Switching user in Fabric 中看到了类似的问题,但我仅限于sudo su -
,因为我不允许更改包含以下行的/etc/sudoers
文件:
localuser ALL = /usr/bin/su -
我浏览了 fabric 的来源,试图找到解决方法,但没有成功。
【问题讨论】:
看看docs.fabfile.org/en/1.4.2/usage/env.html#sudo-prefix 和这个例子:***.com/questions/12641514/… 使用sudo_prefix='su - -c '
如该帖子所述需要root密码。如果我使用sudo_prefix='sudo su - -c '
,我会收到此错误消息Sorry, user localuser is not allowed to execute '/usr/bin/su - -c /bin/bash -l -c pwd' as root on hostname.
设置shell=False
似乎没有效果。设置pty=False
返回错误sudo: no tty present and no askpass program specified
【参考方案1】:
遇到了和你一样的问题,(管理员只允许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')
【讨论】:
这看起来是一个不错的解决方案,但它需要 python 在远程机器上。【参考方案2】:您的问题有多种解决方案。首先,您想使用sudo
运行命令。你可以使用fabric方法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
ed)。
您可以使用 Fabric 上下文管理器 (ref) 来执行此操作。特别是,您可以使用prefix
或settings
。
例如:
with settings(user='root'):
run('do something')
run('do another thing')
将询问您一次 root 密码,然后以 root 身份执行命令。 您可以调整设置来存储密码。
【讨论】:
这两种解决方案都不适合我。我尝试了第一个,sudo('pwd')
转换为sudo -S -p 'sudo password:' /bin/bash -l -c "pwd"
,我收到一条错误消息Sorry, user localuser is not allowed to execute '/bin/bash -l -c pwd' as root on hostname.
第二个解决方案意味着我有 root 密码,但我没有。
对于第二种解决方案,您不能使用您通常使用的密码来获得超级用户访问权限吗?【参考方案3】:
以下问题有一种解决方案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
。
【讨论】:
以上是关于以 root 身份运行结构脚本的主要内容,如果未能解决你的问题,请参考以下文章
以 root 身份运行 Node.js 脚本的 Elastic beanstalk
如何以用户而不是 root 用户身份运行 cron 作业 [关闭]