Linux远程ssh执行命令expect使用及几种方法
expect命令实现脚本免交互
一、Linux下SSH无密码认证远程执行命令
在客户端使用ssh-keygen生成密钥对,然后把公钥复制到服务端(authorized_keys)。
实现步骤:
1、客户端机器创建密钥对
# ssh-keygen -t rsa #一直回车
2、登录需要执行命令的ssh服务器,创建.ssh目录,设置好目录权限
mkdir /root/.ssh
chmod 700 /root/.ssh
3、公钥上传到服务器,重命名为authorized.keys
scp /root/.ssh/id_rsa.pub root@服务端IP:/root/.ssh/authorized_keys #id_rsa.pub可以追加多个客户端的公钥
4、设置ssh服务器
vi /etc/ssh/sshd_config
RSAAuthentication yes #这三行取消注释,开启密钥对验证
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no #关闭密码验证
service sshd restart
5、免交互登陆测试,并查看远程主机home目录
ssh root@服务端IP "ls -l /home/"
二、expect工具实现免密交互
Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。
CentOS安装:yum install expect -y
CentOS离线安装方式:https://www.cnblogs.com/tozh/p/10096688.html
安装结束记得看一下expect的命令目录 :which expect
1、免交互查看远程主机内存

#!/bin/bash
user=root
pass='Admin@123'
ip='172.20.2.89'
/usr/local/bin/expect << EOF
set timeout
spawn ssh $user@$ip
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$pass\r"}
}
expect "root@*" {send "free -m\r"}
expect "root@*" {send "exit\r"}
expect eof
EOF
查看远程主机内存

2、批量执行命令

#!/bin/bash ip=`cat /root/ip.txt`
user=root
pass=Admin@ for i in $ip;
do
expect -c "
spawn ssh $user@$i
expect {
\"(yes/no)\" {send \"yes\r\"; exp_continue}
\"password:\" {send \"$pass\r\"; exp_continue}
\"root@*\" {send \"free -m\r exit\r\"; exp_continue}
}" done
expect批量执行命令
#注意:发现一经执行Ctrl+C是无法停止执行的,切记执行前要做好测试
参数说明:
set:可以设置超时,也可以设置变量
timeout:expect超时等待时间,默认10S
spawn:执行一个命令
expect "":匹配输出的内容
exp_continue:继续执行下面匹配
\r:可以理解为回车
$argc:统计位置参数数量
[lindex $argv 0]:脚本后第一个参数,类似于shell中$1,以此类推
puts:打印字符串,类似于echo
awk -v I="$ip":赋值变量
expect{...}:输入多行记录
其他参数说明:
timeout -1:永不超时退出
log_file /var/log/expect.log:记录交互信息,一般crontab时使用
interact:交互后不退出远程终端,如果加要把expect "root@*" {send "exit\r"}注释掉,如果不加,就直接退出
将spawn ssh root@$ip换成spawn ssh -o StrictHostKeyChecking=no root@ip既不会再提示是否将服务器计算机密钥加入本地known_hosts
补充:
#ssh root@$ip > /dev/null 2>&1 << eeooff
#ls /tmp/
#exit
#eeooff
#echo done!
需要输入密码
Linux远程ssh执行命令expect使用及几种方法的更多相关文章
- 模拟远程SSH执行命令的编解码说明
模拟一个SSH“远程”执行命令并获取命令结果的一个程序: 1.在C/S架构下,当客户端与服务器建立连接(这里以TCP为例)后,二者可以不断的进行数据交互.SSH远程可以实现的效果是客户端输入命令可以在 ...
- linux远程windows执行命令
Linux下远程连接windows,执行命令 - Feng______的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/feng______/article/deta ...
- 远程ssh执行命令时提示找不到命令
最开始的时候碰到这种问题,是在hadoop003上配置了jdk1.8, 在hadoop002上执行ssh hadoop003 java -version提示没有命令,先ssh hadoop003然后执 ...
- python-ssh-远程服务器+远程docker执行命令
在python语言中实现远程服务器执行命令+远程dcoker执行命令 def ssh_exec_command(ip, username, password, cmd=None): "&qu ...
- ssh 执行命令并实时显示结果
ssh 执行命令并实时显示结果 import paramiko def main(): sshClient = paramiko.SSHClient() sshClient.set_missing_h ...
- C#登录SSH执行命令,下载文件
前言 批量登录SSH执行命令 ,把应急响应中的日志文件下载回来. 代码实现 Renci.SshNet编译出DLL,引用. using System; using System.Collections. ...
- webpack命令局部运行的几种方法
webpack命令局部运行的几种方法 1. 第一种,先全局安装webpack 命令:npm install -g webpack 然后再在项目内安装 命令:npm install webpack ...
- SSH登录到远程linux机器并执行命令
一. 1.JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成 ...
- ssh远程连接linux服务器并执行命令
详细方法: SSHClient中的方法 参数和参数说明 connect(实现ssh连接和校验) hostname:目标主机地址 port:主机端口 username:校验的用户名 password:登 ...
随机推荐
- 使用Tensorflow搭建自编码器(Autoencoder)
自编码器是一种数据压缩算法,其中数据的压缩和解压缩函数是数据相关的.从样本中训练而来的.大部分自编码器中,压缩和解压缩的函数是通过神经网络实现的. 1. 使用卷积神经网络搭建自编码器 导入MNIST数 ...
- golang 标准库
前言 不做文字搬运工,多做思路整理 就是为了能速览标准库,只整理我自己看过的...... 最好能看看英文的 标准库 fmt strconv string 跳转 golang知识库总结
- 存储系列之 XFS文件系统简介
引言:磁盘容量越来越大,文件系统管理的文件也是越来越大.越来越多,如何破解?唯有快!于是动态分配.B+树开始登上舞台.还记得当年MySQL的索引结构吗,好的作品所见略同. 一.XFS为什么替换Ext4 ...
- C#,js和sql实用技巧选1
我刚开始.net 开发的那几年,差不多每天坚持搜集实用的技巧和代码片断.几年下来也搜集了上千条.现在选出一些不太容易找或者自己有较多体会的,写在这里.内容太多,分两次发. 1.上传文件超过设置允许的最 ...
- 『JWT』,你必须了解的认证登录方案
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- Js中的各种高度问题
一.屏幕宽高相关 屏幕高度就是你的整个屏幕高度(开机会亮的那片区域的高度),相关的其他高度划分很简单,就是以任务栏为分界线从而分为两部分. screen.height :屏幕高度. screen.wi ...
- Linux C++实现一服务器与多客户端之间的通信
通过网络查找资料得到的都是一些零碎不成体系的知识点,无法融会贯通.而且需要筛选有用的信息,这需要花费大量的时间.所以把写代码过程中用到的相关知识的博客链接附在用到的位置,方便回顾. 1.程序流程 服务 ...
- 如何在Linux上使用xargs命令
大家好,我是良许. 在使用 Linux 时,你是否遇到过需要将一些命令串在一起,但是其中一个命令不接受管道输入的情况呢?在这种情况下,我们就可以使用 xargs 命令.xargs 可以将一个命令的输出 ...
- 3d相册展示
示例代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...
- Java面试题(Java基础篇)
Java 基础 1.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...