linux利用ssh远程执行多台机器执行同样的命令

时间:2024-03-01 10:05:52
这篇文章主要介绍了ssh远程执行命令方法和Shell脚本实例,本文讲解了ssh执行远程操作方法和远程执行命令shell脚本示例,需要的朋友可以参考下

ssh执行远程操作
命令格式代码如下:

ssh -t -p$port $user@$ip “cmd” 
$port : ssh连接端口号
$user: ssh连接用户名
$ip:ssh连接的ip地址
-t :提供一个远程服务器的虚拟tty终端
cmd:远程服务器需要执行的操作
 

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向服务端发一次信号。

 

准备工作

基于公私钥认证或者用户名密码认证能确保登录到远程服务器(有点基本运维知识的人做这个事情都不是问题)

cmd如果是脚本,注意绝对路径问题(相对路径在远程执行时就是坑)

配置ssh免登录:

首先找一台管理机(随便那台机器什么配置都可以,只要能和远程执行的机器通信就行)

(1)ssh-keygen -t rsa.                   ###生成公钥/私钥对

(2)ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.162     ###拷贝到远程机器上,自动把cat id_rsa.pub >> .ssh/authorized_keys步骤执行。在对方目录下就会看到authorized_keys,否则,拷贝过去要手动执行这个命令

不足

这个命令可以满足我们大多数的需求,但是通常运维部署很多东西的时候需要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