首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >织物差异sudo()运行(‘sudo cmd')

织物差异sudo()运行(‘sudo cmd')
EN

Stack Overflow用户
提问于 2016-07-13 07:25:42
回答 2查看 5.8K关注 0票数 6

我想知道函数sudo()和函数run('sudo -u user smth')之间有什么区别

在医生身上有:

sudo在所有运行方式上都是相同的,只不过它总是在调用sudo程序时包装给定的命令,以提供超级用户权限。

但是有几次,sudo('cmd')会提示我一个密码,但是如果我用run('sudo cmd')进行切换,它就不会提示我任何提示。两者之间有什么变化吗?(我记得有人这样说过,sudorun(sudo cmd)的用途不同,但我找不到)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-11 12:27:58

我发现了这两个不同之处。

1:Fabric维护内存中的密码。

2:sudo接受其他用户和组参数。

首先,当使用sudo()时,fabric将从缓存中获取密码,然后不需要输入密码。但是,如果使用run('sudo‘),则需要为每个“sudo”输入密码。

其次,如果您想执行一个命令,而不是在根用户下执行命令,而是执行其他用户组,比如www,您只需要设置env.sudo_user = 'www‘或sudo('cmd',user='www')。第一个将在www下执行每个sudo(),第二个将在www下执行这个单个cmd。但是当使用run()命令时,需要编辑以运行(“sudo -u 'www‘cmd")。

代码语言:javascript
复制
from fabric.api import sudo, run, env

env.hosts = ['host_ip',]
env.user = 'user_name'
env.sudo_user = 'sudo_user'


def test_1():
    run('sudo pwd')

def test_2():
    sudo('pwd')



$ fab -I --show=debug test_1 test_2
Initial value for env.password:   # enter password
Commands to run: test_1, test_2
Parallel tasks now using pool size of 1
[ip_address] Executing task 'test_1'
[ip_address] run: /bin/bash -l -c "sudo pwd"
[ip_address] out: [sudo] password for billy:   # needs to enter password here
[ip_address] out: /home/billy
[ip_address] out: 

Parallel tasks now using pool size of 1
[ip_address] Executing task 'test_2'
[ip_address] sudo: sudo -S -p 'sudo password:'  -u "root"  /bin/bash -l -c  "pwd"
[ip_address] out: sudo password:  # only prompt, do not need enter password
[ip_address] out: /home/billy
[ip_address] out: 


Done.
Disconnecting from ip_address... done.
票数 3
EN

Stack Overflow用户

发布于 2018-12-28 21:47:13

从Fabric 2开始,您可以通过run()调用run(),除非使用自动响应程序这里的细节,否则会提示输入密码。请注意,sudo命令通常远程缓存密码,因此在同一连接期间对sudo的下一次调用将不会提示输入密码。

然而,Fabric sudo()助手使得使用sudo更加容易,这里的细节。您需要确保sudo.password配置值被填充(通过配置对象、配置文件、环境变量或--prompt-for-sudo-password)。下面是我如何处理钥匙圈模块的方法:

代码语言:javascript
复制
from fabric import task
import keyring

@task
def restart_apache(connection):
    # set the password with keyring.set_password('some-host', 'some-user', 'passwd')
    connection.config.sudo.password = keyring.get_password(connection.host, 'some-user')
    connection.sudo('service apache2 restart')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38345184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档