关于linux expect脚本的问题,自动输入密码

Posted

tags:

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

我的代码如下:
#!/usr/bin/expect
spawn sudo....
expect "password:"
send "123456"
运行怎么老是提示 send not found,我的expect已经装了

参考技术A #!/usr/bin/expect

set time 30
set passwd xxxxx (xxxx是你的密码内容)

spawn sudo
expect "Password:" 引号里是你手动执行sudo时候 。系统返回给你的提示,可以只匹配最后几个字母,
也可以写全
send "$passwd\r"
expect eof

EOF追问

谢谢,我自己解决了

本回答被提问者采纳
参考技术B

    确认 expect 确实装到 /usr/bin

    试一下 #!/usr/bin/expect -f 是否解决问题,虽然我从来都不加 -f,但是手册上说要加

    还不行了话,把详细的 expect 版本,还有出错信息贴出来


另, send "123456\\n"

追问

我解决了,不能用sh命令执行脚本,谢谢

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脚本的问题,自动输入密码的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本通过expect实现自动单边无密登录

linux spawn命令

Linux - 通过expect工具实现脚本的自动交互

expect的用法和实现自动化脚本

linux shell expect 自动交互脚本

expect检查ssh登陆对端是否免密