用sudo管道命令

时间:2016-10-27 19:23:11

标签: linux bash shell scripting

我有一个成功运行此命令的脚本。我在另一个脚本中使用此命令,这使我在此行(.md5: Permission denied)上出错。

我正在使用sudo运行上一个脚本。

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

2 个答案:

答案 0 :(得分:4)

所以你想以root身份重定向输出。使用sudo执行命令并不重要,因为重定向不是执行的一部分,因此它不是由命令的执行用户执行的,而是由当前用户执行的。

常见的诀窍是使用tee

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

注意:我从sudo删除了md5sum,因为您可能不需要它。

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

答案 1 :(得分:0)

您获取sudo md5sum $i的输出并将其传递给未以root身份运行的sed。 sudo甚至不知道这个sed存在。

但这不是问题,因为sed不需要root权限。问题是> ${NAME}...。这会将sed的输出重定向到具有此名称的文件。但重定向实际上是由您的用户运行的shell执行的。因为>是一个shell内置运算符,所以不能用sudo作为前缀。

简单的解决方案是使用teetee是一个程序(所以你可以用sudo运行它),它将它的输入写入标准输出,也写入文件(如T-Pipe,因此名称)。 所以你可以:

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

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