创建文件时for循环出错

For loop giving error while creating file

我对 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 是具有 servers.We 列表的文件文件,在这些系统上具有 sudo 根目录。

问题是当我 运行 echo "a b c" > /tcb/files/auth/x/xyz 在单独的服务器上 运行 完美。我的 for 循环中出现了上述错误的问题是什么。

你的命令越来越乱了。它远程执行 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

这里有两个问题:

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

后者是因为 something > output 在 之前打开 output 它 运行s 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 一堆单独的参数,它只是将它们与空格组合成这样一个字符串;最好自己形成字符串,从而有更多的控制权)。

第二个问题是通过 tee 强制打开 /tcb/files/auth/x/xyz 解决的, tee 的权限被 sudo.