使用pexpect时关闭ssh连接的正确方法?

时间:2017-08-21 12:45:17

标签: python ssh pexpect winpexpect

我使用Python pexpect(和winpexpect)来执行ssh

命令
$.validator.addMethod(
        "usDate",
        function(value, element) {
            // date mm/dd/yyyy
            return value.match(/^(0[0-9]|1[0-2])[\/](0[0-1]|1[0-9]|2[0-9]|3[0-1])[\/]\d{4}$/);

        }
);

如何关闭self.spawn以确保ssh会话已关闭? 对于Windows和UNIX,跨平台有什么方法?

2 个答案:

答案 0 :(得分:1)

优雅的方式是发送exit\rCTRL-D并等待EOF。但是在完成SSH会话之后退出脚本(Expect,pexpect或winexpect)并且不关心SSH会话的退出状态也没关系。当脚本退出时(无论是否清除),操作系统内核将为您关闭SSH会话(TCP连接)。 SSH服务器永远不会抱怨这一点。

pexpect.spawn.close()将关闭pty,而pty会将SIGHUP发送到shell,而shell将终止(终止)shell,除非shell忽略SIGHUP。这就像你在shell运行时关闭PuTTY(或gnome-terminal,...)窗口。

更新

以上陈述假设所有应用程序(Expect,pexpect,winexpect和SSH服务器)都得到了很好的实现。我有一个系统,当SSH连接未完全关闭时,SSH 服务器无法回收已分配的PTY。因此,经过一段时间后,虽然SSH身份验证成功,但我无法再获得PTY。

答案 1 :(得分:0)

如果你的目标只是通过SSH执行命令,你也可以考虑使用Paramiko

import paramiko

# Create a new client
client = paramiko.SSHClient()
# Connect to your remote
client.connect('127.0.0.1', username='john', password='doe')

# Execute a command
stdin, stdout, stderr = ssh.exec_command("pwd")

# Do anything you want with `stdout` and `stderr`
# Execute as many other commands as you want

# When you are done, close your connection
client.close()

这是一个纯Python包,每当我使用它时都能很好地工作。