[分享]bash向expect传递变量实现ssh登陆自动化

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

[分享]bash向expect传递变量实现ssh登陆自动化

#1

帖子 我就是我2 » 2010-12-24 23:57

前天发到一个不恰当的论坛,没人理。 :em20

在折腾了很久以后,终于领悟了expect中的位置变量,这才得以在expect 中使用bash的变量。
bash部分
[bash]#!/bin/bash
#依次是服务器 、用户名 、密码
a=192.168.0.101
b=joe
c=123456
#调用foo.exp脚本
./foo.exp $a $b $c [/bash]
脚本名为foo.exp(这部分写得有些粗糙 :em03
[bash]#!/usr/bin/expect -f
set timeout -1 #很明显这是永远不退出的意思,若设定成30,则30秒后退出
#依次是 第一、二、三个变量
set server [lrange $argv 0 0]
set user [lrange $argv 1 1]
set _pw [lrange $argv 2 2]
spawn ssh -l $user $server
expect {
"*(yes/no)*" { send "yes\r" }
"*password*" { send "$_pw\r" }
}
expect "*Last login*" { interact }
[/bash]
引用:
作者: hjp0021
如:从shell脚本中得到了几个变量的值,接着在脚本中调用写好的expect程序登陆到远程设备上执行命令,该expect程序要用到前面shell得到的变量值。如何才能传递过来?
谢谢!
use position variables. Such as:
代码:

In shell: foo.exp $a $b $c In expect: set var1 [lrange $argv 0 0]

Then $var1 in expect takes the value of $a in shell script.
[lrange $argv 0 0]表示第1个参数,[lrange $argv 0 4]为第一个到第五个参数。
参考资料:
标题: 如何在expect与shell之间传递变量?
expect编程例子
上次由 我就是我2 在 2010-12-29 14:13,总共编辑 1 次。
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: [分享]bash向expect传递变量实现ssh登陆自动化

#2

帖子 我就是我2 » 2010-12-28 2:21

消灭0回复 :em20
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
MaskRay
帖子: 61
注册时间: 2010-04-29 22:00
系统: Gentoo Linux ~amd64
联系:

Re: [分享]bash向expect传递变量实现ssh登陆自动化

#3

帖子 MaskRay » 2011-01-02 20:51

简单修改了下 expect 脚本部分
如果第一次用提示 yes/no 的话,你的脚本不能自动登录

代码: 全选

#!/usr/bin/expect -f

set timeout -1
set server  [lindex $argv 0]  
set user      [lindex $argv 1]  
set  _pw     [lindex $argv 2]    
spawn ssh -l $user $server
expect {
    "(yes/no)" { send "yes\r"; exp_continue }
    "assword:" { send "$_pw\r"; }
}
expect "*Last login*" interact
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: [分享]bash向expect传递变量实现ssh登陆自动化

#4

帖子 我就是我2 » 2011-01-03 1:30

MaskRay 写了:简单修改了下 expect 脚本部分
如果第一次用提示 yes/no 的话,你的脚本不能自动登录

代码: 全选

#!/usr/bin/expect -f

set timeout -1
set server  [lindex $argv 0]  
set user      [lindex $argv 1]  
set  _pw     [lindex $argv 2]    
spawn ssh -l $user $server
expect {
    "(yes/no)" { send "yes\r"; exp_continue }
    "assword:" { send "$_pw\r"; }
}
expect "*Last login*" interact
:em03
故意这样的。
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: [分享]bash向expect传递变量实现ssh登陆自动化

#5

帖子 chengmoYS » 2011-01-04 17:05

我就是我2 写了:
MaskRay 写了:简单修改了下 expect 脚本部分
如果第一次用提示 yes/no 的话,你的脚本不能自动登录

代码: 全选

#!/usr/bin/expect -f

set timeout -1
set server  [lindex $argv 0]  
set user      [lindex $argv 1]  
set  _pw     [lindex $argv 2]    
spawn ssh -l $user $server
expect {
    "(yes/no)" { send "yes\r"; exp_continue }
    "assword:" { send "$_pw\r"; }
}
expect "*Last login*" interact
:em03
故意这样的。
经过测试 该脚本是正确的
无论是第一次出现yes/no 或者再一次直接输入密码
均正确
今天学到了exp_continue这个
虽然还不知道具体用法
但是作用还不错
谢谢 楼上
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: [分享]bash向expect传递变量实现ssh登陆自动化

#6

帖子 我就是我2 » 2011-01-06 1:08

chengmoYS 写了:
我就是我2 写了:
MaskRay 写了:简单修改了下 expect 脚本部分
如果第一次用提示 yes/no 的话,你的脚本不能自动登录

代码: 全选

#!/usr/bin/expect -f

set timeout -1
set server  [lindex $argv 0]  
set user      [lindex $argv 1]  
set  _pw     [lindex $argv 2]    
spawn ssh -l $user $server
expect {
    "(yes/no)" { send "yes\r"; exp_continue }
    "assword:" { send "$_pw\r"; }
}
expect "*Last login*" interact
:em03
故意这样的。
经过测试 该脚本是正确的
无论是第一次出现yes/no 或者再一次直接输入密码
均正确
今天学到了exp_continue这个
虽然还不知道具体用法
但是作用还不错
谢谢 楼上
.

他所看到的版本是之前的。
我编辑过一回。
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: [分享]bash向expect传递变量实现ssh登陆自动化

#7

帖子 chengmoYS » 2011-01-06 15:42

我现在稍微写了下,测试脚本又不正确了,比方说加入了健壮性的timeout和eof

#! /usr/bin/expect -f

set USER [lindex $argv 0]
set PASSWORD [lindex $argv 1]
set IP [lindex $argv 2]

spawn ssh -l $USER $IP

expect {
timeout {
send_user "timeout\n"
exit
}
eof {
send_user "eof\n"
exit
}
"Connection refused" {
send_user "connection refused\n"
exit
}
"(yes/no)?" {
send "yes\r"; exp_continue
}
"password:" {
send "$PASSWORD\r"; exp_continue
}
"Last login:" {
send_user "connected\n"; interact
}
}

expect里很多命令不知道怎么用。这个逻辑是正确的。
当你尝试ssh访问其他机器,
第一,网络是否连接上
第二,连接上的话,服务是否开启
第三,服务开启的话,是否是第一次连接
第四,正确的用户名和密码等
第五,超时或者结束等

学的不深想多和大家交流下。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: [分享]bash向expect传递变量实现ssh登陆自动化

#8

帖子 我就是我2 » 2011-01-06 17:52

这是你写的。
set USER [lindex $argv 0]
set PASSWORD [lindex $argv 1]
set IP [lindex $argv 2]

下面的是我写的。
set server [lrange $argv 0 0]
set user [lrange $argv 1 1]
set _pw [lrange $argv 2 2]
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
chengmoYS
帖子: 125
注册时间: 2007-10-22 22:40

Re: [分享]bash向expect传递变量实现ssh登陆自动化

#9

帖子 chengmoYS » 2011-04-14 16:10

嗯,对比一下,你是想说参数使用lrange是比较好吗?
了解不多,你可以说说原因。
头像
Lavande
论坛版主
帖子: 5353
注册时间: 2008-12-21 15:27
来自: TARDIS

Re: [分享]bash向expect传递变量实现ssh登陆自动化

#10

帖子 Lavande » 2011-04-15 15:21

一般人我不告诉他 :em04

代码: 全选

#!/usr/bin/expect
set timeout 60

spawn /usr/bin/ssh -D 7070 -g username@host
expect {
"password:" {
send "yourpassword\r"
}
}
interact {
timeout 60 { send " "}
}
头像
INUYASHA
帖子: 366
注册时间: 2007-03-16 15:42

Re: [分享]bash向expect传递变量实现ssh登陆自动化

#11

帖子 INUYASHA » 2011-04-20 0:13

直接用plink代替ssh, plink可直接-pw 密码
baby
帖子: 641
注册时间: 2005-11-10 19:12

Re: [分享]bash向expect传递变量实现ssh登陆自动化

#12

帖子 baby » 2011-07-05 17:07

学习了,挺实用的,经常要用到ssh
回复