使用带管道的sudo时,为什么我的权限被拒绝?

时间:2015-10-21 19:03:18

标签: shell command-line ssh grep sudo

执行此命令时:

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

我有错误:

  

拒绝权限

我做错了什么?用户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而不在本地复制该文件吗?

1 个答案:

答案 0 :(得分:0)

执行sudo时,它仅与第一个命令相关,而不是与管道(|)之后的第二个命令相同,与上一个重定向(>)没有相同t有正确的凭据来创建文件。

如果你需要两个命令(包括重定向)来运行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。