通过SSH命令远程执行命令首先需要建立相关主机间的信任关系。否则,在执行命令前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
接下来,就可以在不输入密码的情况下在远程主机私执行命令了。命令格式如下:
for ip in iplist
scp 文件名 $ip:/目录名
ssh $i /全路径文件名
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
否则,远程脚本可能报一些命令无法找到的错误。