这不是大神的随笔,只是记忆力不好的码农笔记
expect安装
参考:https://www.cnblogs.com/lixigang/articles/4849527.html
安装tcl
```
cd /usr/local/src
wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
tar xfvz tcl8.4.11-src.tar.gz
cd tcl8.4.11/unix
./configure --prefix=/usr/local/tcl --enable-shared
make
make install
```
可能出现bug
Syntax error: Unterminated quoted string
参考:https://www.cnblogs.com/liuxiaoke/p/3488616.html
进入tcl8.4.11/unix
编辑configure文件,搜索 “relid” 找到全部 “.relid’" 改为 ".relid
”
安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中
cp ./tclUnixPort.h …/generic/
暂时不要删除tcl源代码,因为expect的安装过程还需要用
安装expect
cd /usr/local/src
wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz
tar xzvf expect5.45.tar.gz
cd expect5.45
./configure --prefix=/usr/local/expect --with-tcl=/usr/local/tcl/lib --with-tclinclude=…/tcl8.4.11/generic
make
make install
ln -s /usr/local/tcl/bin/expect /usr/bin/expect
expect使用
crontab 使用时 由于环境变量没有配置,命令一般使用绝对路径,文件也使用绝对路径
-
拷贝远程文件到本地
cd /home/xuze/projects/gw_proxy/
新建文件put_ip.sh#! /usr/bin/expect -f // expect获取环境变量 set local_file_path [lindex $argv 0] set username [lindex $argv 1] set hostname [lindex $argv 2] set password [lindex $argv 3] set remote_file_path [lindex $argv 4] spawn /usr/bin/scp -r ${local_file_path} ${username}@${hostname}:${remote_file_path} set timeout 300 expect "${username}@${hostname}'s password:" set timeout 300 send "$password\r" set timeout 300 send "exit\r" expect eof
附:scp参数
-r:拷贝目录
-c:允许压缩
一个完整的例子 -
使用ssh获取外网ip,并更新远程服务器ip
cd /home/xuze/projects/gw_proxy/
新建文件ch_ip.sh#! /bin/bash // 加载环境变量 source ~/.bashrc source /etc/profile // 当前文件的绝对路径 base_dir=$(cd "$(dirname "$0")";pwd) declare -A dic1 dic1=( ["local_file_path"]="${base_dir}/ip.txt" // 本地存放ip文件路径 ["username"]="xxx" // 服务器用户名 ["hostname"]="xxx" // 服务器ip ["password"]="xxx" // 密码mingl ["remote_file_path"]="/root/proxy/ip.txt" //服务器存放ip文件路径 ) 有几台服务器就生成几个字典 declare -A dic2 dic2=( ...... ) user_list=("dic1" "dic2") new_ip=$(curl ip.6655.com/ip.aspx) old_ip=$(cat ${base_dir}/ip.txt) if [ "$new_ip" != "$old_ip" ] then echo $new_ip > ${base_dir}/ip.txt for dict in ${user_list[@]} do local_file_path=$(eval echo \${${dict}["local_file_path"]}) username=$(eval echo \${${dict}["username"]}) hostname=$(eval echo \${${dict}["hostname"]}) password=$(eval echo \${${dict}["password"]}) remote_file_path=$(eval echo \${$dict["remote_file_path"]}) expect ${base_dir}/put_ip.sh ${local_file_path} ${username} ${hostname} ${password} ${remote_file_path} done else echo "ip没变" fi
-
本地服务器新建crontab任务,每五分钟执行一次
*/5 * * * * /bin/bash /home/xuze/projects/gw_proxy/ch_ip.sh -
远程服务器
cd /root/proxy/
新建proxy.sh#! /bin/bash source ~/.bashrc source /etc/profile base_dir=$(cd "$(dirname "$0")";pwd) new_ip=$(cat $base_dir"/ip.txt") old_str=$(grep "^Allow [0-9]\{3\}\.[0-9]\{2,3\}.*" /etc/tinyproxy.conf) new_str="Allow "$new_ip if [ "$new_str" != "$old_str" ] then sed -i "s#^Allow [0-9]\{3\}\.[0-9]\{2,3\}.*#$new_str#" /etc/tinyproxy.conf sudo service tinyproxy restart fi
-
服务器端添加crontab任务 每五分钟执行一次
*/5 * * * * /bin/bash /root/proxy/proxy.sh
总结
crontab 使用的时候不能识别shell的某些命令,所以路径一般都要写绝对路径
expect 获取参数值,与shell不一样