#!/usr/bin/env python3
from subprocess import run
from sys import modules
def main():
doas()
def doas():
ch = input("Ready to proceed with setting up doas?[Y/n]?")
if ch == 'y':
run("sudo passwd", shell=True)#If you would prefer to access the root account with su or by logging in directly, you must set a root password with "sudo passwd".
run("sudo apt install -y doas", shell=True)
run("""echo -e "permit $(whoami) as root
permit root as $(whoami)
permit nopass root as $(whoami)"|sudo tee /etc/doas.conf""", shell=True) and run("doas apt -y purge sudo", shell=True)
print("doas set up.")
else:
print("Run me again when you are ready.")
这段代码的问题在于它将选项放在-e
中doas.conf
,如下所示:
-e permit jim as root
permit root as jim
permit nopass root as jim
虽然我需要doas.conf
看起来像这样:
permit jim as root
permit root as jim
permit nopass root as jim
我知道最简单的快速解决方法就是不使用-e
with echo
。我还有其他方法可以解决这个问题吗?
如果没有用双引号括起来,为什么-e
最终会被写入?doas.conf
当我跑步时
echo -e "permit $(whoami) as root
permit root as $(whoami)
permit nopass root as $(whoami)"|tee doas.conf
从我的 shell (Bash) 中,然后一切正常,我得到了想要的结果。为什么它与Python不同?我使用的是 Ubuntu 22.04 LTS,我的 echo 似乎支持 -e,例如 echo -e "a\nb\nc" 它会打印带有换行符的字母。
答案1
因为不同的实现echo
要么支持或不支持像-e
and 之类的选项,要么处理或不处理像and 之-n
类的 C 风格反斜杠转义符。\n
\t
这回声实用程序不得按照 XBD 实用程序语法指南指南 10 指定的方式识别“--”参数; “--”应被识别为字符串操作数。
实现不应支持任何选项。
代替使用printf
。看:为什么 printf 比 echo 更好?
引号(双引号或单引号)与之无关,因为它们是在命令运行之前由 shell 处理的,并有机会处理其选项。在所有的
echo -e foo
echo "-e" foo
echo '-e' foo
该echo
命令看到两个参数-e
和foo
。