1. 程式人生 > >linux expect詳解(ssh自動登入)

linux expect詳解(ssh自動登入)

shell指令碼實現ssh自動登入遠端伺服器示例:

複製程式碼
#!/usr/bin/expect
spawn ssh [email protected]
expect "*password:"
send "123\r"
expect "*#"
interact
複製程式碼

Expect是一個用來處理互動的命令。藉助Expect,我們可以將互動過程寫在一個指令碼上,使之自動化完成。形象的說,ssh登入,ftp登入等都符合互動的定義。下文我們首先提出一個問題,然後介紹基礎知四個命令,最後提出解決方法。

問題

如何從機器A上ssh到機器B上,然後執行機器B上的命令?如何使之自動化完成?

四個命令

Expect中最關鍵的四個命令是send,expect,spawn,interact。

send:用於向程序傳送字串
expect:從程序接收字串
spawn:啟動新的程序
interact:允許使用者互動

1. send命令

send命令接收一個字串引數,並將該引數傳送到程序。

expect1.1> send "hello world\n"
hello world

2. expect命令

(1)基礎知識

expect命令和send命令正好相反,expect通常是用來等待一個程序的反饋。expect可以接收一個字串引數,也可以接收正則表示式引數。和上文的send命令結合,現在我們可以看一個最簡單的互動式的例子:

expect "hi\n"
send "hello there!\n"

這兩行程式碼的意思是:從標準輸入中等到hi和換行鍵後,向標準輸出輸出hello there。

tips: $expect_out(buffer)儲存了所有對expect的輸入,<$expect_out(0,string)>儲存了匹配到expect引數的輸入。

比如如下程式:

expect "hi\n"
send "you typed <$expect_out(buffer)>"
send "but I only expected <$expect_out(0,string)>"

當在標準輸入中輸入

test
hi

是,執行結果如下

you typed: test
hi
I only expect: hi

(2)模式-動作

expect最常用的語法是來自tcl語言的模式-動作。這種語法極其靈活,下面我們就各種語法分別說明。

單一分支模式語法:

expect "hi" {send "You said hi"}

匹配到hi後,會輸出"you said hi"

多分支模式語法:

expect "hi" { send "You said hi\n" } \
"hello" { send "Hello yourself\n" } \
"bye" { send "That was unexpected\n" }

匹配到hi,hello,bye任意一個字串時,執行相應的輸出。等同於如下寫法:

expect {
"hi" { send "You said hi\n"}
"hello" { send "Hello yourself\n"}
"bye" { send "That was unexpected\n"}
}

3. spawn命令

上文的所有demo都是和標準輸入輸出進行互動,但是我們跟希望他可以和某一個程序進行互動。spawm命令就是用來啟動新的程序的。spawn後的send和expect命令都是和spawn開啟的程序進行互動的。結合上文的send和expect命令我們可以看一下更復雜的程式段了。

set timeout -1
spawn ftp ftp.test.com      //開啟新的程序,該程序使用者連線遠端ftp伺服器
expect "Name"             //程序返回Name時
send "user\r"        //向程序輸入anonymous\r
expect "Password:"        //程序返回Password:時
send "123456\r"    //向程序輸入[email protected]\r
expect "ftp> "            //程序返回ftp>時
send "binary\r"           //向程序輸入binary\r
expect "ftp> "            //程序返回ftp>時
send "get test.tar.gz\r"  //向程序輸入get test.tar.gz\r

這段程式碼的作用是登入到ftp伺服器ftp ftp.uu.net上,並以二進位制的方式下載伺服器上的檔案test.tar.gz。程式中有詳細的註釋。

4.interact

到現在為止,我們已經可以結合spawn、expect、send自動化的完成很多工了。但是,如何讓人在適當的時候干預這個過程了。比如下載完ftp檔案時,仍然可以停留在ftp命令列狀態,以便手動的執行後續命令。interact可以達到這些目的。下面的demo在自動登入ftp後,允許使用者互動。

spawn ftp ftp.test.com
expect "Name"
send "user\r"
expect "Password:"
send "123456\r"
interact

解決方法

上文中提到:

如何從機器A上ssh到機器B上,然後執行機器B上的命令?如何使之自動化完成?

下面一段指令碼實現了從機器A登入到機器B,然後執行機器B上的pwd命令,並停留在B機器上,等待使用者互動。具體含義請參考上文。

#!/home/tools/bin/64/expect -f
 set timeout -1  
 spawn ssh $BUser@$BHost
 expect  "*password:" { send "$password\r" }
 expect  "$*" { send "pwd\r" }
 interact

相關推薦

linux expect(ssh自動登入)

shell指令碼實現ssh自動登入遠端伺服器示例: #!/usr/bin/expect spawn ssh [email protected] expect "*password:" send "123\r" expect "*#" interact Expect是一個用來處理互動的命

