shell 创建文件时For循环出错[重复]

wgx48brx  于 2023-01-26  发布在  Shell
关注(0)|答案(2)|浏览(126)
    • 此问题在此处已有答案**:

how to redirect output of echo over ssh to a file(2个答案)
sudo echo "something" >> /etc/privilegedFile doesn't work [duplicate](15个答案)
5年前关闭。
我对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根。
问题是当我在单独的服务器上运行echo "a b c" > /tcb/files/auth/x/xyz时,它运行得很完美。我的for循环中有什么问题导致了上面的错误。

dauxcl2d

dauxcl2d1#

您的命令被破坏了。它远程执行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
j13ufse2

j13ufse22#

这里有两个问题:

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

后者是因为something > output在运行something之前**打开output,因此,当/tcb/files/auth/x/xyz打开时,sudo甚至还没有启动!
相反,请考虑:

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

第一个问题解决了,因为重定向是在传递给ssh的字符串内,由远程shell运行(如果您传递给ssh一串独立的参数,它只是将它们与空格组合起来形成这样一个字符串;最好自己构造字符串,从而拥有更多的控制)。
第二个问题可以通过强制/tcb/files/auth/x/xyztee打开来解决,* 在 * tee的权限由sudo提升之后。

相关问题