1. 程式人生 > >linux/unix/mac 下通過expect/tcl 指令碼透過跳板機一鍵登入目標機器

linux/unix/mac 下通過expect/tcl 指令碼透過跳板機一鍵登入目標機器

公司登入日誌伺服器要求先登上一個中間伺服器(即常說的跳板機), 再通過中間伺服器登入到目標伺服器。 

這個過程操作麻煩, 主要有如下問題:

  1.  登入中間伺服器需要賬號和密碼
  2. 登入到中間伺服器之後, 需要通過ssh方式登入目標伺服器。
  3. 登入目標伺服器之後需要cd到相應的日誌目錄下
整個過程比較複雜, 雖然中間伺服器是確定的, 但是線上伺服器往往有很多, 每次都自己去查詢相應的伺服器, 然後透過中間伺服器登入也是很麻煩的, 所以, 通過使用expect/tcl的方式, 整體出自動登入到目標伺服器的方式

整體思路是:

  1. 將目標伺服器的樹狀結構寫到配置檔案中去
  2. 將中間伺服器以及目標伺服器的賬號密碼也寫到配置檔案中
  3. 登入伺服器時輸入相應的引數, 如專案名稱, 模組名稱, 機器序號等
首先需要解決的就是讀取配置檔案的問題, 由於bash下有很方便的awk和sed等命令, 在開始考慮過通過bash巢狀expect方式, 實際操作時, 發現登入到目標伺服器之後無法停留, 自動退出, 退出等待時間或長或短。因此最終考慮全部使用expect/tcl實現

首先分享一個使用expect/tcl讀取ini配置檔案的wiki:  點選開啟連結

接下來expect指令碼程式碼

#!/usr/bin/expect
 namespace eval cfg {
    variable version 1.0

    variable sections [list DEFAULT]

    variable cursection DEFAULT
    variable DEFAULT;   # DEFAULT section
 }

 proc cfg::sections {} {
    return $cfg::sections
 }
 

 proc cfg::variables {{section DEFAULT}} {
    return [array names ::cfg::$section]
 }

 proc cfg::add_section {str} {
    variable sections
    variable cursection

    set cursection [string trim $str \[\]]
    if {[lsearch -exact $sections $cursection] == -1} {
      lappend sections $cursection
      variable ::cfg::${cursection}
    }
 }

 proc cfg::setvar {varname value {section DEFAULT}} {
    variable sections
    if {[lsearch -exact $sections $section] == -1} {
      cfg::add_section $section
    }
    set ::cfg::${section}($varname) $value
 }

 proc cfg::getvar {varname {section DEFAULT}} {
    variable sections
    if {[lsearch -exact $sections $section] == -1} {
      error "No such section: $section"
    }
   return [set ::cfg::${section}($varname)]
 }


 proc cfg::parse_file {filename} {
    variable sections
    variable cursection
    set line_no 1
    set fd [open $filename r]
    while {![eof $fd]} {
        set line [string trim [gets $fd] " "]
        if {$line == ""} continue
        switch -regexp -- $line {
           ^#.* { }
           ^\\[.*\\]$ {
               cfg::add_section $line
           }
           .*=.* {
               set pair [split $line =]
               set name [string trim [lindex $pair 0] " "]
               set value [string trim [lindex $pair 1] " "]
               cfg::setvar $name $value $cursection
           } 
           default {
               error "Error parsing $filename (line: $line_no): $line"
           }
        }
        incr line_no
     }
     close $fd
 }


 set projectType [lindex $argv 0]
 set moduleType  [lindex $argv 1]
 set hostIndex   [lindex $argv 2]

 set configPath  config/config.ini
 cfg::parse_file $configPath
 set jump_host   $cfg::jump_server(host)
 set jump_port   $cfg::jump_server(port)
 set jump_user   $cfg::jump_server(username)
 set jump_pwd    $cfg::jump_server(password)
 set log_user    $cfg::log_server(username)
 set log_pwd     $cfg::log_server(password)
 set log_port    $cfg::log_server(port)

 set configPath  config/$projectType.ini
 cfg::parse_file $configPath
 set projectName $cfg::main(project_name)
 set moduleName [cfg::getvar module_name $moduleType]
 set host       [cfg::getvar host_$hostIndex $moduleType]

 set time -1
 spawn ssh -p $jump_port 
