ssh -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o StrictHostKeyChecking=no $ip “command”
安全
1 ConnectTimeout=3 链接时超时时间,3秒
2 ConnectionAttempts=5 链接失败后重试次数,5次
3 PasswordAuthentication=no 是否使用密码认证,(在遇到没作信任关系时很是有用,否则会卡在那里)
4 StrictHostKeyChecking=no 第一次登录服务器时自动拉取key文件,(跟上面同样,而且在第一次ssh登录时,自动应答yes)
5 ServerAliveInterval=60 设置保持链接时间,即为了保持会话,每隔60s向服务端发一次信号。bash
准备工做服务器
基于公私钥认证或者用户名密码认证能确保登陆到远程服务器(有点基本运维知识的人作这个事情都不是问题)运维
cmd若是是脚本,注意绝对路径问题(相对路径在远程执行时就是坑)ssh
配置ssh免登陆:post
首先找一台管理机(随便那台机器什么配置均可以,只要能和远程执行的机器通讯就行)rest
(1)ssh-keygen -t rsa. ###生成公钥/私钥对code
(2)ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.162 ###拷贝到远程机器上,自动把cat id_rsa.pub >> .ssh/authorized_keys步骤执行。在对方目录下就会看到authorized_keys,不然,拷贝过去要手动执行这个命令blog
不足
这个命令能够知足咱们大多数的需求,可是一般运维部署不少东西的时候须要root权限,可是有几处限制:
远程服务器禁止root用户登陆
在远程服务器脚本里转换身份用expect须要send密码,这样不够安全
示例脚本
#!/bin/bash
#变量定义
ip_array=("192.168.0.162") ##主机列表能够写在括号里,多个主机空格分割,也能够写个文件-主机清单
user="root"
remote_cmd="/etc/init.d/sshd restart"
port="22"
#本地经过ssh执行远程服务器的脚本
for ip in ${ip_array[*]}
do
ssh -t -p${port} ${user}@${ip} "${remote_cmd}" >> /var/log/ssh.log
done

