我正在编写一个必须使用管理员权限(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文件已成功创建。
有人能帮助我吗?
答案 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的权限。