对于循环在创建文件时给出错误

时间:2017-03-27 16:05:08

标签: shell ksh

我对for循环有疑问。将为您简要介绍一下。

$ for i in `cat serverss`;do ssh -q $i sudo echo "a b c" > /tcb/files/auth/x/xyz;done
ksh: /tcb/files/auth/x/xyz: cannot create

每当我尝试创建或修改文件时,我都会遇到错误。 serverss是包含服务器列表的文件文件。我们在这些系统上有sudo root。

问题是当我在各个服务器上运行echo "a b c" > /tcb/files/auth/x/xyz时它运行得很好。我的for循环中的问题是什么引起了我上面的错误。

2 个答案:

答案 0 :(得分:1)

你的命令越来越强烈。它远程执行sudo echo "a b c"并尝试将标准输出重定向到不存在的本地文件/tcb/files/auth/x/xyz

你应该以某种方式将其括起来,例如:

$ for i in `cat serverss`;do ssh -q $i "sudo echo 'a b c' > /tcb/files/auth/x/xyz";done

或者@CharlesDuffy可能会受到影响:

$ while read -r line; do ssh -q $line "sudo echo 'a b c' > /tcb/files/auth/x/xyz";done < serverss

答案 1 :(得分:0)

这里有两个问题:

  • 您在本地打开/tcb/files/auth/x/xyz,而不是在远程系统上打开。
  • sudo echo foo > bar 提供额外的权限以帮助您打开bar

后者是因为something > output在运行output之前打开something 。因此,sudo打开后,/tcb/files/auth/x/xyz甚至尚未启动!

相反,请考虑:

ssh -q "$i" 'echo "a b c" | sudo tee /tcb/files/auth/x/xyz >/dev/null'

第一个问题已解决,因为重定向位于传递给ssh的字符串内,由远程shell运行。 (如果你传递ssh一堆单独的参数,它只是将它们与空格组合起来形成这样一个字符串;最好自己形成字符串,从而有更多的控制权。)

第二个问题是通过在/tcb/files/auth/x/xyz tee tee升级其权限之后强制sudo打开{{1}}来解决的。