expect ssh自動登錄(expect script 和 python版本)

wiki:https://en.wikipedia.org/wiki/Expect

expect script版本

假設場景:

$ssh username@ip
>please input password
$password
>please select group
$group
>please select page
$page
>select server
$server
>Input account
$account
>input Password
>$password

對應腳本:

#!/usr/bin/expect -f

set ip "{ip}"
set password "{password}"
set pass "{pass}"
set user "{user}"
set timeout 2
spawn ssh {username}@$ip
expect {
    "Input account:" { send "$user\r"; exp_continue }
    "*Password:" { send "$password\r"; exp_continue }
    "*password:" { send "$pass\r"; exp_continue }
    "*Select server:" { send "26\r"; exp_continue }
     "*Select group:" { send "1\r"; exp_continue }
     "*Select page:" { send "0\r"; exp_continue }
}

interact

python 版本

import sys
import pexpect
import termios, struct, fcntl


servers = {
        #跳板機
        'jump': ('jump_server -p 2222', 'user', 'password'),
        #給自己的機器起別名登錄
        'test_server1': ('ip1'),
        'test_server2': ('ip2')
    }

def getwinsize():
    """This returns the window size of the child tty.
    The return value is a tuple of (rows, cols).
    """
    if 'TIOCGWINSZ' in dir(termios):
        TIOCGWINSZ = termios.TIOCGWINSZ
    else:
        TIOCGWINSZ = 1074295912
    s = struct.pack('HHHH', 0, 0, 0, 0)
    x = fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ, s)
    return struct.unpack('HHHH', x)[0:2]

def login(ip, account=None, password=None):
    cmd = 'ssh %s@%s' % (servers['jump'][1], servers['jump'][0])
    p = pexpect.spawn(cmd)
    #password
    p.expect('(?i)ssword')

    winsize = getwinsize()
    p.setwinsize(winsize[0], winsize[1])

    p.sendline(servers['jump'][2])
    
    #期望與輸入
    p.expect('{expect string}')
    p.sendline('{what you send}')
    return p.interact()


env = sys.argv[1]
login(servers.get(env, 'dev'))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章