expect 能够通过捕获脚本的输出,模拟控制台的输入,从而实现自动交互。
这里用这个命令是为了实现免登陆。
免登陆的原理是,通过ssh-keygen -t dsa 生成dsa密钥,然后将密钥传递到目标机器的~/.ssh/authorized_keys 文件,即可实现免登。
但是在传递密钥时依然是需要输入密码的,如果机器比较多,再一个一个的输入就比较麻烦了,私用expect拦截脚本输出,然后发送密码的方式比较爽。
expect 通过spawn 命令执行shell命令,然后产生的输出能够通过expect命令捕获,再根据捕获到的内容,通过send _string 将需要输入的内容模拟输入。
这里是一个完成的,用于向远端机器发送文件的脚本。
注意, -re 是使用正则表达式匹配;
send "_string\r"里面的 \r 是从发送命令返回,如果没有 \r , 发送命令将不会返回。
这里用这个命令是为了实现免登陆。
免登陆的原理是,通过ssh-keygen -t dsa 生成dsa密钥,然后将密钥传递到目标机器的~/.ssh/authorized_keys 文件,即可实现免登。
但是在传递密钥时依然是需要输入密码的,如果机器比较多,再一个一个的输入就比较麻烦了,私用expect拦截脚本输出,然后发送密码的方式比较爽。
expect 通过spawn 命令执行shell命令,然后产生的输出能够通过expect命令捕获,再根据捕获到的内容,通过send _string 将需要输入的内容模拟输入。
#! /usr/bin/expect
set timeout 5
set host [lindex $argv 0]
set pwd [lindex $argv 1]
spawn scp /home/dilu.kxq/.ssh/id_dsa.pub ${host}:/home/dilu.kxq/
set done 1
while { $done } {
expect {
-re ".*assword:" { send "$pwd\r" }
-re ".*yes" { send "yes\r" }
-re ".*id_dsa.*" { send "\r" }
-re ".*agin" { send "\r" }
eof { set done 0 }
}
}
这里是一个完成的,用于向远端机器发送文件的脚本。
注意, -re 是使用正则表达式匹配;
send "_string\r"里面的 \r 是从发送命令返回,如果没有 \r , 发送命令将不会返回。