expect 安装

这不是大神的随笔,只是记忆力不好的码农笔记

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 使用时 由于环境变量没有配置,命令一般使用绝对路径,文件也使用绝对路径

  1. 拷贝远程文件到本地
    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:允许压缩
    一个完整的例子

  2. 使用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
    
  3. 本地服务器新建crontab任务,每五分钟执行一次
    */5 * * * * /bin/bash /home/xuze/projects/gw_proxy/ch_ip.sh

  4. 远程服务器
    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
    
  5. 服务器端添加crontab任务 每五分钟执行一次
    */5 * * * * /bin/bash /root/proxy/proxy.sh

总结

crontab 使用的时候不能识别shell的某些命令,所以路径一般都要写绝对路径
expect 获取参数值,与shell不一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值