首页 文章

为什么我不能将文本重定向到文本文件?

提问于
浏览
3

我正在编写一个必须以管理员权限(sudo)运行的bash shell脚本 .

我正在运行以下命令

sudo -u $SUDO_USER touch /home/$SUDO_USER/.kde/share/config/kcmfonts > /dev/null
sudo -u $SUDO_USER echo "[General]\ndontChangeAASettings=true\nforceFontDPI=96" >> /home/$SUDO_USER/.kde/share/config/kcmfonts

第一个命令成功并创建文件 . 但是,第二个命令会出现以下错误:

无法创建/home/username/.kde/share/config/kcmfonts:权限被拒绝

我无法理解为什么这会导致权限错误 . 我正在以调用sudo的用户身份运行该命令,因此我应该有权写入此文件 . kcmfonts文件已成功创建 .

有人可以帮我吗?

2 回答

  • 3
    sudo -u $SUDO_USER echo "some text" >> /home/$SUDO_USER/filename
    

    sudo 执行命令 echo "some text" 为“$ SUDO_USER” .

    但重定向是在您的帐户下完成的,而不是在 $SUDO_USER 帐户下 . 重定向由shell进程处理,这是您的进程,不受 sudo 的控制 .

    试试这个:

    sudo -u $SUDO_USER sh -c 'echo "some text" >> /home/$SUDO_USER/filename'
    

    这样, sh 进程将由 $SUDO_USER 执行,这是处理重定向的过程(并将写入输出文件) .

    根据命令的复杂程度,您可能需要使用转义引号和其他特殊字符来玩一些游戏 . 如果这太复杂了(可能是这样),你可以创建一个脚本:

    $ cat foo.sh
    #!/bin/sh
    echo "some text" >> /home/$SUDO_USER/filename
    $ sudo -u $SUDO_USER ./foo.sh
    

    现在它是在 $SUDO_USER 帐户下运行的 ./foo.sh 命令(以 /bin/sh ./foo.sh 执行),它应该有权写入输出文件 .

  • 3

    考虑这样做:

    echo "some text" | sudo -u $SUDO_USER tee -a /home/$SUDO_USER/filename
    

    tee命令可以帮助您将输出定向到文件 . tee的 -a 选项用于追加(如 >> )没有它你会破坏文件(如 > ) .

    您不需要使用提升的privs执行左侧(虽然它只是echo,这是一个习惯形成的好事),您只需要提升的privs来写入文件 . 因此,使用此命令,您只能提升tee的权限 .

相关问题