2010-07-07 22 views
0

我想通过ssh在shell脚本中将登录详细信息传递给不同的机器。尽管我已经使用了for循环,但我最终会将所有登录信息发送给所有机器。有人可以帮助我吗?在循环中的ssh的参数

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 

一个例子$系统将包含:

abcde.unix.system.edu;username;password 

谢谢。

+0

是什么'$ allSystems'是什么样子?为什么在不需要时解析出用户名和密码? – 2010-07-07 15:03:20

回答

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的访问权限。

+0

感谢您的回复。我已经设置了ssh。我仍然需要发送所有这些信息,因为我的脚本需要它在目标服务器上。 – Nithin 2010-07-07 12:34:39

0

你的循环似乎试图追加登录​​信息对每一台机器到同一台机器上远程文件。你确定你打算追加?也许你的循环没有做什么,文件已经存在?

以ssh无法解决问题进行调试。替换以“回声”这一行:

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

,检查每个变量$系统,$机,$ username和$ password的是预期。

顺便说一句,更有效的写这个的方法可能是使用awk,sed甚至tr(取决于你的系统列表的格式)来提取这三个字段,然后使用一个shell -read循环遍历它们,从而避免每个访问的主机三次调用'awk'。例如,如果 “$ allsystems” 包含

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

,没有多余的栏或其他有害信息,你可以这样做:

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