2012-06-27 87 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