日期:2014-05-16  浏览次数:20778 次

Linux下使用SSH非交互式远程执行命令脚本
原创文章,转载请注明— 作者: 黄文海 出处: http://viscent.iteye.com/
  
http://blog.viscenthuang.info
     非交互式在远程主机上执行命令或者脚本可以帮助我们快速完成一些任务。比如,在集群环境中,同时在各个结点上的日志文件中查询特定的关键字。
     通过SSH命令远程执行命令首先需要建立相关主机间的信任关系。否则,在执行命令前SSH命令会提示你输入远程主机的密码,这就产生了系统与人的交互,不利于脚本的自动化。建立主机间信任关系的方法如下:
假设我们有两台主机。主机名分别为linuxa和linuxb。首先在linuxa上以当前用户运行如下命令生成本主机的公钥和私钥文件:
ssh-keygen -t rsa
     上述命令执行后,隐藏目录~/.ssh下会出现两个文件:id_rsa和id_rsa.pub。其中,id_rsa.pub为公钥文件。将该文件的内容追加到对端主机linuxb上~/.ssh目录下的authorized_keys文件中。若该文件不存在,可自行创建之。下面是一个id_rsa.pub文件示例的文件内容:
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtbW/vKjrIkTfFjSJP9FyVb3kQStc31oBuiKVaCZzoejxSM2+ck6CB09l4BoFujpI0+omL4NptxkEAgkCGnMco2yXrVSOqhqyaQV2BnDPkyMoEq2MGB9hSc9xQKa+Q== viscent@viscent

     接下来,就可以在不输入密码的情况下在远程主机私执行命令了。命令格式如下:
     ssh 远程用户名@远程主机IP地址 ‘远程命令或者脚本’
     比如,
    ssh userA@192.168.0.6 'hostname'
    上述命令执行后,终端输出的是对端主机的主机名,而不是你当前登录的主机的主机名。说明hostname这个命令其实是在对端主机上运行的。
    若要远程执行脚本,只需要将上面的命令的第三个参数改为要执行的远程脚本的文件名全称即可。比如:
    ssh userA@192.168.0.6 '/home/userA/script/test.sh'
    需要特别注意的是:当远程脚本中使用了一些命令,而这些命令被Shell解析器的识别依赖于PATH环境变量时,该脚本需要在其第一行中包含执行profile文件的命令。比如,在Bash中,该脚本的第一行为:
    source ~/.bashrc
    否则,远程脚本可能报一些命令无法找到的错误。