我一直在努力解决来自" How do I use sudo to redirect output to a location I don't have permission to write to?"的解决方案。和" append line to /etc/hosts file with shell script"没有运气。
我想"追加10.10.10.10 puppetmaster"在/ etc / hosts的末尾。 (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文件仍然存在。 有人可以指出我做错了吗?
答案 0 :(得分:1)
您遇到的问题属于sudo
。
您尝试的代码使用参数sudo
和sh
调用-c" "10.10.10.10 puppetmaster"
。但是,>>
运算符的重定向是由周围的shell完成的,当然还有它的权限。
为了达到你想要的效果,尝试使用sudo启动一个shell,然后给出命令:
sudo bash -c 'sh -c" "10.10.10.10 puppetmaster" >> /etc/hosts"'
这样做可以解决问题,因为您使用bash
开始的sudo
具有超级用户权限,因此在尝试使用>>
执行输出重定向时不会失败。
要在Python中执行此操作,请使用:
subprocess.call("""sudo bash -c 'sh -c" "10.10.10.10 puppetmaster" >> /etc/hosts"'""", shell=True)
但是,当然,如果您运行具有超级用户权限的Python脚本(以sudo
启动),则所有这些都不是必需的,并且原始代码将起作用(没有额外的sudo
call
):
subprocess.call('sh -c" "10.10.10.10 puppetmaster" >> /etc/hosts"', shell=True)
答案 1 :(得分:1)
一旦使用sudo运行脚本,就可以很容易地在python中完成:
with open("/etc/hosts","a") as f:
f.write('10.10.10.10 puppetmaster\n')
打开a
将会附加。
答案 2 :(得分:1)
只需使用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")
答案 3 :(得分:0)
如果您没有升级整个脚本的权限,我建议您使用以下内容:
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()
然后你可以将任意内容写入进程的标准输入(p.stdin
)。