高效登錄遠(yuǎn)端機(jī)器

背景

工作中經(jīng)常需要ssh到服務(wù)器上去操作彻秆,并且有些時候可能還會需要如下的情況:

  1. 通過跳板機(jī)登錄到具體的應(yīng)用服務(wù)器
  2. 用普通賬號登錄后再切換到admin用戶操作

困惑

  1. 登錄服務(wù)器需要記住一堆的服務(wù)器ip讨韭,目前這個已經(jīng)有很多的解決方案了
  2. 如果在ssh連接建立之后進(jìn)行更復(fù)雜的交互邏輯块茁,這個一直是個困惑。

解決問題

expect

expect使用比較廣泛辫狼,網(wǎng)上的教程也很多初斑,做一些簡單的當(dāng)前用戶操作完全沒有問題

#!/usr/bin/expect


# 參數(shù)1:遠(yuǎn)程host;參數(shù)2:遠(yuǎn)程password
if { $argc != 1   } {
    send_user "Usage: host\n"
    exit
}

set host [lindex $argv 0]
set USER xxx
set PASSWORD xxx

# Start the session
catch {spawn ssh -l $USER $host}

expect {
    "*assword*"
        {send "$PASSWORD\n"}

}
expect "Last*" { interact   }

但是有個致命的問題膨处,不能解決上述我說的第二點(diǎn)問題见秤,不能有ssh嵌套或者切換用戶。

pexpect

后來很有幸發(fā)現(xiàn)了python的工具包:https://github.com/pexpect/pexpect 真椿; 發(fā)現(xiàn)可以擴(kuò)展的空間非常大

#!/usr/bin/env python3

import pexpect
import sys

# print(sys.argv[1])
host = sys.argv[1]
user = sys.argv[2]
password = sys.argv[3]

child = pexpect.spawn('ssh %s@%s' % (user, host))
# 設(shè)置字符窗口大小鹃答,非常重要,不然會有換行和覆蓋問題
child.setwinsize(400,400)

index = child.expect(['password', user, pexpect.EOF, pexpect.TIMEOUT])
# print("index %d" % (index) )
if index == 0:
    child.sendline(password)
elif index == 1:
    child.sendline(password)
elif index == 2:
        print("EOF")
    # child.sendline("\n")
elif index == 3:
        print("timeout")
    # child.sendline("\n")

 # Send the characters pass123 and "enter"
child.expect(user, timeout=120)

child.sendline('cd /home/admin')

child.sendline('sudo su admin')

# child.expect('[sudo]')

child.sendline(password)

child.interact()

完全根據(jù)輸入突硝,輸出的字符來匹配测摔,調(diào)試起來非常方便基公。

workflow

由于平時workflow用的比較多障癌,所以順便把整個流程在alfred里玩下:

服務(wù)器ip列表查詢功能

#!/usr/bin/python
# encoding: utf-8

import sys

from workflow import Workflow

def main(wf):
    # The Workflow instance will be passed to the function
    # you call from `Workflow.run`. Not so useful, as
    # the `wf` object created in `if __name__ ...` below is global.
    #
    # Your imports go here if you want to catch import errors (not a bad idea)
    # or if the modules/packages are in a directory added via `Workflow(libraries=...)`
    # import somemodule
    # import anothermodule
    # Get args from Workflow, already in normalized Unicode
    # args = wf.args
    # print args

    query = None  # Ensure `query` is initialised
    if len(wf.args):
        query = wf.args[0]

    ipList = []
    with open('iplist.txt') as fileObj:
        for line in fileObj:
            ipList.append(line.strip())


    if query :
        ipList = wf.filter(query,ipList, match_on=32)

    if len(ipList) == 0 :
        ipList.append(query)


    for ip in ipList:
        wf.add_item(title=ip, arg=ip, autocomplete=ip, valid=True)
    # Send output to Alfred. You can only call this once.
    # Well, you *can* call it multiple times, but Alfred won't be listening
    # any more...
    wf.send_feedback()


if __name__ == '__main__':
    # Create a global `Workflow` object
    wf = Workflow()
    # Call your entry function via `Workflow.run()` to enable its helper
    # functions, like exception catching, ARGV normalization, magic
    # arguments etc.
    # wf.run(main)
    sys.exit(wf.run(main))

調(diào)用iterm2 啟動 pexpect

on alfred_script(q)

tell application "iTerm"
  try
    tell current window
      create tab with default profile
    end tell
  on error msg
    display dialog msg
    create window with default profile
    tell current window
      create tab with default profile
    end tell
  end try
  tell current tab of current window
    select
    tell the current session
      write text "sussh " & q
    end tell
  end tell
end tell
end alfred_script
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洞翩,一起剝皮案震驚了整個濱河市衰琐,隨后出現(xiàn)的幾起案子锰镀,更是在濱河造成了極大的恐慌牵素,老刑警劉巖鼎姊,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件周瞎,死亡現(xiàn)場離奇詭異黄琼,居然都是意外死亡樊销,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門脏款,熙熙樓的掌柜王于貴愁眉苦臉地迎上來围苫,“玉大人,你說我怎么就攤上這事撤师〖粮” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵剃盾,是天一觀的道長腺占。 經(jīng)常有香客問我,道長痒谴,這世上最難降的妖魔是什么衰伯? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮积蔚,結(jié)果婚禮上意鲸,老公的妹妹穿的比我還像新娘。我一直安慰自己尽爆,他們只是感情好怎顾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漱贱,像睡著了一般杆勇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饱亿,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天蚜退,我揣著相機(jī)與錄音,去河邊找鬼彪笼。 笑死钻注,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的配猫。 我是一名探鬼主播幅恋,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泵肄!你這毒婦竟也來了捆交?” 一聲冷哼從身側(cè)響起淑翼,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎品追,沒想到半個月后玄括,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肉瓦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年遭京,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泞莉。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡哪雕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鲫趁,到底是詐尸還是另有隱情斯嚎,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布挨厚,位于F島的核電站堡僻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏幽崩。R本人自食惡果不足惜苦始,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望慌申。 院中可真熱鬧陌选,春花似錦、人聲如沸蹄溉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柒爵。三九已至役电,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棉胀,已是汗流浹背法瑟。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唁奢,地道東北人霎挟。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像麻掸,于是被迫代替她去往敵國和親酥夭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容