python - Python Fabric Sudo su - 用户
问题描述
我目前从命令行执行以下操作:
$ ssh myuser@remote-server
password:
[myuser@remote-server ~]$ sudo su - dev_user
[dev_user@remote-server ~]$ whoami
dev_user
[dev_user@remote-server ~]$
没有权限问题。
myuser 有足够的权限来执行上面键入的操作,但它没有执行 sudo su -c whoami dev_user 的权限
我尝试了以下代码
from fabric import Connection, task
@task
def abcd(ctx):
sudo_pass = getpass.getpass("What's your sudo password?")
config = Config(overrides={'sudo': {'password': sudo_pass}})
with Connection('dev-server', user='myuser', connect_kwargs={"password": sudo_pass}, config=config) as c:
c.sudo('/bin/bash -l -c whoami', user='dev_user')
我得到以下输出:
fab abcd
What's your sudo password?
[sudo] password: Sorry, user myuser is not allowed to execute '/bin/bash -l -c whoami' as dev_user on dev-server.
有没有办法让面料做我从命令行做的事情?
编辑 sudoers 文件不是一种选择。
远程服务器是 Linux RH 7.6。
谢谢你。
解决方案
是的,您可以使用sudo
参数user=
来使用 sudo 切换到另一个用户,就像您在 shell 中所做的那样:
from fabric import Connection
c = Connection('host')
c.sudo('/bin/bash -l -c whoami', user='dev_user')
sudo接受附加参数
user
和group
参数,这些参数传递给 sudo 并允许您作为 root 以外的某个用户和/或组运行。在大多数系统上,sudo 程序可以采用字符串 username/group 或整数 userid/groupid (uid/gid);user
并且group
同样可以是字符串或整数。
http://docs.fabfile.org/en/1.14/api/core/operations.html?highlight=sudo#fabric.operations.sudo
sudo
只有当您无需输入密码即可运行时,上述解决方案才有效。如果您的帐户myuser
需要密码才能运行sudo
,那么您可以提示输入该密码,并将其传递给fabric
的配置:
import getpass
from fabric import Connection, Config
sudo_pass = getpass.getpass("What's your sudo password?")
config = Config(overrides={'sudo': {'password': sudo_pass}})
c = Connection('host', config=config)
c.sudo('/bin/bash -l -c whoami', user='dev_user')
http://docs.fabfile.org/en/2.3/getting-started.html#the-sudo-helper
最后一个想法:
from fabric import Connection, Config
config = Config(overrides={'sudo': {'user': 'sudo_user'}})
c = Connection('host', config=config)
c.sudo('whoami')
请注意,在这种情况下没有提供 sudo 密码,但user
在Config
设置中是 a 。并且c.sudo
改回了简单的c.sudo('whoami')
. 这应该sudo su - sudo_user
由 Fabric解释。
推荐阅读
- ruby-on-rails - 如何在 Rails 5 中使用 text_field 发送搜索查询(URL 参数)?
- c# - 检测活动 RDP 会话
- php - 使用数组和 PHP 查找匹配的相等顺序
- angular - 错误 TS2339:“Promise”类型上不存在属性“finally”
' - angular - 如何在 Angular 6 中使用 Observables 而不是 document.querySelector
- java - 引起:org.springframework.data.redis.serializer.SerializationException:无法反序列化;嵌套异常是 org.springframework.core.seriali
- java - 将 blob 转换为字符串以创建 json 对象,然后将字符串更改回 blob
- android - 如何从链接url中提取内容并将其保存在android中的sqlite
- php - Codeigniter redirect() 之后有什么方法可以在相同的滚动位置加载页面
- sql - Teradata 15:解析字符串