如果我运行此代码:
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进行异常并且对它们不采取任何措施是不好的
答案 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)
添加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()
上下文中使用SSHTunnelForwarder
和with ... 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