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'))