为什么sshtunnel模块会将未知行打印到stdout?

时间:2016-04-06 16:59:39

标签: python ssh ssh-tunnel

如果我运行此代码:

import sshtunnel

try:
    with sshtunnel.open_tunnel("hello", ssh_username="user",
                               ssh_password="PASSWORD",
                               remote_bind_address=("1.2.3.4", 23)) as server:
        pass
except:
    pass

我明白了:

2016-04-06 10:47:53,006 | ERROR   | Could not resolve IP address for hello, aborting!

我忽略了异常,但出于某种原因出现了一些随机行。为什么?这只是某个库中的某个随机打印声明吗?这是常见的吗?好像库不应该直接在屏幕上打印任何内容。我该如何压制这一行?

PS。代码意味着简单地复制错误 - 显然使用catch-all进行异常并且对它们不采取任何措施是不好的

5 个答案:

答案 0 :(得分:3)

这看起来像一个日志记录语句,特别是logging.error()

它会进入屏幕,因为你没有设置一个日志处理程序,可以将它发送到其他地方。有关详细信息,请参阅https://docs.python.org/2/library/logging.html

它将转到标准错误输出(在终端窗口上看起来与常规输出相同。)如果您的代码是Web服务的一部分,它将转到Web服务器的错误日志。

答案 1 :(得分:1)

您传递给open_tunnel的第一个非关键字参数应该是目标服务器(字符串或(ip, port)元组(请参阅函数docstring)。

最终,这会导致ssh_host在您提供的示例中设置为"hello",这会在this except block中记录错误消息。

答案 2 :(得分:0)

理想情况下,"Hello"所在的部分应该具有您要连接的SSH服务器的IP地址。您提到的随机行是解释它的ERROR语句。

虽然程序没有任何stdout语句,但ERROR行来自库sshtunnel

库中的语句块使用带有此特定错误消息的raise(exeption)语句。 raise函数用于填充可由except语句捕获的消息。

答案 3 :(得分:0)

"出于某种原因出现了一些随机行。" - 它是一个直接的错误消息......远程服务器无法找到主机叫"你好"。至于你为什么看到它,如果你自己没有通过记录器,sshtunnel会为错误信息创建一个控制台记录器。这是一件奇怪的事情,恕我直言。 open_tunnel接受两个keywoard参数:logger是标准的python记录器,debug_level是要记录的级别。有关设置记录器的详细信息,请参阅python logging

答案 4 :(得分:0)

TL; DR

添加threaded=False

您好我有完全相同的错误

并且在关闭隧道(发布)后出现:

2018-01-16 10:52:58,685| INFO    | Shutting down tunnel ('0.0.0.0', 33553)
2018-01-16 10:52:58,764| INFO    | Tunnel: 0.0.0.0:33553 <> sql_database_resolved_on_remote:1433 released
2018-01-16 10:52:58,767| ERROR   | Could not establish connection from ('127.0.0.1', 33553) to remote side of the tunnel
2018-01-16 10:52:58,889| DEBUG   | Transport is closed

这有些正常,但为什么会出现?

“解决方案肥胖型”

添加threaded=False

open_tunnel()上下文中使用SSHTunnelForwarderwith ... as tunnel:进行了测试:

import time
import socket
from sshtunnel import SSHTunnelForwarder, open_tunnel

def test_tunnel(tunnel):
    # Wait for tunnel to be established ?
    #tunnel.check_tunnels()
    #time.sleep(0.5)
    #print tunnel.tunnel_is_up
    s = socket.socket()
    s.settimeout(2)
    for i in range(0, 10):
        """
        I create a new socket each time otherwise I get
        the error 106 (errno.EISCONN):
        'Transport endpoint is already connected'
        """
        s = socket.socket()
        s.settimeout(2)
        state = s.connect_ex(('localhost', tunnel.local_bind_port))
        s.close()
        okoko = "OK" if state == 0 else "NO"
        print "%s (%s)" % (okoko, state)

with open_tunnel(
    'server_i_can_ssh_with_mykey',
    ssh_username='myuser',
    ssh_pkey='/home/myuser/.ssh/id_rsa',
    ssh_private_key_password=None, #no pwd on my key
    remote_bind_address=('sql_database_resolved_on_remote', 1433), #e.g.
    debug_level=10, # remove this if you test with SSHTunnelForwarder
    threaded=False,
) as tunnel:
    test_tunnel(tunnel)

HTH