我目前从命令行执行以下操作:
$ 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。
谢谢。
以下作品:
c.run("echo 'whoami' | sudo su - dev_user")
c.run("echo 'cd /some/directory && ./somescript.sh' | sudo su - dev_user")
使用paython 3x
和fabric 2.4.0
你可以像这样使用它
使用pip pip3 install fabric>=2.4.0
安装面料
from fabric import Connection as connection, task
@task
def executeTask(ctx):
with connection(host=dev_server, user=myuser) as c:
c.run('sudo su - dev_user')
将此代码放在名为fabfile.py的文件中,并通过命令行fab executeTask
执行此命令来运行它。
是的,你可以使用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
。并且c.sudo
变回简单的c.sudo('whoami')
。这应该被Fabric解释为sudo su - sudo_user
。