電腦(Linux/Windows)使用SSH遠端登入安卓(Android)手機實現無線傳輸和管理檔案(圖文

電腦(Linux/Windows系統)使用SSH遠端登入安卓(Android)手機實現無線傳輸和管理檔案(圖文詳解) 溫馨提示 本文只針對安卓(Android)手機!iPhone或者WP的手機使用者,請不要浪費時間在本文。 前言 在將And

使用密匙讓putty(或ssh)自動登入Linux遇到幾個問題的解決方法

      在用SSH通過金鑰登入Linux時,遇到 server responded"No further authentication methods available" no more authentication methods a

linux ftp 命令自動上傳指令碼實現

1. ftp自動登入批量下載檔案。 #####從ftp伺服器上的/home/data 到 本地的/home/databackup#### #!/bin/bash ftp -n<<! open 192.168.1.171 user guest 123456 binary cd /hom

linux下實現ssh自動登入遠端伺服器

前言:開發工作中,由於有時需要通過ssh登入遠端伺服器上去,每次都要輸入密碼,密碼很難記,感覺很麻煩,於是上網搜了通過 ssh自動登入遠端伺服器上去,從而免去了每次都要輸入密碼的困擾。 系統說明:本地機器:Redhat遠端機器:Redhat 步驟: A.本地機器需要做的修

ssh自動登入的shell,用expect

ssh連線遠端伺服器,涉及到輸入密碼過程,因此就需要互動,要用到expect. 1.MAC機器上安裝expect,是用homebrew安裝。           brew  install  expect 2.明確expect命令的路徑      which expect  

linux iscsi 配置過程--包括自動掛載檔案系統

1  指定連線iSCSI的前兆網口IP, 與IP-SAN的埠同一網段,例如192.168.70.201,確保能夠ping通。 2  安裝iscsi-initiator ,一般linux作業系統自帶。 3  修改配置檔案 /etc/iscsi/iscsid.conf    node.startup=auto

linux入門1-ssh安裝配置及虛擬機基本使用

沒有 http ctr ble 輸入密碼 入門 p s start onf ssh配置 1,打開"終端窗口",輸入 "sudo apt-get update" --> 回車 --> "輸入當前登錄用戶的管理員密碼

Linux特性

linux特性詳解 history 命令替換 命令別名 文件名統配 bash及其特性:shell: 外殼GUI:Gnome, KDE, XfceCLI: sh, csh, ksh, bash, tcsh, zsh Linux允許同一個用戶登錄多次root, student程序:進程 進程:

Linux LVM及創建

lvm 1. LVM基本創建及管理 2. LVM快照 3. LVM與RAID的結合使用:基於RAID的LVMLVM創建: 描述: LVM是邏輯盤卷管理(LogicalVolumeManager)的簡稱,它是Linux環境下對磁盤分區進行管理的一種機制,LVM是建立在硬盤和分區之上的一個邏輯層,來提高磁盤分

linux rsyslog

syslog priority facility rsyslog 概念和特性歷史日誌、歷史事件:時間、事件本身、日誌級別(根據時間的關鍵性程度)系統日誌服務:syslog有兩個進程syslogd(system負責用戶進程)、 klogd(kernel負責內核進程)centos7:rsyslog

Linux 命令(十)Shell腳本的數組

cti err art case lin start shell pre round 1、數組定義 [[email protected] ~]# a=(1 2 3 4 5 6 7 8) [[email protected]-IDC ~]# echo $

(轉)Linux命令-file

版本信息 ref 獲取文件 linux命令 過程 嘗試 file img 文件類型 Linux命令詳解-file 原文:https://www.cnblogs.com/Dodge/p/4278306.html file命令用來識別文件類型,也可用來辨別一些文件的編碼格

MyBatis之Mapper XML 文件(五)-自動映射查詢結果

java mybatis 正如你在前面一節看到的,在簡單的場景下,MyBatis可以替你自動映射查詢結果。 如果遇到復雜的場景,你需要構建一個result map。 但是在本節你將看到,你也可以混合使用這兩種策略。 讓我們到深一點的層面上看看自動映射是怎樣工作的。 當自動映射查詢結果時,MyBatis

linux目錄

style 啟動過程 usr 位置 cpu信息 pos 過程 scripts strong 網卡的配置文件目錄 /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0

java類型轉換自動轉換和強制轉換)

代碼 oid 高精 log 相加 println 類型轉換詳解 範圍 void 自動轉換 class Hello { public static void main(String[] args) { //自動轉換 int a = 5; byte b = 6

Docker 基礎技術之 Linux namespace

基本 mar $$ 裏的 sta 進程資源 進程間通信 開始 消息隊列 Docker 是“新瓶裝舊酒”的產物,依賴於 Linux 內核技術 chroot 、namespace 和 cgroup。本篇先來看 namespace 技術。 Docker 和虛擬機技術一樣,從操作系

linux管道

linux原文鏈接:http://blog.csdn.net/qq_38646470/article/details/79564392 #符號表示| 和管道特別形象。#作用:    管道是Linux中很重要的一種通信方式,是把一個程序的輸出直接連接到另一個程序的輸入

Linux命令(部分昨今兩天)

Linux命令詳解基本命令1.Linux的基本原則:1、由目的單一的小程序組成;組合小程序完成復雜任務;2、一切皆文件;3、盡量避免捕獲用戶接口;(盡量不和用戶進行交互,就是一個程序一但開始運行,就不需要用戶進行任何操作,如ls命令,ifconfig命令)4、配置文件保存為純文本格式;2.命令形式命令格式:命

Linux命令

Linux命令詳解路徑:絕對路徑:凡是以“/”開頭的輸入路徑的方式都是絕對路徑相對路徑:凡是以“.”或者“..”開頭的都是相對路徑查看服務器基本信息:cat /proc/cpuinfo 查看cpu信息cat /proc/meminfo 查看內存信息free 查看內存使用情況uptime 監控CPU情況unam