免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7896 | 回复: 19
打印 上一主题 下一主题

请教问题!如何通过ssh及expect执行本机上的脚本但在远程机器上运行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-30 23:37 |只看该作者 |倒序浏览
本帖最后由 shell新手 于 2011-09-30 23:40 编辑

举个例子,比如两台机器,有一个脚本test.sh,这个脚本能在B机上正常执行,但现在不能把脚本放到B机上,如何通过在A上去执行这个test.sh从而得到结果再标准输出。

A机通过ssh及expect能自动交互B机并执行命令。

这样是最简单的执行一条命令:
$ ./exp.sh  ls -li
spawn /usr/bin/ssh -l root 10.10.10.2 ls -li
root@10.10.10.2's password:
▒ܼ▒ 276
15074823 -rw-r--r-- 1 root root 82024 08-18 12:58 595_20110818.sysplan
15074816 -rw-r--r-- 1 root root 57890 08-18 00:42 595.sysplan
15074815 -rw------- 1 root root  1644 07-24 19:56 anaconda-ks.cfg
15532290 drwxr-xr-x 2 root root  4096 07-24 20:02 Desktop
15073282 -rw-r--r-- 1 root root 36464 07-24 19:55 install.log
15073283 -rw-r--r-- 1 root root  5306 07-24 19:55 install.log.syslog
15074824 -rw------- 1 root root  1574 09-15 19:41 mbox
15532337 drwxr-xr-x 2 root root 36864 08-06 09:15 test


现在比如有一个命令的集合test.sh,就是希望连续执行多条命令
$ cat test.sh
ls -li
pwd
echo "------------"
hostname
echo "------------"


这样肯定不行,B机上没有test.sh
$ ./exp.sh  test.sh
spawn /usr/bin/ssh -l root 10.10.10.2 test.sh
root@10.10.10.2's password:
bash: test.sh: command not found


如果不交互的话,通过这样做
$ cat test.sh |ssh -l root 10.10.10.2
Pseudo-terminal will not be allocated because stdin is not a terminal.
root@10.10.10.2's password:手动输入密码
▒ܼ▒ 276
15074823 -rw-r--r-- 1 root root 82024 08-18 12:58 595_20110818.sysplan
15074816 -rw-r--r-- 1 root root 57890 08-18 00:42 595.sysplan
15074815 -rw------- 1 root root  1644 07-24 19:56 anaconda-ks.cfg
15532290 drwxr-xr-x 2 root root  4096 07-24 20:02 Desktop
15073282 -rw-r--r-- 1 root root 36464 07-24 19:55 install.log
15073283 -rw-r--r-- 1 root root  5306 07-24 19:55 install.log.syslog
15074824 -rw------- 1 root root  1574 09-15 19:41 mbox
15532337 drwxr-xr-x 2 root root 36864 08-06 09:15 test
/root
------------
node2
------------
$


自动交互的情况下,如何做到去执行多条命令或是脚本呢?
不知道描述清楚了没有。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
2 [报告]
发表于 2011-10-01 07:23 |只看该作者
回复 1# shell新手


    certainly

论坛徽章:
0
3 [报告]
发表于 2011-10-01 22:16 |只看该作者
国庆节大鼎

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
4 [报告]
发表于 2011-10-02 07:05 |只看该作者
send [read [open test.sh r]]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2011-10-02 08:24 |只看该作者
  1. cat test.sh |ssh -l root 10.10.10.2
复制代码
放到一个shell脚本当中,比如spawn.sh当中。
然后写一个expect的脚本。
  1. #!/usr/bin/expect -f
  2. spawn ./spawn.sh
  3. expect "*pasword*"
  4. send "password\r"
  5. expect "eof"
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-10-04 23:54 |只看该作者
把放到一个shell脚本当中,比如spawn.sh当中。
然后写一个expect的脚本。
L_kernel 发表于 2011-10-02 08:24



谢谢回复。
这个方法确实可以,但有点麻烦,因为有很多这样的需要执行,每个都需要把命令在放到文件作为脚本去spawn执行。
能不能直接放到自身的脚本里去执行呢?试了下直接写spawn cat test.sh |ssh -l root 10.10.10.2是不行的。

论坛徽章:
0
7 [报告]
发表于 2011-10-04 23:56 |只看该作者
send [read [open test.sh r]]
waker 发表于 2011-10-02 07:05



   
谢谢回复!

这个写法怎么放到如下的格式里呢?
  1. #!/bin/bash
  2. #!/usr/bin/expect -f
  3. function cmd (){
  4.         CMD=$*
  5.         /usr/bin/expect -c"
  6.                 set timeout 300
  7.                 spawn ssh -l root 10.10.10.2 $CMD
  8.                 expect {
  9.                 \"*yes/no*\" {send \"yes\r\";exp_continue}
  10.                 \"*password*\" {send \"root\r\";exp_continue}
  11.                 }
  12.         "
  13. }
  14. cmd $*
复制代码

论坛徽章:
0
8 [报告]
发表于 2011-10-08 22:28 |只看该作者
回复 4# waker


   

顶一下!

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
9 [报告]
发表于 2011-10-09 08:10 |只看该作者
俺一时看不懂你的格式想干什么,所以没办法回复

论坛徽章:
0
10 [报告]
发表于 2011-10-09 09:51 |只看该作者
回复 9# waker



  我的意思是想把expect脚本放在bash脚本里,而不是用shell去调用expect的脚本,不单独分开写。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP