Python通过不同路径进行SSH迭代

2024-06-06 00:33:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个JSON对象,看起来像这样:

{UID_1:{
    jumpboxes:[jump_ip1, jump_ip2,...],
    hosts: [host_ip1, host_ip2,...],
    ...},
UID_2:{...

对跳转盒的身份验证是通过kerberos(无密码)进行的,对主机的身份验证是通过密码进行的,并且主机仅通过跳转主机可见。我不知道从IP列表中哪些可以工作,哪些被卡住,或者没有响应等等,所以我需要找到第一条路径来打开SSH会话。你知道吗

我所能做的就是在ssh连接到跳转主机时检查退出代码,如下所示:

jumpip = ''
for i in json[uid][jumpboxes]:
    if os.system('ssh {}@{}'.format(username,i))>0:
        continue
    else:
        jumpip = i
        break

这给了我第一个正常工作的jumpbox ip,没有任何问题,但是有一个密码来建立与第二个主机的ssh连接并不是那么容易检查的退出代码。你知道吗

有多种方法可以打开隧道-或者操作系统()并将sshpass与会话代理一起使用(类似于: if os.system('sshpass -p {} ssh -o ProxyCommand="ssh {}@{} nc {} 22" {}@{} -t {}'.format(password, user, jumpip, hosts[j], user, hosts[j], remote_cmd))>0:....(对于上下文,我们假设sshpass命令看起来像这样:sshpass -p Password123! -o ProxyCommand="ssh user@jumpbox nc hostip 22" user@hostip -t ll或者在子shell中使用类似于os.system('ssh user@jumpbox -t ping {} -c 5'.format(hosts[j]))的东西进行pint,尽管ping将返回退出代码,但ICMP echo回复并不意味着我能够打开隧道(例如守护进程可能被卡住或崩溃,等等),或者我可以做一个try except else块,它尝试通过带有pexpect或带有的jumpbox打开到远程主机的ssh会话子进程.popen通过管道传输stdio,我可以推送密码,如果无法引发自定义异常,但我不知道如何从ssh客户端获取exitcode,所以我可以查一下。。。你知道吗

这两种方法对我来说都不够健壮,所以我宁愿正确地遍历IPs,我愿意为此提供建议。你知道吗

一点背景-隧道将用于启动nohup ed命令,然后将被关闭。该脚本使用多处理和池来处理一大堆这些问题,因此我将启动它们,然后有一个循环来检查它们的状态并检索在主机上执行的远程脚本的结果。我知道操作系统不推荐使用,我应该使用subprocess,但是对于用例来说这不是必需的,所以我并不真正关心这个。我正在寻找一种聪明的方法来迭代可能的路径,这将需要给定一个具有长度为n的jumpbox的列表和一个具有长度为m和超时时间为x秒(最大值为n*m*x秒)的主机的列表来找出并缩短该时间。你知道吗

我还使用pexpect(它使用paramiko本身)与远程主机进行交互,一旦我找到了打开隧道所需的正确ip。你知道吗

提前谢谢!你知道吗


Tags: 方法代码format密码列表远程ossystem
2条回答

我想出来了-如果有提示,pexpect会提供一个退出代码,也就是说,我按照

host = ''
for i in hosts:
    cmd = 'ssh {}@{} -t ssh {}'.format(user,jumpbox, i)
    try:
        p = pexpect.spawn(cmd)
        if p.expect('.*') == 0:
            host = i
            break
    except:
        someException()
if host != '':
    ...

谢谢大家的意见。你知道吗

Paramiko的exit_status_ready函数将告诉您退出状态。你知道吗

Return true if the remote process has exited and returned an exit status. You may use this to poll the process status if you don’t want to block in recv_exit_status. Note that the server may not return an exit status in some cases (like bad servers).

查看pexpect的源代码,我不知道它在哪里使用Paramiko,因此您可能需要用Paramiko代码替换所有pexpect代码。Paramiko为您提供了对建立SSH连接的所有低级别方面的大量控制,因此这可能有点难以理解,但它确实为您提供了对整个过程的大量控制。你知道吗

相关问题 更多 >