当前位置:首页 » 编程软件 » expect脚本登录

expect脚本登录

发布时间: 2022-05-09 14:43:30

Ⅰ 如何用expect写一个自动登录脚本

1.安装expect

需要先安装tcl:apt-get install tcl

apt-get install expect

2.expect使用

2.1一个简单的输入密码操作

#!/usr/bin/expect

set timeout 100

set password "123456"

spawn sudo rm -rf zzlogic

expect "root123456"

send "$password "

interact

说明:

第一行#!/usr/bin/expect表示使用expect的shell交互模式

set是对变量password赋值

set timeout 100:设置超时时间为100秒,如果要执行的shell命令很长可以设置超时时间长一些。expect超过超时时间没有监测到要找的字符串,则不执行,默认timeout为10秒

spawn在expect下执行shell脚本

expect对通过spawn执行的shell脚本的返回进行判断,是否包含“”中的字段

send:如果expect监测到了包含的字符串,将输入send中的内容, 相当于回车

interact:退出expect返回终端,可以继续输入,否则将一直在expect不能退出到终端

2.2expect的命令行参数

[lindex $argv n]获得index为n的参数(index从0开始计算)

$argc为命令行参数的个数

[lrange $argv 0 0]表示第一个参数

[lrange $argv 0 3]表示第1到第3个参数

例如scp_service.sh文件,可以./scp_service.sh -rm来执行,这时是赋值了一个参数

set option [lindex $argv 0](获得第一个参数存到变量option中,参数是的index是从0开始计算的)

2.3if...elif...else...

expect支持if语句,

if {条件1} {

条件1执行语句

} elif {条件2} {

条件2执行语句

} else {

其他情况执行语句

}

说明:

1.if的条件用{}来包含条件

2.if和后面的{}必须有空格隔开

3.两个花括号之间必须有空格隔开,比如if {} {},否则会报错 expect:extra characters after close-brace

