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

时间:2013-11-02 00:33:56

标签: bash

我正在编写一个必须使用管理员权限(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 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:3)

考虑这样做:

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

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

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