Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pexpect如何处理权限被拒绝的异常_Python - Fatal编程技术网

Python pexpect如何处理权限被拒绝的异常

Python pexpect如何处理权限被拒绝的异常,python,Python,你能帮我修改一下python脚本吗。下面的脚本正在使用python pexpect模块对目标主机执行scp。如果我得到了权限被拒绝的异常,我想处理一个包含密码列表的本地数组变量,然后继续执行scp local_pass = ["test123","welcome1","Welcome1"] def file_copy(user,host,password,logfile,local_file): print "Connecting to %s as %s" % (host,user)

你能帮我修改一下python脚本吗。下面的脚本正在使用python pexpect模块对目标主机执行scp。如果我得到了权限被拒绝的异常,我想处理一个包含密码列表的本地数组变量,然后继续执行scp

local_pass = ["test123","welcome1","Welcome1"]

def file_copy(user,host,password,logfile,local_file):
    print "Connecting to %s as %s" % (host,user)
    local_file_copy = local_file
    remote_file = os.path.basename(local_file)
    print "Performing scp %s %s@%s:/tmp/%s" % (local_file,user,host,remote_file)
    p=pexpect.spawn("scp %s %s@%s:/tmp/%s" % (local_file,user,host,remote_file))
    p.timeout=10
    i=p.expect([ssh_newkey,'assword:'],p.timeout)
    print "setting log file %s" % (logfile)
    fout=file(logfile,'w')
    p.logfile=fout
    counter=0

    if i == 0:
        print "yes to continue connecting"
        p.sendline("yes");
        i=p.expect([ssh_newkey,'assword:'],p.timeout)

    if i == 1:
            try:
                    print "entering ssh password %s" % (password)
                    output=p.sendline(password)
                    sys.exit(1)
            except:
                    while(counter < 3):
                            print "Permission Denied...\n"
                            #p.expect(['Permission denied, please try again.\r\n'],p.timeout)
                            p.expect(['assword:'],p.timeout)
                            p.sendline("%s" %(local_pass[counter]))
                            print "Attempting to relogin....\n"
                            print "LOCALPASSWORD : --> %s\n" %(local_pass[counter])
                            counter+=1;
                            j=p.expect("]","#","$")
                            if j in range(4):
                                    break;

    print "returning expect handle"
    p.expect(pexpect.EOF)
    print "Script file has been copied to target host"
local_pass=[“test123”、“welcome1”、“welcome1”]
def文件副本(用户、主机、密码、日志文件、本地文件):
打印“作为%s连接到%s%”(主机、用户)
本地\u文件\u副本=本地\u文件
远程\u文件=os.path.basename(本地\u文件)
打印“正在执行scp%s%s@%s:/tmp/%s”%(本地\u文件、用户、主机、远程\u文件)
p=pexpect.spawn(“scp%s%s@%s:/tmp/%s”%(本地\u文件、用户、主机、远程\u文件))
p、 超时=10
i=p.expect([ssh_newkey,'assword:'],p.timeout)
打印“设置日志文件%s%”(日志文件)
fout=file(日志文件,'w')
p、 日志文件=fout
计数器=0
如果i==0:
打印“是以继续连接”
p、 发送线(“是”);
i=p.expect([ssh_newkey,'assword:'],p.timeout)
如果i==1:
尝试:
打印“输入ssh密码%s”%(密码)
输出=p.sendline(密码)
系统出口(1)
除:
而(计数器<3):
打印“权限被拒绝…\n”
#p、 expect(['权限被拒绝,请重试。\r\n'],p.timeout)
p、 expect(['assword:'],p.timeout)
p、 发送行(“%s”%(本地传递[计数器])
打印“正在尝试重新登录…”\n
打印“LOCALPASSWORD:-->%s\n”%(本地密码[计数器])
计数器+=1;
j=p.expect(“]”、“#”、“$”)
如果j在范围(4)内:
打破
打印“返回期望句柄”
p、 expect(peexpect.EOF)
打印“脚本文件已复制到目标主机”

谢谢,

好吧,你的代码看起来很复杂而且不可读。。你为什么要解决已经解决的问题

我建议将该模块与ssh密钥结合使用。这让生活变得轻松:

您的代码将如下所示:

from openssh_wrapper import SSHConnection

def upload(local_file, remote_file):

    conn = SSHConnection('your-server.com', login='username', port=22, identity_file='~/.ssh/id_rsa')

    response = conn.scp(local_file, target='/tmp/', mode='0655', owner='username')
    print response
如果希望每次都键入密码,还可以将ssh密钥保留在该部分。 此代码未经测试,但无论如何都应该可以工作