【问题标题】:Pipe command with sudo使用 sudo 管道命令
【发布时间】:2016-10-27 19:23:10
【问题描述】:

我有一个脚本可以成功运行这个命令。我在另一个脚本中使用这个命令,这给了我这一行的错误 (.md5: Permission denied)。

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

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

【问题讨论】:

    标签: linux bash shell scripting


    【解决方案1】:

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

    常见的技巧是使用tee:

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

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

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

    【讨论】:

    • 我用上面的命令报错了((sed: -e expression #1, char 0: no previous regular expression))
    • @Sherry 看起来完全不相关。例如,如果$i 的值为空,就会发生这种情况。在md5sum ... 行前添加echo "i=$i" 行,并确保值正确
    【解决方案2】:

    您获取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
    

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

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2020-03-08
      • 2012-06-18
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多