【问题标题】:Why I've got Permission Denied when using sudo with pipe?为什么在管道中使用 sudo 时权限被拒绝?
【发布时间】:2016-01-20 22:01:11
【问题描述】:

当我执行这个命令时:

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=

工作正常,我也可以通过这个用户修改 file/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 而不在本地复制该文件吗?

【问题讨论】:

  • superuser.com 要求命令行更好,因为这不是真正的编程问题。

标签: shell command-line ssh grep sudo


【解决方案1】:

当您执行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。

【讨论】:

  • 谢谢,它运作良好。你能帮我解决第二个问题吗?
  • @user1815887 已添加,如果足够清楚或需要进一步解释,请告诉我。
  • 该命令应该有效吗? sudo -u www-data sh -c "FOO=$(ssh osmc@10.100.10.10 "grep -a 't=' /sys/bus/w1/devices/28-000006140194/w1_slave | cut -f2 -d=") > /var/www/temp/temp.txt"
  • 我刚刚使用了:sudo -u www-data sh -c "FOO=$(ssh -vv osmc@10.100.10.10 "grep -a 't=' /sys/bus/w1/devices/28-000006140194/w1_slave | cut -f2 -d=") | echo $FOO >> /var/www/temp/temp.txt" 非常感谢您的帮助!但是还有另一个问题 - 我只需要存储实际变量,并且此命令将新的附加到现有文件。
  • @user1815887 所以根本不要使用sudo tee,它会自动将输出重定向到变量。你不需要任何temp.txt。根据您的主要内容,将其存储到变量中,或将其存储在临时文件中。
猜你喜欢
  • 2015-04-16
  • 2017-03-01
  • 2022-01-03
  • 1970-01-01
  • 2020-03-23
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
相关资源
最近更新 更多