pexpect连接了ssh后,怎样在另一个机器上执行交互式的命令?

23 views
Skip to first unread message

Wizard

unread,
Jul 6, 2012, 9:45:39 PM7/6/12
to shlug
我本来是想用pexpect继续做这个的,但是没有成功。
我记得ftp是可以登录后 继续做些事情的。
不知道哪里有问题,还请大家看一眼。

def ssh_login(host, passwd):
ssh_newkey = 'Are you sure you want to continue connecting'
conditions = ['Connection timed out', 'No route to host', ssh_newkey,
'password:', pexpect.EOF]
cmd = 'ssh -o ConnectTimeout=100 root@%s ' %(host)
print cmd

# connecting
child = pexpect.spawn(cmd)
ret = child.expect(conditions)
if debug:
child.logfile = sys.stdout
if ret == 0:
# ssh server down?
return -1
if ret == 1:
# no network connection
return -2
if ret == 2:
child.sendline('yes')
ret = child.expect(conditions)
if ret == 3:
child.sendline(passwd)
ret = child.expect(['Permission denied', pexpect.TIMEOUT,
pexpect.EOF], timeout = 30)
if ret == 0:
# wrong password
child.kill(signal.SIGINT)
return -3

child.sendline('ls') <--- 比如在这里继续执行一些命令。
return 0

我这么做了之后,ls并没有在远端执行。
我换成touch file也试过,然后登录上去看,文件并没有生成。
当然我确认我成功连接了远端的机器,因为在logfile=sys.stdout后,我能看到远端shell的提示符。

--
Wizard

Wizard

unread,
Jul 7, 2012, 1:03:35 AM7/7/12
to shlug
写了个脚本,但是有点问题,有兴趣的同学可以帮我测测看。

功能:给定机器的列表,让这些机器之间不需要输入password来ssh登录。
平时有时候会想要做不输入密码的ssh,就是生成公钥,然后拷贝到目的的机器上。
之前都是手动做的,今天写了这个脚本来自动做这个事情。

有如下的限制
1。只支持root用户的,别的用户还不支持。
2。列表中的机器将会互相都可以访问,而不是单向的。

我遇到的问题是:
用虚拟机测试,自己的物理机,加两台虚拟机(运行在这台物理机上)。
测试过程中,大概有一半的概率, scp pub key的时候会出问题。
就是scp的时候,看log感觉是没有进行拷贝。
而且很巧,一直都是这一台虚拟机出现问题。

有兴趣的同学可以运行看看,不知道是不是环境问题。
就算是环境问题,代码中也应该捕捉到这个异常。
但是我的代码,貌似没有对这个做处理。
如果谁有经验的,请指出代码中的不足。

附件是python的脚本,和一个机器列表的文件。
python 运行方式可以用 -h来看。
列表文件的格式 是 每行代表一个机器。
每行由 host ip 和 root password 组成,中间用空格分开。

2012/7/7 Wizard <wizard...@gmail.com>:

--
Wizard

passwordless_ssh.py
machine_list
Reply all
Reply to author
Forward
0 new messages