使用sudo的管道命令

9

我有一个能够成功执行此命令的脚本。但是,当我在另一个脚本中使用此命令时,在此行(.md5: Permission denied)上出现错误。

我正在使用sudo运行之前的脚本。

for i in ${NAME}*
do
    sudo md5sum $i | sed -e "s/$i/${NAME}/" > ${NAME}.md5${i/#${NAME}/}
done
2个回答

12

所以您想将输出作为root重定向。由于重定向不是命令执行的一部分,因此它不由命令的执行用户执行,而是由当前用户执行。

常见的技巧是使用tee

for i in ${NAME}*
do
    md5sum $i | sed -e "s/$i/${NAME}/" | sudo tee ${NAME}.md5${i/#${NAME}/}
done

注意:我从md5sum中省略了sudo,因为你可能不需要它。

注意:tee会输出到两个方向:指定的文件和标准输出。如果你想要抑制标准输出上的输出,请将其重定向到/dev/null


我使用了上述命令,但出现了错误 (( sed: -e expression #1, char 0: no previous regular expression ))。 - Sherry
1
@Sherry 看起来这是一个完全不相关的问题。例如,如果 $i 的值为空,就会发生这种情况。在 md5sum ... 行之前添加一行 echo "i=$i",并确保该值正确。 - janos

2
您需要将sudo md5sum $i的输出传输到未以root身份运行的sed中。sudo甚至不知道这个sed的存在。
但这不是问题,因为sed不需要root权限。问题在于> ${NAME}...。这会将sed的输出重定向到具有此名称的文件中。但实际上,重定向是由作为用户运行的shell执行的。并且因为>是一个shell内置操作符,您无法使用sudo前缀它。
简单的解决方案是使用teetee是一个程序(因此您可以使用sudo运行它),它将其输入写入标准输出并且也写入文件(类似于T形管,因此得名)。 所以你只需要:
for i in ${NAME}*
do
    md5sum $i | sed -e "s/$i/${NAME}/" | sudo tee ${NAME}.md5${i/#${NAME}/}
done

请注意,这也会将所有哈希值转储到您的标准输出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接