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

Python 为什么sshtunnel模块会将未知行打印到stdout?,python,ssh,ssh-tunnel,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:

如果我运行此代码:

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,而对异常不做任何处理是不好的

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

尽管程序没有任何标准输出语句,但错误行来自库
sshtunnel


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

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

尽管程序没有任何标准输出语句,但错误行来自库
sshtunnel


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

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

它会出现在屏幕上,因为您还没有设置日志处理程序将其发送到其他地方。有关更多信息,请参阅


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

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

它会出现在屏幕上,因为您还没有设置日志处理程序将其发送到其他地方。有关更多信息,请参阅


如果您的代码是web服务的一部分,它将转到web服务器的错误日志。

传递到
open\u tunnel
的第一个非关键字参数应该是目标服务器(字符串或
(ip,端口))
tuple(请参见函数的说明)


最终,在您给出的示例中,
ssh\u host
被设置为
“hello”
,这会记录一条错误消息。

传递给
open\u tunnel
的第一个非关键字参数应该是目标服务器(字符串或
(ip,端口)
元组(请参见函数的)

最终,在您给出的示例中,
ssh\u host
被设置为
“hello”
,这会记录一条错误消息。

“由于某种原因出现了一些随机行。”-这是一条直接的错误消息……远程服务器找不到名为“hello”的主机。至于您看到它的原因,
sshtunnel
会为错误消息创建一个控制台记录器,如果您自己没有传递记录器。这是一件奇怪的事情,IMHO。
open_tunnel
接受两个键盘参数:
logger
是标准python记录器,
debug_level
是要记录的级别。有关设置的详细信息,请参阅打开记录器。

“由于某种原因出现了一些随机线。”-这是一条直接的错误消息…远程服务器找不到名为“hello”的主机。至于您看到它的原因,
sshtunnel
会为错误消息创建一个控制台记录器,如果您自己没有传递记录器。这是一件奇怪的事情,IMHO。
open_tunnel
接受两个键盘参数:
logger
是标准python记录器,
debug_level
是要记录的级别。有关设置的详细信息,请参阅打开记录器。

TL;DR 添加
threaded=False


你好,我也犯了同样的错误

在隧道关闭(释放)后出现:

hth

TL;DR 添加
threaded=False


你好,我也犯了同样的错误

在隧道关闭(释放)后出现:


hth

仅仅设置一个日志处理程序是不够的。
sshtunnel
如果你不将一个日志传递到调用中,就设置一个控制台日志。我认为这很奇怪,但它确实存在。感谢大家提供的信息-它真的很有帮助。抑制这些行的最简单方法似乎是通过
debug\u level=100
打开\u隧道,一个对于临界值,默认日志记录级别仅上升到50。我主要使用异常本身及其回溯来找出错误是什么,以及错误发生在哪里-我将在python中仔细研究这些日志记录功能,以防将来实际需要使用它们。在进一步测试后,
debug_level=100
删除了一些错误来自sshtunnel的消息,但不是全部。我还尝试传递sshtunnel
logger=logging.getLogger(“test”)
,或者只包含
logging.basicConfig(filename=“test.log”,level=logging.DEBUG)
位于我的代码顶部,但两者都不能阻止日志消息出现在屏幕上。
mute\u exceptions=True
raise\u exception\u如果任何转发器出现问题=False,那么这两种方法似乎都没有帮助。仅设置日志处理程序是不够的。
sshtunnel
如果不传递,则设置控制台日志记录程序我认为这很奇怪,但事实就是如此。感谢大家提供的信息-它真的很有帮助。抑制这些行的最简单方法似乎是通过
debug\u level=100
t
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
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)