`

Linux下使用Expect远程执行shell命令和脚本

 
阅读更多

摘自:http://blog.zheezes.com/expect-remote-execution-under-linux-using-shell-commands-and-scripts.html

 

有几十台Linux服务器都要执行一组相同的操作,一台一台的登录上去执行不现实,只能是软件自动化的操作,而ssh本身是交互的,无法通过管道的方式进行输入,这就需要借助Tcl脚本和Expert两个工具了。

Tcl(Tool Command Language),类似于python,也是一种跨平台的脚本语言,不过有自己的语法,这里使用的的原因是,TclExpect工具的基础。

Expect,是Unix/Linux中用来进行自动化控制和测试的软件工具,由Don Libes制作,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnetftpPasswdfsckrlogintipssh等等。简单的说,Expect可以通过编程模拟人与ssh的交互。

Expect脚本的编写使用比较麻烦,所以下面的脚本将Expect命令封装到shell函数中,对使用者来说,在环境中安装好Expect工具,然后直接调用shell函数就好了。

make_tmp_filemake_rand_file是辅助的函数,用于生成临时文件。exec_script用于远程执行脚本,参数为主机的ip端口用户密码和要执行的脚本,exec_cmd用于远程执行命令,用于一行就能执行完的命令,注意timeout等可选参数。

最新最完整的shell脚本,附送大量超赞shell函数,你值得拥有gear.sh

 functionmake_tmp_file()

{
    local name=${1:-"rand"}
    local magic=`date+%s`
    echo"/tmp/__${magic}__${name}"
}
 
functionmake_rand_file()
{
    make_tmp_file"$*"
}
 
# int exec_script(host, port, user, passwd, script, [timeout = 86400])
# 0, succ
# 1, fail
# 2, invalid params
# 3, fail
# 4, invalid script
# 5, login fail
# 6, put file fail
# 7, timeout
# 8, remote execute script fail
functionexec_script()
{
    if[$# -lt 5 ]; then
        return2
    fi
 
    local host=$1
    local port=$2
    local user=$3
    local passwd=$4
    local script=$5
    local timeout=$((${6:-86400}))# default 1 day
    local rscp=$(make_rand_file`basename$script`)
    local ret=0
 
    if[!-f$script];then
        return4
    fi
 
    echo"script = ${script}, remote_script = ${rscp}"
    ssh_put$host$port$user$passwd$script$rscp
 
    expect-c"
        set timeout$timeout
        set flag0
        spawn ssh$user@$host;
        expect{
            \"*assword*\"{send$passwd\r;}
            \"yes\/no)?\"{
                set flag1;
                send yes\r;
            }
            \"Welcome\"{}
        }
        if{\$flag==1}{
            expect{
                \"*assword\"{
                    send$passwd\r;
                }
            }
        }
        expect{
            \"*assword*\"{
                puts\"INVALID PASSWD,host=$host,user=$user,passwd=$passwd\";
                exit1
            }
            \"#\ \" {} \"$\ \" {} \">\ \" {}
        }
        send$rscp\r;
        expect{
            \"#\ \" {} \"$\ \" {} \">\ \" {}
        }
        send\"rm-f$rscp\r\"
        send exit\r;
        expecteof{
            exit0
        }
    "
    ret=$?
    if[$ret-ne0];then
        return5
    fi
 
    return0
}
 
# int exec_cmd(host, port, user, passwd, cmd, [timeout = 86400], [rfile = /dev/null])
# 0, succ
# 1, fail
# 2, invalid params
# 3, fail
# 4, invalid script
# 5, login fail
# 6, put file fail
# 7, timeout
# 8, remote execute script fail
functionexec_cmd()
{
    if[$# -lt 5 ]; then
        return4
    fi
 
    local host=$1
    local port=$2
    local user=$3
    local passwd=$4
    local cmd=$5
    local timeout=$((${6:-86400}))# default 1 day
    local rfile=${7-"/dev/null"}
    #local log=$(make_tmp_file "${__GEAR_SH}_exec_cmd")
    local ret=0
 
    expect-c"
        set timeout$timeout
        set flag0
        spawn ssh$user@$host;
        expect{
            \"*assword*\"{send$passwd\r;}
            \"yes\/no)?\"{
                set flag1;
                send yes\r;
            }
            \"Welcome\"{}
        }
        if{\$flag==1}{
            expect{
                \"*assword\"{
                    send$passwd\r;
                }
            }
        }
        expect{
            \"*assword*\"{
                puts\"INVALID PASSWD,host=$host,user=$user,passwd=$passwd\";
                exit1
            }
            \"#\ \" {} \"$\ \" {} \">\ \" {}
        }
        log_file${rfile}
        send\"$cmd\r\";
        expect{
            \"#\ \" {} \"$\ \" {} \">\ \" {}
        }
        send exit\r;
        expecteof{
            exit0
        }
    "
    cat${rfile}|sed-n'1,/[#$>].*exit/p'|sed'1d;$d'>${rfile}
    #if [ -f ${log} ]; then rm ${log}; fi
    ret=$?
    if[$ret-ne0];then
        return5
    fi
 
    return0
}
分享到:
评论

相关推荐

    shell脚本远程启动其他服务器的tomcat传输文件自动登录判断启动停止

    这个"shell脚本远程启动其他服务器的tomcat传输文件自动登录判断启动停止"的方案,就是一种典型的自动化运维实践,它结合了多个核心工具和技术,包括shell脚本、expect、ssh以及scp,用于实现远程服务器管理与文件...

    远程批量修改linux服务器密码的脚本归类.pdf

    我们使用 SSH 来连接远程 Linux 服务器,并执行相关的命令。 3. Linux 服务器密码的修改:我们使用 Expect 脚本来修改 Linux 服务器的密码。该脚本可以自动地输入密码,并执行相关的命令。 4. 用户和组的管理:在 ...

    14.Shell脚本编程之expect.md

    通过使用 Expect,可以将原本需要手动进行的操作,例如 SSH 登录、FTP 登录等,编写成脚本自动执行。这在需要对多台服务器执行相同操作的场景下尤其有用,能够显著提高系统管理员的工作效率。 ### 2. 安装 Expect ...

    详解Linux使用shell+expect远程登录主机

    ### 详解Linux使用Shell+Expect远程登录主机 在Linux环境下,使用Shell脚本结合Expect工具进行远程登录是一种高效且灵活的方式。本文将详细介绍如何利用这两种工具实现自动化远程登录,并提供具体的实现步骤及注意...

    Linux经典脚本expect的示例及基本用法

    在Linux环境下,系统管理员和开发人员经常会遇到需要自动化执行的任务,尤其是那些涉及到远程登录、文件传输等交互式操作的场景。传统的Shell脚本虽然能够很好地处理非交互式的任务,但在面对需要与用户进行交互的...

    远程调用linux命令的demo

    首先,“源码”标签意味着文章可能包含了具体的代码示例,可能是Python、Shell脚本或者其他编程语言,用于演示如何实现远程执行Linux命令。通常,我们可以使用SSH(Secure Shell)协议来实现这一点,例如Python中的...

    shell中使用expect命令进行远程执行命令脚本

    在Linux系统管理中,有时我们需要自动化执行远程服务器上的任务,比如执行命令或脚本,而`expect`命令正为此目的而设计。`expect`是一个TCL语言的扩展,用于自动处理交互式应用程序,如SSH、telnet等。通过使用`...

    java调用shell脚本

    总的来说,这些资源为你提供了在Java环境中调用Shell脚本所需要的基础工具和示例,涵盖了SSH连接、命令执行和交互式脚本控制。通过学习和使用这些库,你将能够构建强大的系统管理工具和自动化解决方案。

    11.26 交换机配置,支持远程网口登陆。写shell脚本的测试用例设计.rar

    Shell脚本是Linux/Unix系统中的一种自动化工具,用于执行一系列命令。在交换机配置的场景中,测试用例设计的主要目标是确保脚本的正确性和可靠性。设计测试用例时,应考虑以下几个方面: 1. **功能测试**:验证脚本...

    expect5.43.0和tcl8.4.11.zip

    `SHELL`标签表明`Expect`脚本可以和shell脚本结合使用,进一步提升命令行操作的自动化水平。`SFTP`标签则表示`Expect`可以用来处理SFTP会话,实现文件的安全上传和下载,这对于系统维护和备份工作非常实用。 在实际...

    Linuxssh登录远程服务器 expect

    SSH(Secure Shell)是Linux环境下用于远程登录的一种安全协议,它允许用户通过加密的方式连接到另一台计算机,进行命令执行、文件传输等操作。当需要自动化这些过程时,`expect`工具就显得尤为重要。`expect`基于...

    Shell脚本专家指南

    本书不仅提供了实用的脚本和技巧,还深入探讨了Shell脚本编程的核心概念和技术。下面是对书中各章节涉及的关键知识点的总结。 ### 第一部分 基本脚本编程技术 #### 第1章 shell脚本的错误检测 - **shell跟踪选项**...

    用于shell脚本无交互的ssh自动登陆(转载)

    在进行Linux系统管理或自动化任务部署时,经常需要使用SSH(Secure Shell)协议远程连接到其他服务器上执行命令或管理操作。出于安全考虑,SSH在连接远程主机时会要求输入密码,但在脚本自动化场景中,这种交互式...

    linux 模拟键盘输入

    在Linux环境中,模拟键盘输入是一项常用技能,特别是在自动化脚本、远程操作等场景中。本文将详细介绍如何通过不同的工具和技术来实现这一功能。 #### 使用Expect进行模拟键盘输入 **Expect**是一款强大的自动化...

    shell自制脚本.rar

    总之,Shell脚本和Expect工具的结合使用,使得我们可以构建出高效、可靠的远程服务器管理方案,这对于大型分布式系统的运维至关重要。通过对这两个工具的学习和实践,IT专业人员能够提升自己的自动化技能,进一步...

    Linux中使用expect脚本实现远程机器自动登录

    在这篇文章中,我们将详细介绍如何在Linux中使用expect脚本来实现远程机器的自动登录。 首先,我们需要创建一个名为`ssh_expect`的expect脚本。这个脚本的主要任务是接收三个参数:远程主机名(hostname)、用户名...

    Shell脚本实现自动输入密码登录服务器

    Shell脚本实现自动输入密码登录服务器是自动化运维和部署中的常见需求,特别是在执行涉及权限验证的任务时,如scp文件传输或SSH远程连接。在这种情况下,使用expect工具可以帮助我们编写脚本,自动处理需要用户交互...

Global site tag (gtag.js) - Google Analytics