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
你好,我也犯了同样的错误 在隧道关闭(释放)后出现: hthTL;DR 添加
threaded=False
你好,我也犯了同样的错误 在隧道关闭(释放)后出现:
hth仅仅设置一个日志处理程序是不够的。
sshtunnel
如果你不将一个日志传递到调用中,就设置一个控制台日志。我认为这很奇怪,但它确实存在。感谢大家提供的信息-它真的很有帮助。抑制这些行的最简单方法似乎是通过debug\u level=100
打开\u隧道,一个对于临界值,默认日志记录级别仅上升到50。我主要使用异常本身及其回溯来找出错误是什么,以及错误发生在哪里-我将在python中仔细研究这些日志记录功能,以防将来实际需要使用它们。在进一步测试后,debug_level=100
删除了一些错误来自sshtunnel的消息,但不是全部。我还尝试传递sshtunnellogger=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)