1. 程式人生 > >expect實現指令碼中ssh密碼輸入

expect實現指令碼中ssh密碼輸入

#!/usr/bin/expect


if { [llength $argv] < 4 } {
        puts "Usage: $argv0 ip user passwd port commands timeout"
        exit 1
}
match_max 600000
set ip [lindex $argv 0]
set user [lindex $argv 1]
set passwd [lindex $argv 2]
set port [lindex $argv 3]
set commands [lindex $argv 4]
set timeoutflag [lindex $argv 5]
set yesnoflag 0
set timeout $timeoutflag

for {} {1} {} {
# for is only used to retry when "Interrupted system call" occured
spawn /usr/bin/ssh -q -l$user -p$port $ip

expect  {
        "assword:" {
                send "$passwd\r"
                break;
        }

        "yes/no)?" {
                set yesnoflag 1
                send "yes\r"
                break;
        }

        "FATAL" {
                puts "\nCONNECTERROR: $ip occur FATAL ERROR!!!\n"
                exit 1
        }
        timeout {
                puts "\nCONNECTERROR: $ip Logon timeout!!!\n"
                exit 1
        }

        "No route to host" {
                puts "\nCONNECTERROR: $ip No route to host!!!\n"
                exit 1
        }

        "Connection Refused" {
                puts "\nCONNECTERROR: $ip Connection Refused!!!\n"
                exit 1
        }

        "Connection refused" {
                puts "\nCONNECTERROR: $ip Connection Refused!!!\n"
                exit 1
        }

        "Host key verification failed" {
                puts "\nCONNECTERROR: $ip Host key verification failed!!!\n"
                exit 1
        }

        "Illegal host key" {
                puts "\nCONNECTERROR: $ip Illegal host key!!!\n"
                exit 1
        }

        "Connection Timed Out" {
                puts "\nCONNECTERROR: $ip Logon timeout!!!\n"
                exit 1
        }

        "Interrupted system call" {
                puts "\n$ip Interrupted system call!!!\n"
        }
}
}

if { $yesnoflag == 1 } {
        expect {
                "assword:" {
                        send "$passwd\r"
                }


                "yes/no)?" {
                        set yesnoflag 2
                        send "yes\r"
                }
        }
}

if { $yesnoflag == 2 } {
        expect {
                "assword:" {
                        send "$passwd\r"
                }
        }
}

expect {
        "#" {send "$commands \r"}
        ">" {send "$commands \r"}
        "$" {send "$commands \r"}
        "assword:" {
                send "$passwd\r"
                puts "\nPASSWORDERROR: $ip Password error!!!\n"
                exit 1
        }
}

expect {
        "#" {send "sleep 1 \r"}
        ">" {send "sleep 1 \r"}
        "$" {send "sleep 1 \r"}
}

expect {
        "#" {send "exit\r"}
        ">" {send "exit\r"}
        "$" {send "exit\r"}
}

expect eof {
        puts "OK_SSH: $ip\n"
        exit 0;
}

[[email protected] home]# cat ndbstop.sh 
#!/bin/bash
#mysql節點
mgmip1=192.168.1.91
mgmip2=192.168.1.94
ndbip1=192.168.1.91
ndbip2=192.168.1.94
mysqlip1=192.168.1.91
mysqlip2=192.168.1.94
#管理節點啟動
#mgmstart="ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial"
sqlstop="service mysql stop"
mgmstop='ndb_mgm -e shutdown'
echo $mgmstop
/home/test.exp $mgmip1 root root001 22 "${mgmstop}" 10 
/home/test.exp $mgmip2 root root001 22 "${mgmstop}" 10 
#/home/test.exp $mgmip1 root root001 22 $ndbmtd 20
#/home/test.exp $mgmip2 root root001 22 $ndbmtd 20
/home/test.exp $mgmip1 root root001 22 "${sqlstop}" 20
/home/test.exp $mgmip2 root root001 22 "${sqlstop}" 20

相關推薦

expect實現指令碼ssh密碼輸入

#!/usr/bin/expect if { [llength $argv] < 4 } {         puts "Usage: $argv0 ip user passwd port commands timeout"         exit 1 } ma

mac 下使用 Shuttle 配合expect指令碼使用ssh輸入密碼登入

使用expect指令碼可以根據螢幕顯示的要求自動輸入相應的指令。 編寫/data/ssh/ssh-server.sh #!/usr/bin/expect set timeout 30 spawn ssh -p [lindex $argv 0] [lindex $ar

指令碼連結 ssh 自動輸入密碼

上週工作中,遇見一些重複性的工作,為了方便,於是寫起了指令碼。 在這個指令碼中,需要通過 s s

webstormgit密碼輸入錯誤,重置問題

分享圖片 習慣 etc 工具 重啟 webstorm 使用 重置 words 今天遇到了一個問題。 因為我比較習慣使用webstorm編輯器,特別喜歡直接用裏面的git工具。 當從遠程倉庫fetch下來代碼時,提示輸入用戶名密碼。 我輸入錯誤後,以後無論是重啟webstor

html5+css實現六位數字密碼輸入對話方塊(類似支付寶,微信)

先來看看原型圖:直接上程式碼:html<div class="common-part pay-part"> <div class="common-dialog pay-dialog"> <div class

shell 指令碼關於使用者輸入參…

