linux expect 输入密码,Linux expect自动输入密码脚本

使用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中最关键的四个命令是send,expect,spawn,interact。send用于向进程发送字符串

expect从进程接收字符串

spawn启动新的进程

interact允许用户交互

1. send命令

send命令接收一个字符串参数并将该参数发送到进程。expect1.1> send "hello world\n"hello world

2. expect命令

(1)基础知识

expect命令和send命令正好相反expect通常是用来等待一个进程的反馈。expect可以接收一个字符串参数也可以接收正则表达式参数。和上文的send命令结合现在我们可以看一个最简单的交互式的例子expect "hi\n"send "hello there!\n"

这两行代码的意思是从标准输入中等到hi和换行键后向标准输出输出hello there。tips $expect_out(buffer)存储了所有对expect的输入存储了匹配到expect参数的输入。

比如如下程序expect "hi\n"send "you typed "send "but I only expected "

当在标准输入中输入test

hi

是运行结果如下you typed: test

hi

I only expect: hi

(2)模式-动作

expect最常用的语法是来自tcl语言的模式-动作。这种语法极其灵活下面我们就各种语法分别说明。

单一分支模式语法expect "hi" {send "You said hi"}

匹配到hi后会输出"you said hi"

多分支模式语法expect "hi" { send "You said hi\n" } \"hello" { send "Hello yourself\n" } \"bye" { send "That was unexpected\n" }

匹配到hi,hello,bye任意一个字符串时执行相应的输出。等同于如下写法expect {"hi" { send "You said hi\n"}"hello" { send "Hello yourself\n"}"bye" { send "That was unexpected\n"}}

3. spawn命令

上文的所有demo都是和标准输入输出进行交互但是我们跟希望他可以和某一个进程进行交互。spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的。结合上文的send和expect命令我们可以看一下更复杂的程序段了。set timeout -1spawn ftp ftp.test.com      //打开新的进程该进程用户连接远程ftp服务器expect "Name"             //进程返回Name时send "user\r"        //向进程输入anonymous\rexpect "Password:"        //进程返回Password:时send "123456\r"    //向进程输入don@libes.com\rexpect "ftp> "            //进程返回ftp>时send "binary\r"           //向进程输入binary\rexpect "ftp> "            //进程返回ftp>时send "get test.tar.gz\r"  //向进程输入get test.tar.gz\r

这段代码的作用是登录到ftp服务器ftp ftp.uu.net上并以二进制的方式下载服务器上的文件test.tar.gz。程序中有详细的注释。

4.interact

到现在为止我们已经可以结合spawn、expect、send自动化的完成很多任务了。但是如何让人在适当的时候干预这个过程了。比如下载完ftp文件时仍然可以停留在ftp命令行状态以便手动的执行后续命令。interact可以达到这些目的。下面的demo在自动登录ftp后允许用户交互。spawn ftp ftp.test.comexpect "Name"send "user\r"expect "Password:"send "123456\r"interact

四使用expect自动登录的例子

1,程序例子的内容 :

先做功能 上的说明

此程序ssh登录到作为参数传递过来的ip地址上

然后执行: df -h

free -m

uptime

来检查系统的情况

[root@dev ~]# cat monitor_auto

#!/usr/bin/expect -f

#-------------------------------------------------- about us

# product: monitorone

# Author: liuhongdi

# 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 èY òó éó òó% 1ò

/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@$ipaddr

在/bin/bash中使用expect,可采用如下方式:#!/bin/bash

expect <

## expect命令 ##

!

例如:

#!/bin/bash

/usr/bin/expect <

spawn ssh root@192.168.1.18 uptime

# 两种形式

#expect "password"

#send "rootroot\n"

expect "password" {send "rootroot\n"}

expect eof

!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux自动输入密码可以通过以下几种方式实现: 1. 使用expect工具:expect是一个自动化工具,可以模拟用户的交互操作,包括输入密码。可以编写一个expect脚本,在其中指定需要输入密码的命令和密码,然后运行脚本即可。 2. 使用ssh密钥认证:可以在本地生成一对公私钥,将公钥上传到需要登录的远程服务器上,然后在本地使用ssh命令连接远程服务器时,就可以自动完成认证,无需输入密码。 3. 使用sudo免密码:可以在sudoers文件中配置免密码,即指定某个用户或组在执行sudo命令时无需输入密码。具体配置方法可以参考sudoers文件的注释说明。 4. 使用gnome-keyring:gnome-keyring是一个密码管理工具,可以将密码保存在一个安全的地方,然后在需要输入密码的时候自动填充。可以在gnome桌面环境下使用该工具。 ### 回答2: 在Linux系统中,自动输入密码的需求可能会出现在一些自动脚本自动化工具中,这时候需要采用一些技巧来实现自动输入密码。 最常见的方法是使用SSH无密码登录来避免需要输入密码。SSH无密码登录需要在两台机器之间进行设置:将公钥添加到另一台机器的已授权密钥列表中,以便允许该用户在不使用密码的情况下进行远程登录。 除了SSH无密码登录方法,还有一些其他方法可以实现自动输入密码: 1.设置sudoers文件:将需要自动输入密码的命令添加到sudoers文件中,同时指定免密码验证。这就意味着通过sudo命令执行时,不需要输入密码。 2.使用expect工具:expect是一个自动化交互式应用程序的工具集,它可以用于自动化地执行命令,并且可以在执行过程中与程序进行交互,实现自动输入密码的效果。 3.使用加密的配置文件:将需要用到密码的配置文件加密,然后在需要使用时,输入口令解密,以便访问配置文件中的信息。 无论采用什么方式,自动输入密码都需要注意安全性问题,应该采取适当的措施确保密码不会被泄露。例如,将密码存储在明文文本文件中是非常危险且不安全的。 ### 回答3: Linux系统是一个非常强大的操作系统,但是在使用过程中可能需要频繁输入密码,这对于用户来说可能会带来一些不便。为了解决这个问题,Linux系统提供了一些方法来实现自动输入密码的功能。 一、使用SSH公钥 SSH公钥是一种安全的验证方式,它可以允许用户在不输入密码的情况下访问SSH服务器。SSH公钥是使用RSA或DSA算法生成的一对密钥,一把是公钥,一把是私钥。在使用SSH公钥进行验证时,用户将其公钥添加到服务器的authorized_keys文件中,当用户访问服务器时,服务器会自动识别该公钥并允许用户访问,无需输入密码。 二、使用sshpass工具 sshpass是一个命令行工具,可以在不需要交互式输入密码的情况下,从命令行输入密码。它可以将密码通过命令行参数的形式传递给ssh命令,从而实现自动化登录。 使用sshpass的语法为: sshpass -p <password> ssh <username>@<host> 其中,<password>表示你的密码,<username>表示你的用户名,<host>表示你要登录的主机名或IP地址。 三、使用expect脚本 expect是一种自动化工具,可以用来编写脚本,实现自动交互和处理。在使用expect脚本自动输入密码时,我们可以编写一个脚本来实现自动登录功能。脚本包括交互式输入用户名和密码,并通过expect命令进行自动化处理。 使用expect脚本的语法为: #!/usr/bin/expect spawn ssh <username>@<host> expect "password:" send "<password>\r" interact 其中,<username>表示你的用户名,<host>表示你要登录的主机名或IP地址,<password>表示你的密码。 总之,在Linux系统中实现自动输入密码的方法有很多,不同的方法适合不同的场景,用户可以根据自己的需要选择最合适的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值