[email protected]
$jump_host expect "[email protected]$jump_host's password:" { send "$jump_pwd\r" } expect "$jump_user:~\\\$" { send "ssh -p $log_port [email protected]$host\r" } expect "[email protected]$host's password:" { send "$log_pwd\r" } expect "$log_user:~\\\$" { send "cd /var/log/$projectName/$moduleName/logs\r" } interact
proc cfg相關的函式都是從tcl指令碼語言官方的config wiki上拷貝下來的, 具體使用詳見上面的連結

需要說明的是, 如果section是固定的,可以使用$cfg::SECTIONNAME(KEYNAME)的方式

如果section是變數, 則需要使用 [cfg::getvar key section]方式呼叫,

另外, expect的具體使用方式網上可以搜到很多, 這裡就不多說了

另外, 配個我這邊的配置檔案結構




第一張圖是通用配置, 第二張圖片是每個專案的配置, 一般可以考慮一個專案一個配置檔案, 根據專案簡稱找到專案的配置檔案, 讀取相應的模組配置即可

相關推薦

linux/unix/mac 通過expect/tcl 指令碼透過跳板登入目標機器

公司登入日誌伺服器要求先登上一個中間伺服器(即常說的跳板機), 再通過中間伺服器登入到目標伺服器。  這個過程操作麻煩, 主要有如下問題:  登入中間伺服器需要賬號和密碼登入到中間伺服器之後, 需要通過ssh方式登入目標伺服器。登入目標伺服器之後需要cd到相應的日誌目錄下

Linux通過EXPECT指令碼自動執行ssh遠端連線

       由於經常需要從家裡連到實驗室的機器,但是中間需要一箇中轉,於是就需要連續兩次進行ssh操作以及輸入密碼。加上家裡網路不穩,經常會斷,就又得重新登入。輸入那麼一長串的東西特別麻煩。於是覺得應該寫一個指令碼來自動登入,這樣就可以帶來極大的方便。 1 expec

Linux通過crontab排程指令碼指令碼所使用的環境變數問題

通過crontab排程指令碼時指令碼使用的環境變數與直接在shell中執行指令碼時使用的環境變數不同(因為crontab並不知道你所使用的shell,只是簡單的設定了HOME、LOGNAME、SHELL和有限的PATH等環境變數),因而可能導致“XXX command no

LinuxMac的微信電腦版electronic-wechat 非官方

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MAC使用expect登入跳板登入遠端伺服器

mac使用ssh遠端連線伺服器沒有儲存密碼的功能,後來使用指令碼寫了一個讀取密碼然後自動登入的功能,用著挺好。但是最近公司為了安全起見,不再讓直接連線測試伺服器,必須先登入跳板機,再通過跳板機登入測試伺服器.....每次要輸兩次密碼,好麻煩的說。 為了不這麼麻煩,在網上搜了一下如何使用指令碼直接登入,結

windows通過批處理指令碼啟動redis

     windows下redis啟動,需要進入redis安裝目錄,然後shift+右鍵,選擇“在此處開啟命令視窗”,然後輸入redis-server.exe redis.conf,就可以啟動redis了。如下所示:         這種情況有一個問題,就是每次需要進

maccrontab執行定時指令碼

