當前位置:首頁 » 編程軟體 » expect腳本變數

expect腳本變數

發布時間: 2022-11-08 07:31:45

⑴ 請問各位大神,如何在shell中調用expect腳本,並將剛剛在shell中處理後的結果傳給expect

使用變數保存處理結果,然後在調用expect
#!/bin/sh
expect <<!
spawn ssh xx@yyy
expect "*Password*"
send "xxx\r"
expect ">"
send "mkdir xxxxx\r"
send "exit\r"
expect eof
!

linux遠程重啟windows

安裝步驟:

1、進入鏈接下載最新 OpenSSH-Win64.zip(64位系統),解壓至C:Program FilesOpenSSH

2、打開cmd,cd進入C:Program FilesOpenSSH(安裝目錄),執行命令:

powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1

3、設置服務自動啟動並啟動服務:

sc config sshd start= auto

net start sshd

到此服務已經安裝完畢,默認埠一樣是22,默認用戶名密碼為Window賬戶名和密碼,當然防火牆還是要設置對應埠允許通訊

修改設置:

通常linux下會修改ssh_config文件來修改ssh配置,但在安裝目錄並沒有發現這個文件,查閱官方wiki後發現,原來是在C:ProgramDatassh目錄下(此目錄為隱藏目錄)

埠號:Port 22

密鑰訪問:PubkeyAuthentication yes

密碼訪問:PasswordAuthentication no

空密碼:PermitEmptyPasswords no

然後進入C:Users賬戶名.ssh目錄,創建authorized_keys公鑰文件(也可在ssh_config修改路徑)(僅限7.7之前版本,7.9版本請看最後更新)

設置完成後重啟sshd服務,接下來就可以使用Xshell等工具使用密鑰連接了~

踩過的坑:

命令行不識別空格時:C:Program Files用C:Progra~1替代

Windows Service2012R2即使配置了.ssh/authorized_keys公鑰,連接時依然顯示沒有注冊公鑰。。。

查閱了官方wiki判斷可能是許可權問題:Fix SSH file permissions

進入C:Program FilesOpenSSH(安裝目錄),右鍵 FixHostFilePermissions.ps1【使用PowerShell運行】,命令行提示全選是,重啟sshd服務後密鑰連接正常

2019.5.17更新:

新部署伺服器的時候,發現公鑰無法注冊,發現新版本有變動:

