循环中ssh的参数

时间:2010-07-07 12:06:57

标签: shell ssh loops

我正在尝试通过shell脚本中的ssh将登录详细信息传递到不同的计算机。即使我使用了for循环,我最终还是将所有登录信息发送到所有机器。有人可以帮帮我吗?

    for system in ${allSystems}
    do
        machine=`echo $system | awk -F ";" '{print $1}'`
        username=`echo $system | awk -F ";" '{print $2}'`
        password=`echo $system | awk -F ";" '{print $3}'`

        echo "$machine;$username;$password" | ssh $machine 'cat >> loginDetails.txt'    
    done

示例$ system将包含:

abcde.unix.system.edu;username;password

谢谢。

4 个答案:

答案 0 :(得分:2)

在远程服务器上设置ssh authorised_keys会更有意义吗?这样,您的脚本就不必输入密码了。

假设您的远程计算机名为remote_machine:

在您的本地计算机上:

scp ~/.ssh/id_rsa.pub remote_machine:~/.ssh/source.pub

这些步骤发生在远程机器上:

ssh remote_machine
cd .ssh
if [ -e "authorized_keys" ]; then 
    cat source.pub >> authorized_keys 
else 
    mv source.pub authorized_keys
fi

如果您遇到问题,请按照此HOWTO中的说明操作。

在任何生产计算机上运行任何代码之前,请确保您了解自己在做什么。这样,任何登录到您的盒子的人都可以访问remote_machine。

答案 1 :(得分:0)

但是你不想这样做,试着编写一个期望脚本

http://en.wikipedia.org/wiki/Expect

答案 2 :(得分:0)

是的,公钥/私钥对可以很好地解决您的问题。

http://novosial.org/openssh/publickey-auth/

答案 3 :(得分:0)

您的循环似乎正在尝试将每台计算机的登录详细信息附加到同一台计算机上的远程文件中。你确定要附加吗?也许你的循环什么都不做,文件已经存在了?

通过ssh解决问题进行调试。用'echo'替换以'echo'开头的行:

  echo "$system => machine:$machine username:$username password:$password"

并检查每个变量$ system,$ machine,$ username和$ password是否符合预期。

BTW,一种更有效的写入方式可能是使用awk,或sed,甚至tr(取决于系统列表的格式)来提取三个字段,然后使用shell同时 - 读循环迭代它们,从而避免每个主机访问的'awk'三次调用。例如,如果“$ allsystems”包含

  mach1;user1;pass1 mach2;user2;pass2 mach3;user3;pass3

没有无关的字段或其他不需要的信息,您可以使用:

  echo "$allsystems" | tr '; ' '\t\n' | while read mach user pass
  do
      echo ...
  done