在linux下 以root使用者許可權執行定時計劃,完成特定功能。 那麼,在本地呢,是否可以? 答案是當然的。 Linux是Unix的開源實現。 BSD被認為是Unix精神的繼承者(BSD同樣也是

Mac 通過dmg包安裝mysql

一、下載mysql 官網下載地址:http://dev.mysql.com/downloads/mysql/ 我的os版本10.8.2,下載的mysql版本是mysql-5.5.29-osx10.6-x86_64.dmg 二、安裝,安裝過程很簡單。 雙擊下載後的安裝包。

Mac定時執行python指令碼&sh指令碼

步驟: 1.crontab -e進入當前使用者的定時任務編輯模式: 分 時 日 月 周 直譯器絕對路徑 指令碼絕對路徑 2.儲存,退出,指令碼即可按照指定的時間去執行指令碼 注意: (1)時間的格式 *  *  *  *  *  command

Mac通過virtualbox安裝windows系統

一、虛擬機器virtualbox安裝windows7 一、安裝準備 二、虛擬機器VirtualBox安裝win7全過程 1、開啟VirtualBox虛擬機器,點選左上角的“新建”,型別選擇MicrosoftWindows,版本選擇Windows 7(64-bit),輸入

mac通過vlc實現rtsp伺服器轉碼

想在自己的mac上搭建一個RTSP流媒體伺服器,找來找去,還是覺得VLC最簡單實用。 官網下載安裝vlc,安裝後路徑為:/Applications/VLC.app實用命令啟動伺服器,命令如下 /Applications/VLC.app/Contents/MacOS/VLC --ttl 12 -vvv --

mac通過終端安裝python3問題記錄及解決

        安裝python時,首先想到的是升級電腦裡的python版本,可是上網搜尋後發現升級可能會使用一些基於python的應用執行有問題,所以就嘗試安裝兩個版本一、檢視當前的python版本開啟終端,輸入命令python -V二、安裝Xcode1 App Store

linuxmac 快速簡單的安裝 docker

安裝 docker 的方式其實五花八門,不同的系統也分別對應不同的方式,這裡僅僅只介紹常用的系統的最最簡單傻瓜式的方法。 osx Homebrew 的 cask 支援了 docker,可以直接進行安

shell 指令碼學習之 在mac怎麼執行shell指令碼

mac終端下執行shell指令碼 1、寫好自己的 指令碼,比如aa.sh  2、開啟終端 執行,方法一: 輸入命令    ./aa.sh     , 方法二:直接把 aa.sh 拖入到終端裡面。 注意事項: 如果 沒有成功報出問題::  Permission denied。就是沒有許可權。 解

Mac通過Homebrew安裝配置MySQL

最近重灌了mac系統,所有常用的軟體都需要重新安裝一遍,無疑安裝一個brew是個很好的選擇,關於brew是什麼,怎麼安裝建議去brew官網檢視,附上地址:brew官網 安裝完成之後,安裝其他的軟體就特別方便了。 執行: brew install mysql 等成功

mac通過 homestead 搭建laravel環境 到執行專案

homestead安裝過程記錄: 公司的技術棧是laravel+homestead+element ui+vue.js 工欲善其事必先利其器。現在記錄我花了2天時間:重灌macos high sierra系統後開始安裝的過程: 1⃣️:下載virtualbox(使用最新

Mac通過 brew 安裝不同版本的php

正 文:     MAC OS X 10.9.5系統裡已經自帶了 apache  和 php ,只是預設沒有啟用,我們將他們啟用即可。     APACHE的預設版本是 Apache/2.2.26 (Unix),php版本是PHP 5.4.30。    由於除錯程式需要,我

Linux/Unix shell 引數傳遞到SQL指令碼

在資料庫運維的過程中,Shell 指令碼在很大程度上為運維提供了極大的便利性。而shell 指令碼引數作為變數傳遞給SQL以及SQL指令碼也是DBA經常碰到的情形之一。本文主要討論瞭如何將shell指令碼的引數傳遞到SQL指令碼之中並執行SQL查詢。   有關shell與

Linux/Unix環境的make命令詳解

無論是在Linux還是在Unix環境中,make都是一個非常重要的編譯命令。  Makefile檔案   Make工具最主要也是最基本的功能就是通過makefile檔案來描述源程式之間的相互關係並自動維護編譯工作。而makefile 檔案需要按照某種語法進行編寫,檔案中需要說

Mac通過Homebrew安裝MySQL

最近重灌了mac系統,所有常用的軟體都需要重新安裝一遍,無疑安裝一個brew是個很好的選擇,關於brew是什麼,怎麼安裝建議去brew官網檢視,附上地址:brew官網 安裝完成之後,安裝其他的軟體就特別方便了。 執行: brew install mysql 等成