執行的命令為:

  • ./deploy/startwin 10.24.196.213 administrator Test1127?!

  • ⑶ Linux expect

    expect:expect是Unix系統中用來進行自動化控制和測試的腳本工具,常用於實現互動式任務的自動化。使用命令」dnf install expect -y」進行安裝。腳本文件聲明為」#!/usr/bin/expect」。

    expect常用命令如下:

    1.spawn+交互命令(如spawn ssh [email protected]):」spawn」是expect的初始命令,用於啟動一個新的交互進程,之後所有的操作都會在這個進程中進行。

    2.set:定義變數/為變數賦值。使用語法:set 變數名 值。

    3.puts:將變數值/字元串定向到本地標准輸出文件(即定位到屏幕)。使用語法:puts 「字元串/$變數名」

    4.send_user:作用和使用方法類似於」puts」,區別在於」puts」會在輸出內容的結尾自動追加一個換行符,而」send_user」不會。

    5.send:向交互進程發送信息/命令(字元串和一些特殊符號,\r—回車,\n—換行,\t—製表符)。使用語法:send 「信息/命令[\r]」。

    6.[lindex $argv 數字]:表示外部傳遞參數的值,數字是n,就表示第n-1個參數。註:$argc表示外部傳遞參數的個數,也是一個值。

    7.expect+字元串+{ 命令 }:將字元串與交換進程接收到的信息進行匹配。如果匹配成功(字元串是交換進程接收到的信息的一部分),執行包含在」{}」中的命令;如果匹配失敗,不執行包含在」{}」中的命令。該命令有三種使用方法:

    第一種:單分支模式

    ①expect 字元串 { 命令 }

    解釋:如果字元串與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串與交換進程接收到的信息匹配失敗,timeout秒後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)

    ②expect {

    字元串{ 命令 }

    timeout { 命令 }

    }

    解釋:如果字元串與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串與交換進程接收到的信息匹配失敗,timeout秒後執行包含在」{}」中的命令,之後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)

    第二種:多分支模式

    ①expect {

    字元串1 { 命令 }

    字元串2 { 命令 }

    }

    解釋:如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並結束該expect命令;如果字元串1與交換進程接收到的信息匹配失敗、字元串2與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串1、字元串2皆與交換進程接收到的信息匹配失敗,timeout秒後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)

    ②expect {

    字元串1 { 命令 }

    字元串2 { 命令 }

    timeout { 命令 }

    }

    解釋:如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並結束該expect命令;如果字元串1與交換進程接收到的信息匹配失敗、字元串2與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並結束該expect命令;如果字元串1、字元串2皆與交換進程接收到的信息匹配失敗,timeout秒後執行包含在」{}」中的命令,之後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)

    第三種:循環多分支模式(註:exp_continue命令只能出現在expect命令的匹配語句中,執行到exp_continue命令時,腳本會跳出當前expect命令,並重新執行該expect命令,直到expect命令通過不包含exp_continue命令的匹配語句結束、或expect命令匹配超時結束。)

    ①expect {

    字元串1 { 命令; exp_continue }

    字元串2 { 命令 }

    }

    解釋:如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並重新執行該expect命令;如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並重新執行該expect命令...;如果字元串1與交換進程接收到的信息匹配失敗、字元串2與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串1、字元串2皆與交換進程接收到的信息匹配失敗,timeout秒後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)

    ②expect {

    字元串1 { 命令; exp_continue }

    字元串2 { 命令 }

    timeout { 命令 }

    }

    解釋:如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並重新執行該expect命令;如果字元串1與交換進程接收到的信息匹配成功,執行執行包含在」{}」中的命令,並重新執行該expect命令...;如果字元串1與交換進程接收到的信息匹配失敗、字元串2與交換進程接收到的信息匹配成功,執行包含在」{}」中的命令,並結束該expect命令;如果字元串1、字元串2皆與交換進程接收到的信息匹配失敗,timeout秒後執行包含在」{}」中的命令,之後結束該expect命令。(註:腳本執行到expect命令時,計時器就開始計時,並會在計時器超時前不斷對交換進程接收到的信息進行掃描,嘗試字元串與信息的匹配。)

    8.timeout:timeout是expect中的一個關鍵字變數,用於控制expect命令的超時時間。需要注意的是,這個超時時間針對於整個expect命令,而不是針對於expect命令中的某條匹配語句。也就是說,只有expect命令中所有匹配語句都匹配失敗後,才會開始計算超時時間。timeout變數值預設為10(秒),我們可以通過」set timeout=值」的方式為其重新賦值,作用范圍:本次賦值到下一次賦值間的所有expect命令。註:如果需要為timeout變數重新賦值,應在expect命令之外進行。

    9.expect eof:該命令的作用是結束spawn交互進程,將命令行切回至運行腳本的主機(即從遠端伺服器登出)。

    10.interact:預設情況下,expect腳本執行完畢後會自動從遠端伺服器登出(即便沒有顯式地執行」expect eof」命令)。使用interact命令後,expect腳本執行完畢會繼續保持當前狀態,並將控制權移交給用戶。

    11.exit:結束該腳本。

    expect中的if語句:

    if { 條件表達式 } {

    命令

    }

    if { 條件表達式 } {

    命令

    } else {

    命令

    }

    expect中的while語句:

    while { 條件表達式 } {

    命令

    }

    expect中的for語句:

    for { set i 1 } { $i <=10 } { incr i } {

    命令

    }

    incr變數名 步長   ——變數自增

    incr 變數名 -步長    ——變數自減

    數學運算需使用let、expr等工具

    ⑷ linux系統sftp結合expect使用時,寫腳本遇到參數問題

    您好,你的腳本設置filename變數語法不對,filename="xxxx"這是shell的語法。
    expect應該如下設置變數,變數和值之間是空格分隔,不是"="符號:
    set <var> <value>

    ⑸ shell腳本expect自動登錄後,怎麼又自動退出了

    1.安裝expect
    需要先安裝tcl:apt-get install tcl
    apt-get install expect
    2.expect使用
    2.1一個簡單的輸入密碼操作
    #!/usr/bin/expect
    set timeout 100
    set password "123456"
    spawn sudo rm -rf zzlogic
    expect "root123456"
    send "$password\n"
    interact
    說明:
    第一行#!/usr/bin/expect表示使用expect的shell交互模式
    set是對變數password賦值
    set timeout 100:設置超時時間為100秒,如果要執行的shell命令很長可以設置超時時間長一些。expect超過超時時間沒有監測到要找的字元串,則不執行,默認timeout為10秒
    spawn在expect下執行shell腳本
    expect對通過spawn執行的shell腳本的返回進行判斷,是否包含「」中的欄位
    send:如果expect監測到了包含的字元串,將輸入send中的內容,\n相當於回車
    interact:退出expect返回終端,可以繼續輸入,否則將一直在expect不能退出到終端
    2.2expect的命令行參數
    [lindex $argv n]獲得index為n的參數(index從0開始計算)
    $argc為命令行參數的個數
    [lrange $argv 0 0]表示第一個參數
    [lrange $argv 0 3]表示第1到第3個參數
    例如scp_service.sh文件,可以./scp_service.sh -rm來執行,這時是賦值了一個參數
    set option [lindex $argv 0](獲得第一個參數存到變數option中,參數是的index是從0開始計算的)
    2.3if...elif...else...
    expect支持if語句,
    if {條件1} {
    條件1執行語句
    } elif {條件2} {
    條件2執行語句
    } else {
    其他情況執行語句
    }
    說明:
    1.if的條件用{}來包含條件
    2.if和後面的{}必須有空格隔開
    3.兩個花括弧之間必須有空格隔開,比如if {} {},否則會報錯 expect:extra characters after close-brace
    3.使用{來銜接下一行,所以if的條件後需要加左花括弧{
    4.else不能單獨放一行,所以else要跟在}後面
    2.4 expect {},多行期望,匹配到哪條執行哪條
    背景:有時執行shell後預期結果是不固定的,有可能是詢問是yes/no,有可能是去輸入密碼,所以可以用expect{}
    花括弧內放多行語句,從上至下匹配,匹配到哪個expect執行哪句。
    3.shell中調用expect來實現登錄
    我是通過在shell腳本中執行expect腳本的方式來實現的。當然可以將shell中定義的一些變數傳遞給expect腳本作為參數輸入。

    ⑹ 在shell(#!/bin/sh)腳本中怎麼使用expect命令,需要添加什麼環境變數嗎,正確即給分

    首先你在命令行執行env expect,看expect能不能用,如果不能用,那麼你需要找到expect執行文件路徑,加入到PATH環境變數中去。

    然後就可以在shell中使用了,有兩種方式實現:
    1.用here document
    2.用expect -c

    $cat 1.sh
    #!/bin/sh
    output=`expect <<EXP
    puts "hello world"
    EXP
    `
    echo "expect 1 output:"
    echo $output
    echo
    echo "expect 2 output:"
    expect -c 'puts "hello world!"'

    $chmod 777 1.sh

    $./1.sh
    expect 1 output:
    hello world

    expect 2 output:
    hello world!

    ⑺ 如何向expect腳本裡面傳遞參數

    向expect腳本裡面傳遞參數:
    比如下面腳本用來做ssh無密碼登陸,自動輸入確認yes和密碼信息,用戶名,密碼,hostname通過參數來傳遞

    ssh.exp

    Python代碼
    #!/usr/bin/expect
    set timeout 10
    set username [lindex $argv 0]
    set password [lindex $argv 1]
    set hostname [lindex $argv 2]
    spawn ssh--id -i .ssh/id_rsa.pub $username@$hostname
    expect "yes/no"
    send "yes\r"
    expect "password:"
    send "$password\r"

    expect eof

    執行腳本./ssh.exp root pasword hostname1

    expect接收參數的方式和bash腳本的方式不太一樣,bash是通過$0 ... $n 這種方式,而expect是通過set <變數名稱> [lindex $argv <param index>],例如set username [lindex $argv 0]

    熱點內容
    php花生 發布:2025-05-14 12:54:30 瀏覽:549
    java人才 發布:2025-05-14 12:29:10 瀏覽:649
    如何打開軟密碼 發布:2025-05-14 12:28:55 瀏覽:427
    七牛存儲待遇 發布:2025-05-14 12:27:20 瀏覽:422
    C語言a35a4a5 發布:2025-05-14 11:53:48 瀏覽:813
    android隱藏item 發布:2025-05-14 11:43:56 瀏覽:328
    javawebeclipse編譯 發布:2025-05-14 11:35:24 瀏覽:938
    可編程式控制制器試題 發布:2025-05-14 11:25:32 瀏覽:122
    dsp混合編程 發布:2025-05-14 11:23:10 瀏覽:250
    mysql添加存儲過程 發布:2025-05-14 11:23:01 瀏覽:882