Linux使用expect实现免手动密码输入,linux免密码登陆
使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。
脚本代码如下:
##############################################
#!/usr/bin/expect
set timeout 30
spawn ssh -l username 192.168.1.1
expect "password:"
send "ispass\r"
interact
##############################################
1. [#!/usr/bin/expect]
这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。
注意:这一行需要在脚本的第一行。
2. [set timeout 30]
基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒
3. [spawn ssh -l username 192.168.1.1]
spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。
它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
4. [expect "password:"]
这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒
5. [send "ispass\r"]
这里就是执行交互动作,与手工输入密码的动作等效。
温馨提示: 命令字符串结尾别忘记加上“\r”,如果出现异常等待的状态可以核查一下。
6. [interact]
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行
#!/usr/bin/expect #注意安装的路径,不确定 whereis expect 一下
# Change a login shell to bash
set user [lindex $argv 0]
spawn bash $user
expect "]:"
send "/bin/bash "
expect eof
exit
使用expect自动登录
一,什么是expect?
在做系统管理时,我们很多时候需要输入密码,例如:连接 ssh,连接ftp,
那么如何能做到不输入密码吗?
我们需要有一个工具,能代替我们实现与终端的交互,
那么,就是它:expect,管理员的最好的朋友之一
它能够代替我们实现与终端的交互,我们不必再守候在电脑旁边输入密码,
或是根据系统的输出再运行相应的命令,
这些都可以由expect代替我们来完成
说明:expect到底是什么?
expect是一种脚本语言,使用起来非常简单,我们看后面的例子即可以了解到了
三,安装expect
备注:因为expect是基于tcl的,所以需要你的系统中安装有tcl
如何检查?
[root@dev ~]# whereis tcl
tcl: /usr/lib/tcl8.4 /usr/share/tcl8.4
如果看不到结果,请先安装tcl
安装,
[root@dev ~]# yum install expect
也可以从http://rpm.pbone.net下载for相应发行版的rpm包
四,使用expect自动登录的例子
1,程序例子的内容 :
先做功能 上的说明
此程序ssh登录到作为参数传递过来的ip地址上
然后执行: df -h
free -m
uptime
来检查系统的情况
[root@dev ~]# cat monitor_auto
#!/usr/bin/expect -f
#-------------------------------------------------- about us
# product: monitorone
# Author: liuhongdi <hongdi.liu@chinafotopress.com>
# Last Modified: 2008-05-13
# version: 0.3.2
# user:this script will help you to monitor many linux(unix) machine
# license: this script is based GPL
#-------------------------------------------------- set the variable,you can modify the value
set loginuser "root"
set loginpass {passwordonthishost}
set ipaddr [lrange $argv 0 0]
set timeout 300
set cmd_prompt "]#|~]?"
#-------------------------------------------------- login by ssh
spawn ssh $loginuser@$ipaddr
set timeout 300
expect {
-re "Are you sure you want to continue connecting (yes/no)?" {
send "yes\r"
} -re "assword:" {
send "$loginpass\r"
} -re "Permission denied, please try again." {
exit
} -re "Connection refused" {
exit
} timeout {
exit
} eof {
exit
}
}
expect {
-re "assword:" {
send "$loginpass\r"
}
-re $cmd_prompt {
send "\r"
}
}
#---------------------------------------------------- now,we do some commands
exec sleep 1
expect {
-re $cmd_prompt {
send "df -h\r"
}
}
exec sleep 1
expect {
-re $cmd_prompt {
send "free -m\r"
}
}
exec sleep 1
expect {
-re $cmd_prompt {
send "uptime\r"
}
}
exec sleep 1
#--------------------------------------------------
expect {
-re $cmd_prompt {
send "exit\r"
}
}
exit
#interact
2,程序 运行的显示结果
[root@dev ~]# ./monitor_auto 209.209.94.107
spawn ssh root@209.209.94.107
root@209.209.94.107's password:
Last login: Sun Feb 15 01:42:39 2009 from 201.103.105.49
[root@ws ~]#
[root@ws ~]# df -h
Filesystem ÈÝ ÒÑÓÃ ¿ÉÓÃ ÒÑÓÃ% ¹ÒÔصã
/dev/mapper/VolGroup00-LogVol00
133G 72G 55G 57% /
/dev/sda1 99M 13M 82M 14% /boot
none 1014M 0 1014M 0% /dev/shm
209.209.94.109:/www/pics
5.9T 5.6T 138G 98% /bank/bank1
[root@ws ~]# free -m
total used free shared buffers cached
Mem: 2026 1955 71 0 72 1621
-/+ buffers/cache: 261 1764
Swap: 1983 68 1915
[root@ws ~]# uptime
01:48:00 up 561 days, 8:53, 2 users, load average: 0.13, 0.09, 0.07
[root@ws ~]# [root@dev ~]#
四,对此程序的详细说明:
1,set loginuser "root"
set用来定义变量,定义之后的代码中可以使用所定义的变量
使用时注意需添加$符号
使用时的例子: spawn ssh $loginuser@$ipad
Linux使用expect实现免手动密码输入,linux免密码登陆的更多相关文章
- 在 Xamarin.Forms 实现密码输入EntryCell
在 Xamarin.Forms 中,我们通常使用 TableView 来构建输入表单.Xamarin 为我们提供了 EntryCell 用于输入文本,但是其并不支持密码输入,即密码掩码.这里要对 En ...
- Linux使用expect和rsync实现密码自动输入无人值守自动同步备份
我们常用sudo,ssh.ftp命令操作服务器或者修改权限的时候都会要求输入password,但是shell脚本运行中该如何交互实现自动输入密码呢? 下面总结三种实现方法. 一.重定向:用重定向方法实 ...
- SSH免密码登录Linux服务器
作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=587 操作环境: 客户机操作系统:Ubuntu Linux 服务器操作系统:CentOS Linux 免密登陆的原理: ...
- shell 脚本实战笔记(8)--ssh免密码输入执行命令
前言: ssh命令, 没有指定密码的参数. 以至于在脚本中使用ssh命令的时候, 必须手动输入密码, 才能继续执行. 这样使得脚本的自动化执行变得很差, 尤其当ssh对应的机器数很多的时候, 会令人抓 ...
- linux 免交互状态下修改用户密码
当利用某些工具对linux用户进行远程密码更改时,输入[ passwd 用户名 ] 后需要输入两次密码, 但是如果你利用的某些工具无法与linux进行交互的情况下,就没办法变更用户密码了,这个时候可以 ...
- 实现免密码输入 ssh 登录
实现免密码输入 ssh 登录假设 A 为客户机器, B 为目标机:要达到的目的:A 机器 ssh 登录 B 机器无需输入密码:加密方式选 rsa|dsa 均可以,默认 dsa做法:1.登录 A 机器2 ...
- linux下expect命令实现批量ssh免密
有时候我们需要批量发送ssh命令给服务器,但是有可能有些服务器是新加入的,还没有配置ssh免密,这个时候就会提示我们输入yes/no 或者password等,expect脚本命令就是用于在提示这些的时 ...
- git http服务免登录实现(免去每次请求用户名密码输入,Visual Studio可用)
最近用了Bonobo搭起了Git服务,弄了个批处理文件来避免每次都要输入用户名密码. 此脚本分为三个步骤:1.添加用户变量HOME:2.添加用户_netrc文件:3.添加windows普通凭据(因为V ...
- CentOS7 下使用root免密码输入自动登入gnome桌面
如果系统默认启动图形界面: vi /etc/gdm/custom.conf #找到[daemon],修改为下面的 [daemon] AutomaticLoginEnable=true Automati ...
- SecureCRT使用本地公钥 SSH 免密码登录Linux
其原理与Linux系统之间的SSH通道原理是一样的 下文中如果创建公钥的格式是:标准公钥和VanDyke私钥格式,需要用ssh-keygen -i -f 转换.如果是OpenSSH密钥格式可直接修改文 ...
随机推荐
- win7 win10双系统开机系统引导
以win7启动管理器引导作为启动引导 安装一个easybcd 然后里面添加引导选项(添加新条目---->编辑引导菜单(选择倒计时30秒)把use metro bootloader勾去掉就是默认的 ...
- November 17th, 2017 Week 46th Friday
If you shut the door to all errors, truth will be shut out. 你如果拒绝面对错误,真相也会被挡在门外. Sometimes being a f ...
- hadoop集群为分布式搭建
1.准备Linux环境设置虚拟机网络 1.0点击VMware快捷方式,右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改 ...
- Mojave使用pyenv安装python-zlib错误
mojave使用pyenv编译python出现 zipimport.ZipImportError: can't decompress data; zlib not available错误 解决方案: ...
- Django商城项目笔记No.8用户部分-注册接口实现
Django商城项目笔记No.8用户部分-注册接口实现 users的view.py中增加如下代码 class RegisterUserView(CreateAPIView): "" ...
- http-server
http-server是基于node.js的一个简单.零配置的命令行web服务器,可以方便实现跨域资源请求, #全局安装: npm install http-server -g: 全局安装后就可以通过 ...
- 【Odoo 8开发教程】第一章:Odoo 8.0安装
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/10779733.html odoo有三种常见的安装方式:打包程序安装.源码安装以及Docker镜像安装. 一:打 ...
- C++与C#互调dll的实现步骤
这篇文章主要介绍了C++与C#互调dll的实现步骤,dll动态链接库的共享在一些大型项目中有一定的应用价值,需要的朋友可以参考下 本文实例展示了C++与C#互调dll的实现步骤,在进行大型项目共享dl ...
- Python2.7-zlib
zlib 模块,提供了压缩和解压缩的函数,都是对字符串进行操作的,可以理解为是各种不同类型的数据经过处理成为字符串或是二进制字符串,再进行压缩解压缩.是和 gzip 相兼容的压缩模块 模块方法: zl ...
- Kafka设计解析(二十)Apache Flink Kafka consumer
转载自 huxihx,原文链接 Apache Flink Kafka consumer Flink提供了Kafka connector用于消费/生产Apache Kafka topic的数据.Flin ...