2012-06-27 152 views
3

我试图实现与一个bash脚本如下:远程SSH和命令执行使用bash和期待

  1. 拉升SSH连接,如果失败,错误出如果SSH连接是
  2. 一旦确认中,执行“顶部”命令,并将结果保存到从远程服务器

我知道invidiual命令,这将是文件

  • SCP文件回: 1)以检查ssh连接:

    ssh -q [email protected] exit 
    

    echo $?

    这应该成功返回 '0' 和 '255' 的错误。

    2)执行顶部并保存到文件将是:

    top -n 1 -b > /tmp/top.out 
    

    3)从远程主机scp将文件

    expect -c " 
        set timeout 1 
        spawn scp [email protected]:/tmp/top.out [email protected]:/. 
        expect yes/no { send yes\r ; exp_continue } 
        expect password: { send password\r } 
        expect 100% 
        sleep 1 
        exit 
    " 
    

    下面把这个完全是我的问题,更具体:

    • 当使用期望tes时,我似乎无法得到返回的'0'和'255'值t SCP连接。

      • 我似乎无法能够再次使用预期来执行top命令,即这不起作用:

      期待-c“ 设定超时1个 产卵SSH用户@主机顶部-n 3 -b> /tmp/top.out 期望密码:{发送密码\ R} 睡眠1个 出口 “

      • 并且因此第三位不会活像k也是。

    任何帮助表示赞赏。请记住,我的脚本是一个.sh脚本,其中#!/ bin/bash声明 - 由于各种原因,我不能使用#!/ usr/bin/expect

  • +0

    如果您拥有源代码发行版或系统的expect-dev软件包,您应该具有自动预期功能。您可能希望交互式运行命令,并查看autoexepect认为对话应该是什么样子。 –

    +1

    这就是它的样子,它的设置是在我的公司,这不是我的错,所以我只是想充分利用它 – Tamas

    回答

    4

    现在这是丑陋的东西。有很多缺陷,可能你不太清楚你在shell中执行的地方,还是使用普通的argv数组。此外,期望的东西不是应该完成,这只是脆弱的。

    (AFAIK,expect主要用于与调制解调器(AT命令集)等进行通信)。

    将SSH密钥用于自动ssh和scp而不是密码。一旦你做到这一点(甚至之前,但你必须手动输入密码),在你的shell启动此:

    $ ssh [email protected] "top -n 1 -b" > /tmp/top.out 
    

    该文件将成为您本地机器上。 (因为重定向是在本地完成的,还没有远程完成)。不需要scp。

    就是这样。

    0

    检查这一项: https://stackoverflow.com/a/23632210/524743

    expect <<'END' 
    log_user 0 
    spawn sh -c {echo hello; exit 42} 
    expect eof 
    puts $expect_out(buffer) 
    
    lassign [wait] pid spawnid os_error_flag value 
    
    if {$os_error_flag == 0} { 
        puts "exit status: $value" 
    } else { 
        puts "errno: $value" 
    } 
    END 
    
    hello 
    
    exit status: 42 
    

    从期望手册页

    等待[参数]

    延迟,直到衍生的进程(或当前进程,如果没有被命名为)终止。

    通常等待返回一个四个整数列表。第一个整数是等待的进程的PID。第二个 integer是相应的spawn id。如果发生了 操作系统错误,则第三个整数为-1,否则为0。如果第三个整数 为0,则第四个整数是生成的 进程返回的状态。如果第三个整数是-1,则第四个整数是由操作系统设置的errno的值 。全局变量errorCode也设置为 。

    +1

    虽然这个链接可能回答这个问题,但最好包括基本部分答案在这里,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 –

    +0

    @MauricioGracia修正,谢谢:) – Samuel