为什么在将 sudo 与管道一起使用时我的权限被拒绝?

Why I've got Permission Denied when using sudo with pipe?

当我执行这条命令时:

sudo -u www-data grep -a 't=' /var/www/temp/w1_slave | cut -f2 -d= > /var/www/temp/temp.txt

我有错误:

Permission Denied

我做错了什么?用户 www-data/var/www/temp/temp.txt 的所有者,此用户也是 /var/www/temp/w1_slave 和整个 /var/www 目录的所有者。

命令:

sudo -u www-data grep -a 't=' /var/www/temp/w1_slave | cut -f2 -d=

工作正常,我也可以修改文件/var/www/temp/temp.txt

这里是ls -lh:

-rw-r--r-- 1 www-data www-data    5 paź 21 20:46 temp.txt
-rw-r--r-- 1 www-data www-data 4,0K paź 21 21:01 w1_slave

我正在尝试通过以下方式复制远程文件:

scp osmc@10.100.10.10:/sys/bus/w1/devices/28-000006140194/w1_slave /var/www/temp

并将输出存储到另一个文件中该文件的变量中。我可以在不在本地复制该文件的情况下从远程服务器执行 grep 吗?

当你做sudo时,它只涉及第一个命令,而不是管道后的第二个命令(|),与最后一个重定向(>)的方式相同没有创建文件的正确凭据。

如果您需要两个命令(包括重定向)到 运行 并具有 sudo 访问权限,那么您必须用 shell 包装它们,例如:

sudo -u www-data sh -c "grep -a 't=' /var/www/temp/w1_slave | cut -f2 -d= > /var/www/temp/temp.txt"

或使用sudo tee:

sudo -u www-data grep -a 't=' /var/www/temp/w1_slave | cut -f2 -d= | sudo tee /var/www/temp/temp.txt

这会将内容添加到文件中(同时打印出来)。如果您不想打印它,请将标准输出重定向到 > /dev/null.


grep 远程文件而不复制(scp 复制),请改用 ssh。只需 运行 与您通常 运行 相同的命令,但以 ssh user@host 为前缀,然后将其分配给变量,例如:

FOO=$(ssh osmc@10.100.10.10 "command")

这假定您已正确设置 SSH 密钥,因此它不会要求您输入密码。

要查看是否可行,首先通过以下方式手动检查命令:

ssh osmc@10.100.10.10 "whoami"
ssh osmc@10.100.10.10 "sudo -u www-data whoami"

为了调试,将 -x 添加到您的 shebang 或将多个 -v 添加到您的 ssh。