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 文件创建成功。

有人可以帮我吗?

4

2 回答 2

4

考虑这样做:

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

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

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

于 2013-11-02T01:44:44.763 回答
3
sudo -u $SUDO_USER echo "some text" >> /home/$SUDO_USER/filename

sudoecho "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,并且它应该具有写入输出文件的权限。

于 2013-11-02T00:43:18.183 回答