繁体   English   中英

python3 - 使用sudo的子进程>>追加到/ etc / hosts

[英]python3 - subprocess with sudo to >> append to /etc/hosts

我一直在努力解决“ 如何使用sudo将输出重定向到我无权写入的位置? ”和“ 使用shell脚本将行附加到/ etc / hosts文件 ”的解决方案,但没有运气。

我想在/ etc / hosts的末尾“追加10.10.10.10 puppetmaster”。 (Oracle / Red-Hat linux)。

一直尝试变化:

subprocess.call("sudo -s", shell=True)

subprocess.call('sudo sh -c" "10.10.10.10 puppetmaster" >> /etc/hosts"', shell=True)

subprocess.call(" sed -i '10.10.10.10 puppetmaster' /etc/hosts", shell=True)

但/ etc / hosts文件仍然存在。 有人可以指出我做错了什么吗?

您面临的问题在于sudo的范围。

您尝试的代码使用参数sh-c" "10.10.10.10 puppetmaster"调用sudo 。然而, >>运算符的重定向由周围的shell完成,当然还有其权限。

为了达到你想要的效果,尝试使用sudo启动一个shell,然后给出命令:

sudo bash -c 'sh -c" "10.10.10.10 puppetmaster" >> /etc/hosts"'

这样做可以解决问题,因为你使用sudo启动的bash具有超级用户权限,因此在尝试使用>>执行输出重定向时不会失败。

要在Python中执行此操作,请使用以下命令:

subprocess.call("""sudo bash -c 'sh -c" "10.10.10.10 puppetmaster" >> /etc/hosts"'""", shell=True)

但是,当然,如果您已经使用超级用户权限(以sudo启动它)运行Python脚本,则所有这些都不是必需的,并且原始代码将起作用(在call没有额外的sudo ):

subprocess.call('sh -c" "10.10.10.10 puppetmaster" >> /etc/hosts"', shell=True)

一旦用sudo运行脚本,你就可以很容易地在python中完成它:

with open("/etc/hosts","a") as f:
    f.write('10.10.10.10 puppetmaster\n')

开放与a将追加。

只需使用dd

subprocess.Popen(['sudo', 'dd', 'if=/dev/stdin',
    'of=/etc/hosts', 'conv=notrunc', 'oflag=append'],
    stdin=subprocess.PIPE).communicate("10.10.10.10 puppetmaster\n")

如果您没有升级整个脚本的权限,我建议您使用以下内容:

p = subprocess.Popen(['sudo', 'tee', '-a', '/etc/hosts'],
                     stdin=subprocess.PIPE, stdout=subprocess.DEVNULL)
p.stdin.write(b'10.10.10.10 puppetmaster\n')
p.stdin.close()
p.wait()

然后,您可以将任意内容写入进程的stdin( p.stdin )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM