使用expect实现远程ssh命令执行和scp拷贝文件

工作运维需要远程不输入密码运行命令,鼓捣了下expect,实现了一个远程调用的函数。 调用方式ssh_exec ip pwd cmd。记录一下免得以后找不到了需要重新搞。 其他人有需要可以直接用,不过记得适配一下自己的环境,主要的应该是expect里面的*#匹配,这个匹配的是linux系统上的shell的固定显示的那部分,比如linux-osewGl:~ #之类的。

function ssh_exec () {
    local ip=$1
    local passwd=$2
    local cmd=$3
    [ -z "$ip" -o -z "$passwd" -o -z "$cmd" ] && return 1
    /usr/bin/expect << EOF
    proc remote_exec {ip passwd cmd} {
        spawn ssh root@\$ip
        exp_internal 0
        expect {
            "yes/no" { send "yes\\r";exp_continue}
            "*password:" {send "\$passwd\\r"}
        }
        expect "*#"
        send "\$cmd\\r"
        expect "*#"
        send "exit"
        close
    }

    remote_exec "$ip" "$passwd" "$cmd"
EOF
}

function scp_get () {
    local ip=$1
    local passwd=$2
    local src=$3
    local dst=$4

    [ -z "$ip" -o -z "$passwd" ] && return 1
    /usr/bin/expect << EOF
    proc remote_exec {ip passwd src dst} {
        spawn scp root@\$ip:\$src \$dst
        exp_internal 0
        expect {
            "yes/no" { send "yes\\r";exp_continue}
            "*password:" {send "\$passwd\\r"}
        }
        expect eof
    }

    remote_exec "$ip" "$passwd" "$src" "$dst"
EOF
}

 

Shell脚本是一种用于自动化执行命令行指令的脚本语言,常用于Linux和Unix系统中。Expect是一个用来自动化控制交互式应用程序如telnet、ftp、passwd、fsck、rlogin、ssh甚至是一个脚本语言解释器的工具。通过Expect,可以编写脚本来自动执行交互式程序,比如SSH连接到远程服务器进行操作。 要使用Shell和Expect脚本通过SSH服务器进行文件备份和git clone操作,可以分为以下几个步骤: 1. 使用Shell脚本编写自动化任务。 2. 使用Expect脚本处理SSH连接时的交互,比如输入密码。 3. 在连接成功后执行文件备份命令,比如使用`rsync`或者简单的`scp`命令。 4. 执行`git clone`来获取远程仓库的代码。 下面是一个简单的示例流程: 首先,你需要一个Expect脚本来处理SSH连接和密码输入: ```bash #!/usr/bin/expect set timeout -1 set host "your_ssh_server" set user "your_username" set password "your_password" set remote_path "/path/to/remote/directory" set local_path "/path/to/local/directory" spawn ssh -o StrictHostKeyChecking=no $user@$host expect { "yes/no" { send "yes\r"; exp_continue } "$password" { send "$password\r" } } expect "# " send -- "cd $remote_path\r" send -- "git clone [repository-url]\r" send -- "exit\r" expect eof ``` 然后,你可以在Shell脚本中调用这个Expect脚本来执行整个过程: ```bash #!/bin/bash # 调用expect脚本 expect_script="path_to_your_expect_script.exp" $expect_script # 等待expect脚本执行完毕 sleep 5 # 使用rsync进行文件备份 rsync -avz --progress [local_user]@[ssh_server]:$remote_path $local_path echo "备份和克隆操作完成" ``` 注意,使用密码明文存储和脚本自动化这些敏感操作需要考虑安全性。一个更安全的方法是使用SSH密钥认证来代替密码,然后配置Expect脚本来使用私钥。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值