#!/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
に使用しないことですecho
。この問題を解決する他の方法はありますか?
二重引用符で囲まないと、なぜ-e
作成が終わりますか?doas.conf
私が走るとき
echo -e "permit $(whoami) as root
permit root as $(whoami)
permit nopass root as $(whoami)"|tee doas.conf
私のシェルでは、すべてがうまく機能し、必要な結果が得られます。 Pythonとなぜ違いますか?私はUbuntu 22.04 LTSを使用していますが、私のechoは-eをサポートしているようです。たとえば、echo -e "a\nb\nc" 改行で文字を印刷します。
答え1
他の実装は、andなどのオプションをecho
サポートまたはサポートしないか、andなどのCスタイルのバックスラッシュエスケープを-e
処理または処理しないためです。-n
\n
\t
これエコユーティリティは、XBDユーティリティ構文ガイド10で指定されているように、「--」パラメータを認識しません。 「--」は文字列オペランドとして認識されます。
実装はどのオプションもサポートしてはいけません。
代わりに使用してくださいprintf
。望むより:なぜprintfがechoより優れているのですか?
引用符(二重引用符または一重引用符)は、コマンドが実行される前にシェルで処理され、そのオプションを処理する機会があるため関係ありません。全体的に
echo -e foo
echo "-e" foo
echo '-e' foo
このecho
コマンドには2つのパラメータ-e
とが表示されますfoo
。