gpt4 book ai didi

通过不同路径的Python SSH迭代

转载 作者:太空宇宙 更新时间:2023-11-03 21:21:43 25 4
gpt4 key购买 nike

我有一个如下所示的 JSON 对象:

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

跳转盒的身份验证是通过 kerberos(无密码)进行的,主机的身份验证是使用密码进行的,并且主机仅通过跳转主机可见。我不知道 IP 列表中哪些可用、哪些被卡住或无响应等。因此我需要找到第一个允许我打开 SSH session 的路径。

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

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

这为我提供了第一个工作的 Jumpbox IP,没有任何问题,但是使用密码来与第二个主机建立 ssh 连接并不容易检查退出代码。

有多种方法可以打开隧道 - 使用 os.system() 或使用带有 session 代理的 sshpass (类似于:if os.system('sshpass -p {} ssh -o ProxyCommand="ssh {}@{} nc {} 22"{}@{} -t {}'.format(密码、用户、jumpip,主机[j],用户,主机[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 的内容进行 pint '.format(hosts[j])) 虽然 ping 会返回退出代码,但 ICMP 回显回复并不意味着我能够打开隧道(例如,守护进程可能会被卡住或可能已经崩溃等),或者我可以做一个 try- except-else block ,尝试通过带有 pexpect 或 subrpocess.popen 的跳转盒打开到远程主机的 ssh session ,并通过管道连接 stdio,从而允许我推送密码如果未能引发自定义异常,但我不知道如何从 ssh 客户端获取退出代码,因此我可以检查状态...

这两个对我来说都不够强大,所以我宁愿正确地迭代 IP,为此我愿意征求建议。

一点背景知识 - 隧道将用于启动 nohup-ed 命令,然后关闭。该脚本使用多处理和池来完成一大堆这些,因此我将启动它们,然后有一个循环来检查它们的状态并检索在主机上执行的远程脚本的结果。我知道 os.system 已被弃用,我应该使用 subprocess,但这对于用例来说并不是必需的,所以我并不关心这一点。我正在寻找一种智能方法,如何迭代可能的路径,该路径将采用给定的带有长度 n 的跳转框的列表和带有长度 m 和超时的主机的列表x 秒最多 n*m*x 秒来计算并缩短该时间。

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

提前致谢!

最佳答案

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,因此您可能需要将所有 pexpect 代码替换为 Paramiko 代码。 Paramiko 为您提供了对建立 SSH 连接的所有低级方面的大量控制,因此可能有点难以理解,但它确实为您提供了对整个过程的大量控制。

关于通过不同路径的Python SSH迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54185013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com