问题:由于ssh协议不支持从标准输入获取变量,所以在shell脚本中无法实现自动化交互。
解决办法一:使用sshpass,需要在有网的的情况下安装sshpass,这种方法简单易操作。
首先安装sshpass:yum -y install sshpass
然后自动化脚本中直接使用:sshpass -p "密码" ssh root@192.168.1.3
解决办法二:使用expect
expect可以启动新的进程并且可以发送信息到新的进程中执行,expect命令有很多参数使用,下面列举几个常用的,欢迎补充。
expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ] 选项 -c:从命令行执行expect脚本,默认expect是交互地执行的 示例:expect -c 'expect "\n" {send "pressed enter\n"}' -d:输出调试信息 示例:expect -d ssh.exp expect中的相关命令 spawn:启动新的进程 send:向进程发送字符串 expect:从进程接收字符串 interact:允许用户交互 exp_continue 匹配多个字符串时在执行动作后加此命令 expect最常用的语法(tcl语言:模式-动作) 单一分支模式的语法: expect "hi" { send "You said hi\n" } 匹配到 hi 后,会输出"you said hi",并换行 多分支模式的语法: expect { "hi" { send "You said hi\n" } "hehe" { send “Hehe yourself\n" } "bye" { send "Goodbye\n" } } 匹配 hi, hehe, bye 中的任意字符串时, 发送相应字符串。等同于:
使用:
#!/usr/bin/expect #!/bin/bash set user "root" set pass "root" set machine "192.168.1.3" #设置expect等待30秒匹配不到再返回 set timeout 30 spawn ssh "$user@$machine" expect { "password" { send "$pass\n" ; #exp_continue; } } expect "$user" send "touch /root/a.txt\n" expect "$user" send "exit\n" expect "$user" #interact expect eof