Linux下用expect实现ssh自动登录并执行脚本
expect不是系统自带的,需要安装:
yum install expect
装完后才可执行以下脚本。
ssh密码认证的登陆脚本:
- #!/bin/bash
- # 匹配提示符
- CMD_PROMPT="\](\$|#)"
- # 要执行的脚本
- script="/root/test.sh"
- username="root"
- password="123456"
- host="192.168.1.109"
- port=22
- expect -c "
- send_user connecting\ to\ $host...\r # 空格要转义
- spawn ssh -p $port $username@$host
- expect {
- *yes/no* { send -- yes\r;exp_continue;}
- *assword* { send -- $password\r;}
- }
- expect -re $CMD_PROMPT
- send -- $script\r
- expect -re $CMD_PROMPT
- exit
- "
- echo "\r"
ssh公钥认证的登陆脚本:
- #!/bin/bash
- # 匹配提示符
- CMD_PROMPT="\](\$|#)"
- # 要执行的脚本
- script="/root/test.sh"
- username="root"
- password="123456"
- host="192.168.1.109"
- port=22
- expect -c "
- send_user connecting\ to\ $host...\r
- spawn ssh -p $port $username@$host
- expect -re $CMD_PROMPT
- send -- $script\r
- expect -re $CMD_PROMPT
- exit
- "
- echo "\r"
1. send_user 是回显,相当于echo。
2. spawn 是开启新的进程
3. expect{ } 这是匹配上一条指令的输出,,比如上面spawn 那句执行完后,会提示你输入密码,提示语中会包含 password,因此就匹配*assword*,然后就send -- $password 把密码发过去。
4. send 就是发指令到对端
5. expect 内部有个exp_continue ,意思是重新匹配所在的expect,相当于while的continue
6. expect 的 -re 表示匹配正则表达式
ps:expect 内部的指令的参数中特殊字符需在前面加\转义
类似的还可实现ftp登陆,自动上传下载文件等等。