1、命令列引數 向shell指令碼傳遞資料的最基本方式是使用命令列引數。 (1) 讀取引數    讀取輸入的引數的變數為位置引數,位置引數通過標準數字表示,    其中$0為程式名稱,$1為第一個引數,$2為第二個引數,依次類推,直到$9為第九個引數。    shell指令碼自動將命令列引數賦值給各個位置變

ssh采用expect實現自動輸入密碼登錄、拷貝

cep .html tro from 效果 方式 目標 led 交互 1. 引言 最近做了一個項目,需要頻繁與另一臺主機進行文件的傳輸;中間想到了很多方式:FTP、samba、curl等,但是還是感覺scp最好用。 SCP使用教程可參閱:http://www.jb51.

如何在shell指令碼實現 scp 檔案的時候不手動輸入密碼

在shell指令碼中實現 scp 檔案的時候不手動輸入密碼的指令碼如下: #!/usr/bin/expect -f set password 密碼 spawn scp 使用者名稱@目標機器ip:拷貝檔案的路徑 存放本地檔案的路徑  set timeout 300 

ubuntu下用expect實現密碼自動輸入

echo 遠程 shell ## 告訴 linux inux word linux下 每次筆記本一開機啟動,總會連用不著且礙事的觸摸板也一塊啟動。便想寫個腳本,讓電腦啟動時關閉觸摸板。(當然,我想更好的辦法是,修改系統啟動時的加載模塊,讓觸摸板不自動加載,但是目前還不知道用

解決 shell指令碼SCP命令需要輸入密碼的問題

本文轉自:https://blog.csdn.net/u012454773/article/details/72779439 使用金鑰檔案,兩臺機器建立信任 這裡假設主機A(192.168.100.3)用來獲得主機B(192.168.100.4)的檔案。 在主機A上執行如下命令來生成配對金鑰:

使用expect實現ssh密碼登陸

使用expect向ip列表檔案中的ip主機,執行ssh-copy-id命令複製金鑰,以實現ssh免密登陸。 安裝expect yum install -y expect 生成金鑰對 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa 指令碼 //shell指令碼內容

Shell指令碼實現輸入的字元轉換為*

如果你需要寫一段與使用者互動,且需要輸入一些敏感資訊的(例如:使用者密碼、License等),那麼直接用printf+read的方式,就會把使用者輸入的資訊顯示在螢幕了,這是不符合資訊保安的,而且對客戶體驗來說也顯得不夠專業,所以就需要將使用者輸入的密碼轉換為*,樣式如下: please input

總結三種Shell指令碼程式設計避免SFTP輸入密碼的方法

最近程式設計中用到sftp上傳檔案,且需要用crontab預設定時上傳事件。而sftp不同於ftp,沒有提供選項如 -i 可以將密碼直接編碼程序序。使用sftp指令,會自動請求使用者輸入密碼。 總結一下可以避免sftp輸入密碼的三種方式: 1. lftp方式 LFTP

shell 指令碼經常要用到ssh。怎麼能不互動的輸密碼呢?

1、登入A機器 2、ssh-keygen -t [rsa|dsa],將會在~/.ssh下生成金鑰檔案和私鑰檔案 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub 3、將 .pub 檔案複製到B機器的 .ssh 目錄, 並 cat

sftp在指令碼如何時使用(不用輸入密碼

實現過程: 主要步驟如下: 1.為執行shell指令碼的本地使用者生成金鑰對 2.將其中的公鑰分發到sftp欲登入的遠端伺服器上 3.編寫並以上面的本地使用者執行shell指令碼 一.生成金鑰對 在shell指令碼中使用sftp時必須用到金鑰對(公鑰和私鑰).可使用下列

指令碼實現exe的執行過程引數的輸入

對於生成的exe進行互動式的引數輸入和輸出,若是通過雙擊exe檔案,在執行過程中再通過鍵盤進行引數的輸入的話,一來可能犯錯,二來,不方便進行修改。而以本文的形式把待輸入的文字進行整理,以供exe檔案讀取,更加方便。同時通過增加迴圈也方便進行對exe的批量執行。 rem @

linux,scp傳輸檔案用expect工具免密碼輸入shell指令碼

expect是一個自動互動功能的工具。expect是開了一個子程序,通過spawn來執行shell指令碼,監測到指令碼的返回結果,通過expect判斷要進行的互動輸入內容(send)。簡單舉個列子說,

linux使用expect實現自動登入(自動輸入密碼)

小蝙個人比較懶,每次都要登入多臺伺服器上工作,都要檢視note,什麼ip啦,埠啦,使用者名稱啦,密碼啦如果只有一個,那還是挺好記的,但是如果有10個,甚至更多,而且為了安全,每個伺服器的密碼都不一樣,ip和埠也不一樣,這樣就非常痛苦了,顧小蝙利用了一下expect軟體,用指令

expect 指令碼實現非互動式操作

如何用expect自動幫你發郵件(自動互動) [[email protected] ~]# mail -s ddd root vim sss.sh #! /bin/bash expect <<EOF    (開頭) spawn ssh 192.168.

shell指令碼自動輸入密碼

在shell指令碼中需要用root用的來執行指令:sudo 自動輸入密碼echo "password" | sudo -S netstat -tlnp       -S          The -S (stdin) option causes sudo to read t