问题现象:
使用sshpass登录主机执行命令会出现环境变量问题,导致执行自动化脚本失败 - sshpass -p "******" ssh -t -p $port $user@$ip "$cmd"
复制代码
问题原因:sshpass登录主机环境变量和手工登录的不一样,导致程序执行失败
解决方法: 使用expect执行命令替换sshpass
先查看自己主机上是否已经安装tcl和expect组件 - whereis tcl
- whereis expect
复制代码
一般是没有的,网上找包安装expect,我这里面是redhat,直接找了两个rpm的包装上 - rpm -ivh tcl-8.4.13-4.el5.x86_64.rpm
- rpm -ivh expect-5.43.0-5.1.x86_64.rpm
复制代码
expect主机交互流程:- spawn启动指定进程(发送命令) -> expect获取指定关键字 -> send发送回应 -> 执行完成 -> 继续或退出.
复制代码
按照自己的需要编写shell脚本,大概思路就像网上的示例代码。
1、设置好变量:ip、用户名、密码等 2、启动指令,ssh登录主机,获取password,然后输入密码变量中的值。登录上去之后获取到linux用户$符号,然后再发送一些自己想执行的命令。 - #!/usr/bin/expect
- set host [lindex $argv 0]
- set passwd "xxxx"
- spawn ssh myuser@$host
- expect {
- "yes/no" { send "yes\n";exp_continue }
- "password" { send "$passwd\n" }
- }
- expect "$ "
- send "sudo -i\r"
- expect "myuser:"
- send "$passwd\r"
- expect "]# "
- send "cd /etc/zabbix/zabbix_agentd.d/zabora/sql\r"
- expect "]# "
- send "mv test.txt test.txt.bak\r"
- expect "]# "
- send "exit\r"
- #expect eof
- expect "~]$ "
- send "exit\r"
- expect eof
复制代码
|