linux下用expect spawn时的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下用expect spawn时的问题相关的知识,希望对你有一定的参考价值。

想写个脚本去自动上传测试的LOG,使用spawn scp /log/*.log root@192.168.0.1:/home
执行的时候没有动作,把*改成指定的文件名时则没有问题,想知道怎么自动复制多个文件过去二不需要指定文件名.
单独使用scp /log/*.log root@192.168.0.1:/home时是可以的,只是要输入密码,想自动上传.脚本如下
#!/usr/bin/expect
spawn scp /log/*.log root@192.168.0.1:/home
expect "root@192.168.0.1's password:"
exec sleep 5
send "111111\n"
interact

*.log 是shell中的用法,

scp或者其他命令本身并不直接将 * 替换成匹配的多个文件名。

建议你将 expect 脚本做成一次只上传一个文件,这个文件名由输入参数来决定

scp [lindex $argv 0] root@192.xxxxxx:/home
expect "password:" send "1111111\n"
interact

然后再写一个bash脚本,脚本调用上面的expect脚本来上传所有的文件,如:

for f in `ls /log/*.log`
do
expect_script /log/$f
done

即可。

另,像这种备份文件,用 rsync 更方便,供参考。追问

文件名由输入参数来决定是可以
不指定文件名不行吗?我要的目的是只要执行一下脚本,不做其他任何动作就完成上传多个.log文件
如果做其他动作,手动输入字符的话,可以直接在系统命令行敲下指令就OK了。有没其他的办法?

追答

我的方法也是执行一下脚本,上传多个log文件,只不过你要准备两个脚本,一个是 expect脚本,一个是bash脚本,你只需执行bash脚本即可。

追问

大哥,你能把第一个脚本写出来我看下嘛?就是将 expect 脚本做成一次只上传一个文件,这个文件名由输入参数来决定,本人写脚本也是赶鸭子上架,临时现学的.

追答

#!/usr/bin/expect
spawn scp [lindex $argv 0] root@192.168.0.1:/home
expect "root@192.168.0.1's password:" send "111111\n"
interact
把上面的存成 expect_script

bash 脚本
#/bin/bash
for f in `ls /log/*.log`
do
expect_script /log/$f
done

追问

刚去测试了下,可以执行,但是没有上传任何文件:/log/ls :no such file or directory

追答

你的脚本肯定写错了,没有按照我的写, 另外 for f in `ls /log/*.log`
这一句里的引号,是 键盘上的 ~ 那个键对应的引号,不是单引号或者双引号。

bash脚本我原文漏掉一处
#/bin/bash
应该是
#!/bin/bash

追问

spawn scp /log//log/11.log root@192.168.0.1:/home
root@192.168.0.1's password:
/log//log/11.log: No such file or directory
Killed by signal 1.
怎么会多出个/来啊?哪里的路径问题?

追答

晕,把bash脚本再改一下就好

expect_script /log/$f
改成
expect_script $f

参考技术A 可以使用如下方法
1. 在客户机上产生一对密钥:
#ssh-keygen -d #产生dsa密钥
或者:
#ssh-keygen -t rsa #产生rsa密钥
2. 在服务器上建立目录 /root/.ssh,并设置权限:
#chmod 755 /root/.ssh
3. 把客户机上生成的公钥拷贝到服务器的/root/.ssh目录下:
#scp /root/.ssh/id_dsa.pub root@服务器IP:/root/.ssh/authorized_keys
或者:
#scp /root/.ssh/id_rsa.pub root@服务器IP:/root/.ssh/authorized_keys
4. 这样,就可以从客户机直接登入ssh服务器,而不需要密码了,可使用的命令包括ssh, scp和sftp。例如:
#ssh root@服务器IP “ls;exit”追问

我多台机器测试,岂不是每台都要这样?能不能有其他办法?我的意思是测试机只要执行下脚本就可以完成上传的动作,而不需要其他操作。

追答

安装了expect 试了下 可行
下面是我的命令程序
#!/usr/local/bin/expect
set timeout 10
spawn scp 1.txt root@192.168.10.135:/dm/php/
expect "password:"
send "123321\r"
interact
下面是显示结果
[root@LinuxServer140 test8]# ./test.sh
spawn scp 1.txt root@192.168.10.135:/dm/php/
root@192.168.10.135's password:
1.txt 100% 217 0.2KB/s 00:00

linux expect安装后使用有问题,expect正常,但是send和spawn提示找不到命令

#代码如下:
#!/usr/bin/expect
send "hello"

参考技术A expect的send不能单独用的。

一般需要:
spawn
expect
send
expect
send

这样用。

还有个问题
#!/usr/bin/expect

应该放在第一行吧。追问

我希望执行expect后执行telnet命令,这个怎么用send或者spawn做?

本回答被提问者和网友采纳

以上是关于linux下用expect spawn时的问题的主要内容,如果未能解决你的问题,请参考以下文章

linux spawn命令

linux-expect

linux expect

Linux expect

linux expect命令使用入门

expect spawn not found