3.使用{来衔接下一行,所以if的条件后需要加左花括号{

4.else不能单独放一行,所以else要跟在}后面

2.4 expect {},多行期望,匹配到哪条执行哪条

背景:有时执行shell后预期结果是不固定的,有可能是询问是yes/no,有可能是去输入密码,所以可以用expect{}

花括号内放多行语句,从上至下匹配,匹配到哪个expect执行哪句。

3.shell中调用expect来实现登录

我是通过在shell脚本中执行expect脚本的方式来实现的。当然可以将shell中定义的一些变量传递给expect脚本作为参数输入。

linux下expect脚本问题

#!/usr/bin/expect-f

if{$argc!=1}{
puts"usage:$argv0IP"
exit1
}else{
setIP[lindex$argv0]
}

setpingcmd[format"ping-c100%s"$IP]

settimeout6000

#比如远程用户叫做test
setdestusertest
#比如远程服务器IP为如下
setdestip192.168.0.123
setdestpath"$destuser@$destip"
#比如用户密码叫做test
setdestpasswordtest

#ssh登录
spawnssh$destpath

#######################
expect{
-re".*yes/no.*"{
exp_send"yes "
exp_continue
}
-re".*assword.*"{
exp_send"$destpassword "
}
}

#比如ssh登录以后的提示符是test@Testserver>
expect{
-re".*test@Testserver.*"{
exp_send"$pingcmd "
}
}

expect{
#如果输出timeout字符,则Control+C结束pingcmd
#这里用的是DestinationHostUnreachabl替换timeout。因为本人机器上没有timeout.
-re".*DestinationHostUnreachabl.*"{
#输入Control+c
exp_send"03"

#Control+c后必然输出登录提示符,再输入期望执行的命令
expect{
-re".*test@Testserver.*"{
#假设希望执行的命令是ls
exp_send"ls "
}
}

#执行完ls之后退出
expect{
-re".*test@Testserver.*"{
exp_send"exit "
}
}
}

#如果没有输出timeout字符,退出。
-re".*test@Testserver.*"{
exp_send"exit "
}
}

interact

Ⅲ 如何在脚本里面自动输入密码

shell脚本在处理自动循环或大的任务方面可节省大量的时间,通过创建一个处理任务的命令清单,使用变量、条件、算术和循环等方法快速创建脚本以完成相应工作,这比在命令行下一个个敲入命令要省时省力得多。
但是有时候我们可能会需要实现和交互程序如ftp,telnet服务器等进行交互的功能,这时候我们需要用到shell的自动交互功能.
最简单的例子就是创建用户,我创建100个用户,初始密码为123,那么要是挨着passwd username ,交互性输入密码,那不得疯掉,但是脚本里应该怎么写呢?将密码123,输入到passwd命令?
本文收集了较常用交互方法,并进行了比较和总结。
自动交互方法一:利用命令的自带参数,将标准输入作为手动输入的内容
自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向,在shell编程中有这样一种用法(参考Linux与UNIX SHELL编程指南 chapt 5.7):"command <<delimiter p="" 从标准输入中读入,直至遇到delimiter分界符。?
重定向操作符command <<delimiter是一种非常有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, p="" shell就知道输入结束了。最常见的delimiter分界符是eof,当然完全可以自定为其他字符。
对于需求1 要求的自动登陆ftp,并作系列操作,则可以用这种方法进行自动交互。代码如下:
[yjwan@test ~]$ ftp -i -n 192.168.21.46 <
user dbftp dbftp101
ls
EOF
下面是得到的结果:
Connected to 192.168.21.46.
220 developerjail FTP server (Version 6.00LS) ready.
331 Password required for dbftp.
230 User dbftp logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
229 Entering Extended Passive Mode (|||54281|)
150 Opening ASCII mode data connection for '/bin/ls'.
total 8847424
-rw-r--r-- 1 dbftp www 9055318991 Aug 28 14:28 ewiz90.sql_2010-08-29
226 Transfer complete.
221 Goodbye.
测试可以发现,如上代码使用帐号名dbftp,密码dbftp101成功登陆了ftp服务器,并进入目录,ls出当前目录的文件。
注意事项:
1 这里一定要加-i ,否则必定失败!!
这里ftp用的-I 参数 结束了交互式输入,因此可以用文本的方式自动地输入用户密码以及操作方式
如果不用-I 参数,那么必定要求你手动输入密码的!!那么就达不到自动登陆的要求了
你可以man ftp找到这个参数
-i 关闭多文件传送中的交互式提示。请参考 prompt、mget、mput 和 mdelete 子命令,以取得多文件传送中的提示的描述。
-n 防止在起始连接中的自动登录。否则, ftp 命令会搜索 $HOME/.netrc 登录项,该登录项描述了远程主机的登录和初始化过程。请参考 user 子命令。
2 举一反三:只要是要求输入密码的命令,一般都带有一个参数,允许你从标准输入,输入用户密码,以及操作。
其他常用的自动登陆命令的参数
1) Passwd命令
Linux下 Passwd有参数
--stdin
This option is used to indicate that passwd should read the new password from standard input, which can be a pipe.
所以linux下自动改变用户密码的办法就是
Echo 密码 |passwd –stdin 用户名
Freebsd没有以上参数 注意
他的方法是echo passwd |pw mod user username -h 0
2)smbpasswd
-s
This option causes smbpasswd to be silent (i.e. not issue prompts)
and to read its old and new passwords from standard input, rather
than from /dev/tty (like the passwd(1) program does). This option
is to aid people writing scripts to drive smbpasswd
3)sudo
在shell脚本中需要用root用的来执行指令:
sudo 自动输入密码
echo "password" | sudo -S netstat -tlnp
-S
The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device.
3 标准输入还可以用以下两种写法:
可以将下面的内容写入到一个文本
然后ftp -I –n ip <文本
或者echo “..” |ftp –I –n ip
都是可以的!
因为他们都满足“有一个标准的输入”这个条件
4 ssh的自动登陆没有这样的自动输入密码的参数
一般都是使用公钥/私钥的方式自动登录
这种文章满街都是,网上google一下ssh自动登陆就可以找到答案。
或者用下面的办法。
自动交互方法2:利用expect脚本自动登陆
这个 expect基本属于一种编程了
基本任何需要交互式登陆的场合,他都可以解决,是相当的牛逼。
只要是第一种办法解决不了的,基本都可以用这种办法。

Ⅳ shell脚本中,用expect命令如何实现自动远程操作,折磨我好久了..

既然$无法匹配,我觉得你完全可以单独配置一个环境变量,比如说我登录到服务器后
echo "SCPGOGOGO"
expect捕获到SCPGOGOGO 开始执行scp
expect好久不写了,不知道$?判断怎么写,如果要写我的翻书了。

当判断$?为真,然后执行send "java -jar"。不过我想在仔细思考一下可能会有更好的逻辑。
我不太稀饭expect这种交互写法。

因为有更多简单便捷的方法,不知道你为什么不用。
sshpass ssh密钥 简单点直接用sh操作ssh就可以达到你想要的效果,why死扣expect?,
各种集中式管理软件(puppet,salt,ansible...)都是为了方便远程操作管理的东西why?不用?
本来1小时解决的问题,死扣expect花了好几天,这种把一个问题发展到解决2个问题的做事方法不可取。

Ⅳ 用expect实现telnet登陆到linux系统后,再执行一个shell脚本,待这个shell脚

参考一种类自然语言的脚本语言:

001 var {v_time} value datetime

002 screen.text at point {10} {30} string {2. telnet ipv4 (192.168.186.132:23) test , datetime: ~v_time~}

003

004 telnet.connect ip {192.168.186.132} port {23}

005 telnet.recv expect {Username:}

006 telnet.send {cisco%0a}

007 telnet.recv expect {Password}

008

009 telnet.send {cisco%0a}

010 telnet.recv expect {>}

011 telnet.send {enable%0a}

012 telnet.set onrecv {More} send { }

013 telnet.set delay {200} ms after per byte send

014 telnet.send {show version%0a}

015 telnet.recv for {5} seconds

016

017 telnet.send {show run%0a}

018 telnet.recv for {5} seconds

019 telnet.send {exit%0a}

020 telnet.close

