我正在编写一个脚本,该脚本必须在不同域中的一堆远程私有主机上运行远程脚本。
每个主机都与其余基础结构隔离。它们运行在专用网段中,该网段仅通过我需要通过ssh通过的代理跳转主机公开。对Jumpbox的身份验证是无密码的,因此这没有问题,但是我在子外壳中执行我需要在其上执行脚本的实际主机的第二跳实际上并没有接受密码。我怀疑这与我处理我的pexpect隧道的方式或者我如何转义密码(包含各种特殊字符并动态生成)有关。
cmd = 'ssh -o ProxyCommand="ssh -o StrictHostKeyChecking=no {}@a{}@{} nc {}} 22" -o StrictHostKeyChecking=no {}@a{}@{} -t sudo su'.format(username, domain, jumphost, remotehost, username, domain, remotehost)
child = pexpect.spawn(cmd)
child.expect('.*')
child.sendline('yes')
child.expect('.*')
child.sendline('yes')
child.expect('assword:')
child.sendline(password)
child.expect('assword')
child.sendline(password)
child.expect('root@.*# ')
child.sendline('<execute remote code here>')
每当我从控制台进行测试并且在任何给定的点进行child.interact()
时,我总是会收到密码提示,但是Expect语句始终返回0(所提供列表中期望表达式的索引),并且取回我正在写的字节数,但是在interact()上,我总是得到一个密码提示。我在这里想念什么?
答案 0 :(得分:0)
我知道了-sendline()传递传递给它的任何参数和换行符char,但也不发送返回回车符。我所要做的就是sendline(password +'\ r')或send(password +'\ r \ n')。
我以为(显然是错误的)sendline将\ r AND \ n附加到该行,而不仅仅是\ n。让这作为对同样愚蠢的人的教训。