我对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循环中的问题是什么引起了我上面的错误。
答案 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}}来解决的。