021

022 var {v_time} value datetime

023 screen.text at point {10} {60} string {telnet tested end. datetime:~v_time~}

024

025 run.end

--------------------------------------------------------------------

简单网络管理语言(Simple Network Management Language)是一种类自然语言的脚本语言,它采用snmp、telnet、ping、dns、arp、ssh、tcp、udp、web等协议访问网络设备,内置smtp协议用于告警等邮件的发送,支持excel、mysql、sqlite等3种方式进行网管数据的存取。
最新版本: snml8.13(ladybird20200205) utf8&ipv6
项目托管地址:https://github.com/ladybirdSnml/snmlipv6utf8snmptelnetsshweb
打包下载:https://ladybirdsnml.github.io/snmlipv6utf8snmptelnetsshweb/snml_utf8ipv6.zip

Ⅵ shell脚本expect自动登录后,怎么又自动退出了

1.安装expect
需要先安装tcl:apt-get install tcl
apt-get install expect
2.expect使用
2.1一个简单的输入密码操作
#!/usr/bin/expect
set timeout 100
set password "123456"
spawn sudo rm -rf zzlogic
expect "root123456"
send "$password\n"
interact
说明:
第一行#!/usr/bin/expect表示使用expect的shell交互模式
set是对变量password赋值
set timeout 100:设置超时时间为100秒,如果要执行的shell命令很长可以设置超时时间长一些。expect超过超时时间没有监测到要找的字符串,则不执行,默认timeout为10秒
spawn在expect下执行shell脚本
expect对通过spawn执行的shell脚本的返回进行判断,是否包含“”中的字段
send:如果expect监测到了包含的字符串,将输入send中的内容,\n相当于回车
interact:退出expect返回终端,可以继续输入,否则将一直在expect不能退出到终端
2.2expect的命令行参数
[lindex $argv n]获得index为n的参数(index从0开始计算)
$argc为命令行参数的个数
[lrange $argv 0 0]表示第一个参数
[lrange $argv 0 3]表示第1到第3个参数
例如scp_service.sh文件,可以./scp_service.sh -rm来执行,这时是赋值了一个参数
set option [lindex $argv 0](获得第一个参数存到变量option中,参数是的index是从0开始计算的)
2.3if...elif...else...
expect支持if语句,
if {条件1} {
条件1执行语句
} elif {条件2} {
条件2执行语句
} else {
其他情况执行语句
}
说明:
1.if的条件用{}来包含条件
2.if和后面的{}必须有空格隔开
3.两个花括号之间必须有空格隔开,比如if {} {},否则会报错 expect:extra characters after close-brace
3.使用{来衔接下一行,所以if的条件后需要加左花括号{
4.else不能单独放一行,所以else要跟在}后面
2.4 expect {},多行期望,匹配到哪条执行哪条
背景:有时执行shell后预期结果是不固定的,有可能是询问是yes/no,有可能是去输入密码,所以可以用expect{}
花括号内放多行语句,从上至下匹配,匹配到哪个expect执行哪句。
3.shell中调用expect来实现登录
我是通过在shell脚本中执行expect脚本的方式来实现的。当然可以将shell中定义的一些变量传递给expect脚本作为参数输入。

Ⅶ 求ssh无密码登录linux系统的expect脚本。详细点的,登录之后可以进行相关操作的那种,如果可以希望详谈。

#!/usr/local/bin/expect

set timeout 10

spawn ssh root@ip

expect "*password*"

send "123456\r"

expect "#"

send "service crond restart\r"

expect eof

Ⅷ linux:关于expect脚本,为什么这么写不对呢求解

mkdir又不是expect的命令。


#!/usr/local/bin/expect
spawnsu-root
expect"Password:"
send"123456 "
sleep3
send"mkdir/usr/local/ddddd "

Ⅸ 用expect写的mysql登录脚本,为什么无效

一般情况下,我们想要进入MySQL命令模式总是需要按如下交互输入密码确认,才能进入命令行模式:
其实我们完全可以使用expect编写脚本,来通来expect与shell交互通信来实现免密码登录

Ⅹ Linux自动登陆expect 远程主机执行本地脚本

两台ssh之间做个密钥,尽量不要使用expect写脚本。因为expect交互式登录是需要你在脚本中写密码的。

热点内容
交叉编译优化 发布:2025-05-14 03:48:52 浏览:532
动图在线压缩 发布:2025-05-14 03:35:24 浏览:132
w7共享无法访问 发布:2025-05-14 03:35:24 浏览:482
为什么微信会出现账号密码错误 发布:2025-05-14 03:03:30 浏览:692
幻影脚本官网 发布:2025-05-14 03:01:13 浏览:827
servlet的webxml怎么配置 发布:2025-05-14 02:51:46 浏览:773
怎么取消手势密码 发布:2025-05-14 02:51:11 浏览:639
openvpn搭建vpn服务器搭建 发布:2025-05-14 02:47:52 浏览:999
密码忘了从哪里找 发布:2025-05-14 02:39:09 浏览:548
我的世界什么服务器有前途 发布:2025-05-14 02:30:31 浏览:528