当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 12 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [分享]bash向expect传递变量实现ssh登陆自动化
帖子发表于 : 2010-12-24 23:57 
头像

注册: 2008-12-13 10:55
帖子: 1215
地址: the Earth
送出感谢: 2
接收感谢: 3
前天发到一个不恰当的论坛,没人理。 :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编程例子


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


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!


最后由 我就是我2 编辑于 2010-12-29 14:13,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: [分享]bash向expect传递变量实现ssh登陆自动化
帖子发表于 : 2010-12-28 2:21 
头像

注册: 2008-12-13 10:55
帖子: 1215
地址: the Earth
送出感谢: 2
接收感谢: 3
消灭0回复 :em20


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


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!


页首
 用户资料  
 
3 楼 
 文章标题 : Re: [分享]bash向expect传递变量实现ssh登陆自动化
帖子发表于 : 2011-01-02 20:51 

注册: 2010-04-29 22:00
帖子: 61
系统: Gentoo Linux ~amd64
送出感谢: 0 次
接收感谢: 6
简单修改了下 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


_________________
網站
配置


页首
 用户资料  
 
4 楼 
 文章标题 : Re: [分享]bash向expect传递变量实现ssh登陆自动化
帖子发表于 : 2011-01-03 1:30 
头像

注册: 2008-12-13 10:55
帖子: 1215
地址: the Earth
送出感谢: 2
接收感谢: 3
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 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!


页首
 用户资料  
 
5 楼 
 文章标题 : Re: [分享]bash向expect传递变量实现ssh登陆自动化
帖子发表于 : 2011-01-04 17:05 

注册: 2007-10-22 22:40
帖子: 125
送出感谢: 0 次
接收感谢: 0 次
我就是我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这个
虽然还不知道具体用法
但是作用还不错
谢谢 楼上


页首
 用户资料  
 
6 楼 
 文章标题 : Re: [分享]bash向expect传递变量实现ssh登陆自动化
帖子发表于 : 2011-01-06 1:08 
头像

注册: 2008-12-13 10:55
帖子: 1215
地址: the Earth
送出感谢: 2
接收感谢: 3
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 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!


页首
 用户资料  
 
7 楼 
 文章标题 : Re: [分享]bash向expect传递变量实现ssh登陆自动化
帖子发表于 : 2011-01-06 15:42 

注册: 2007-10-22 22:40
帖子: 125
送出感谢: 0 次
接收感谢: 0 次
我现在稍微写了下,测试脚本又不正确了,比方说加入了健壮性的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访问其他机器,
第一,网络是否连接上
第二,连接上的话,服务是否开启
第三,服务开启的话,是否是第一次连接
第四,正确的用户名和密码等
第五,超时或者结束等

学的不深想多和大家交流下。


页首
 用户资料  
 
8 楼 
 文章标题 : Re: [分享]bash向expect传递变量实现ssh登陆自动化
帖子发表于 : 2011-01-06 17:52 
头像

注册: 2008-12-13 10:55
帖子: 1215
地址: the Earth
送出感谢: 2
接收感谢: 3
这是你写的。
引用:
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 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!


页首
 用户资料  
 
9 楼 
 文章标题 : Re: [分享]bash向expect传递变量实现ssh登陆自动化
帖子发表于 : 2011-04-14 16:10 

注册: 2007-10-22 22:40
帖子: 125
送出感谢: 0 次
接收感谢: 0 次
嗯,对比一下,你是想说参数使用lrange是比较好吗?
了解不多,你可以说说原因。


页首
 用户资料  
 
10 楼 
 文章标题 : Re: [分享]bash向expect传递变量实现ssh登陆自动化
帖子发表于 : 2011-04-15 15:21 
头像

注册: 2008-12-21 15:27
帖子: 5349
地址: TARDIS
送出感谢: 1
接收感谢: 10
一般人我不告诉他 :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 " "}
}


_________________


页首
 用户资料  
 
11 楼 
 文章标题 : Re: [分享]bash向expect传递变量实现ssh登陆自动化
帖子发表于 : 2011-04-20 0:13 
头像

注册: 2007-03-16 15:42
帖子: 366
送出感谢: 0 次
接收感谢: 0 次
直接用plink代替ssh, plink可直接-pw 密码


页首
 用户资料  
 
12 楼 
 文章标题 : Re: [分享]bash向expect传递变量实现ssh登陆自动化
帖子发表于 : 2011-07-05 17:07 

注册: 2005-11-10 19:12
帖子: 641
送出感谢: 0 次
接收感谢: 0 次
学习了,挺实用的,经常要用到ssh


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 12 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译