linux/unix/mac 下通過expect/tcl 指令碼透過跳板機一鍵登入目標機器
公司登入日誌伺服器要求先登上一個中間伺服器(即常說的跳板機), 再通過中間伺服器登入到目標伺服器。
這個過程操作麻煩, 主要有如下問題:
- 登入中間伺服器需要賬號和密碼
- 登入到中間伺服器之後, 需要通過ssh方式登入目標伺服器。
- 登入目標伺服器之後需要cd到相應的日誌目錄下
整體思路是:
- 將目標伺服器的樹狀結構寫到配置檔案中去
- 將中間伺服器以及目標伺服器的賬號密碼也寫到配置檔案中
- 登入伺服器時輸入相應的引數, 如專案名稱, 模組名稱, 機器序號等
首先分享一個使用expect/tcl讀取ini配置檔案的wiki: 點選開啟連結
接下來expect指令碼程式碼
proc cfg相關的函式都是從tcl指令碼語言官方的config wiki上拷貝下來的, 具體使用詳見上面的連結#!/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
需要說明的是, 如果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
Linux和Mac下的微信電腦版electronic-wechat 非官方
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
MAC下使用expect先登入跳板機再登入遠端伺服器
mac使用ssh遠端連線伺服器沒有儲存密碼的功能,後來使用指令碼寫了一個讀取密碼然後自動登入的功能,用著挺好。但是最近公司為了安全起見,不再讓直接連線測試伺服器,必須先登入跳板機,再通過跳板機登入測試伺服器.....每次要輸兩次密碼,好麻煩的說。 為了不這麼麻煩,在網上搜了一下如何使用指令碼直接登入,結
windows下通過批處理指令碼啟動redis
windows下redis啟動,需要進入redis安裝目錄,然後shift+右鍵,選擇“在此處開啟命令視窗”,然後輸入redis-server.exe redis.conf,就可以啟動redis了。如下所示: 這種情況有一個問題,就是每次需要進
mac下crontab執行定時指令碼
在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
在 linux、mac 下快速簡單的安裝 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 等成