2017-04-04 1 views
0

클러스터의 특정 노드에서 실행중인 Jupyter Notebook 서버를 시작하는 스크립트가 있으며 로컬 Windows 컴퓨터 (브라우저 인터페이스)에서 실행중인 인스턴스에 액세스 할 수 있어야합니다. ssh 명령은 paramiko를 통해 처리되며, 단순히 시스템 호출이 아닌 터널을 만드는 비슷한 방법을 원합니다. 나는 불행하게도, 현재의 걸림돌 인 sshtunnel을 시험하고있다.클러스터 컴퓨팅 노드에서 실행중인 서버로의 ssh 터널

아래와 같이 두 개의 터널을 만들어야합니다. 명확성을 위해 HOME은 Windows 시스템이고 HOST는 클러스터 헤드 노드이며 NODE는 서버가 실행중인 특정 노드입니다.

서버 포트에 기본적으로 localhost로 가정하고 HOST 아래 8888 포트를 바인딩

[HOME] <------> [HOST] <------> [NODE] 
1111   2222   8888 
, 난 그냥 그림을 위해 그들을 사용하는 임의의 (현실에서, 가장 편리한 홈페이지 포트는 8888입니다)된다

로컬/원격 바인딩을 올바르게 결합하는 방법을 알 수 없기 때문에 아래 코드가 불완전하고 명백히 잘못되었음을 알고 있습니다. 지금 내가 틀린 나무를 짖고 있는지 모르겠다. 문서에서 한 번에 두 터널을 모두 만들 수 있다고 제안하지만 두 개의 별도 인스턴스가 필요합니까?

from sshtunnel import SSHTunnelForwarder 

t1 = SSHTunnelForwarder(
    ('headnode.server', 22), 
    ssh_username='meagain', 
    ssh_pkey='~/.ssh/id_rsa', 
    local_bind_address = ('localhost',1111), 
    remote_bind_addresses =[ ('localhost',2222), ('compute.node',8888)]) 
t1.start() 

편집 : 시도한 옵션 2 (아래 설명 참조). config는 SSH 클라이언트를 사용하여 명령 행에서 설정되고 잘 작동합니다. 참고로,이 윈도우 7 시스템 (따라서 추가 파일 경로 아래 승강이)

print(sshtunnel.__version__) 
'0.1.0' 
print(paramiko.__version__) 
'2.1.2' 



t1 = sshtunnel.SSHTunnelForwarder(
    NODE, 
    ssh_username=USER, 
    ssh_pkey=paramiko.RSAKey.from_private_key_file(os.path.expanduser(os.path.normpath('~/.ssh/id_rsa'))), 
    ssh_proxy_enabled=True, # DEFAULT 
    ssh_config_file=os.path.expanduser(os.path.normpath('~/.ssh/config')), # if rather than default 
    local_bind_address=('localhost', 1111), 
    remote_bind_address=('localhost', 8889) 
) 
t1.start() 

로그에 파이썬 3.6 아나콘다 미만 :

포트 8888로 로컬 호스트에 바인딩되므로
2017-04-06 12:28:25,523| INF | MainThrea/[email protected] | 0 keys loaded from agent 
    t1.start() 
    File "D:\Anaconda3\lib\site-packages\sshtunnel.py", line 1224, in start 
    reason='Could not establish session to SSH gateway') 
    File "D:\Anaconda3\lib\site-packages\sshtunnel.py", line 1036, in _raise 
    raise exception(reason) 
sshtunnel.BaseSSHTunnelForwarderError: Could not establish session to SSH gateway 
>>> 2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | paramiko.ssh_exception.ProxyCommandFailure: ('ssh HOST -W NODE:22', 'An operation was attempted on something that is not a socket') 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | 
2017-04-06 12:28:25,538| ERR | MainThrea/[email protected] | Could not connect to gateway NODE:22 : ssh HOST -W NODE:22 
Traceback (most recent call last): 
    File "D:\Bioinformatics\Scripts\bsub_jupyter\tunneller.py", line 234, in <module> 
2017-04-06 12:28:25,523| INF | MainThrea/[email protected] | Connecting to gateway: NODE:22 as user 'USER' 
2017-04-06 12:28:25,523| DEB | MainThrea/[email protected] | Concurrent connections allowed: True 
2017-04-06 12:28:25,523| DEB | MainThrea/[email protected] | Trying to log in with key: b'1e44a013d97d417e4900025c6c11d073' 
2017-04-06 12:28:25,523| DEB | MainThrea/[email protected] | Connecting via proxy: 'HOST' 
2017-04-06 12:28:25,523| ERR | Thread-2/[email protected] | Exception: ('ssh HOST -W NODE:22', 'An operation was attempted on something that is not a socket') 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | Traceback (most recent call last): 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | File "D:\Anaconda3\lib\site-packages\paramiko\proxy.py", line 96, in recv 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] |  [self.process.stdout], [], [], select_timeout) 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | OSError: [WinError 10038] An operation was attempted on something that is not a socket 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | During handling of the above exception, another exception occurred: 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | Traceback (most recent call last): 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | File "D:\Anaconda3\lib\site-packages\paramiko\transport.py", line 1749, in run 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] |  self._check_banner() 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | File "D:\Anaconda3\lib\site-packages\paramiko\transport.py", line 1893, in _check_banner 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] |  buf = self.packetizer.readline(timeout) 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | File "D:\Anaconda3\lib\site-packages\paramiko\packet.py", line 331, in readline 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] |  buf += self._read_timeout(timeout) 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | File "D:\Anaconda3\lib\site-packages\paramiko\packet.py", line 485, in _read_timeout 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] |  x = self.__socket.recv(128) 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] | File "D:\Anaconda3\lib\site-packages\paramiko\proxy.py", line 107, in recv 
2017-04-06 12:28:25,538| ERR | Thread-2/[email protected] |  raise ProxyCommandFailure(' '.join(self.cmd), e.strerror) 

답변

0

당신이 말하길, 그것은 호스트로부터 도달 할 수 없을 것입니다.

옵션 A

사용 sshtunnel의 ssh_proxy 매개 변수 :

proxy = paramiko.ProxyCommand('ssh HOST -l USER -i IDENTITY_FILE -W headnode.server:22') 
t1 = SSHTunnelForwarder(
    (NODE, 22), 
    ssh_username='meagain', 
    ssh_pkey='~/.ssh/id_rsa', 
    ssh_proxy=proxy, 
    local_bind_address=('localhost', 1111), 
    remote_bind_addresses=('localhost', 8888) 
) 

옵션 B

사용 ssh 설정 파일 그런 경우, 두 가지 옵션이 있습니다. 그런 다음

Host HOST 
    User HOSTUSER 
    IdentityFile HOSTUSER_PKEY 
Host NODE 
    ProxyCommand ssh HOST -W %h:%p 

터널을 열고이 ProxyCommand 항목을 읽어 보자 :

t1 = SSHTunnelForwarder(
    (NODE, 22), 
    ssh_username='meagain', 
    ssh_pkey='~/.ssh/id_rsa', 
    ssh_proxy_enabled=True, # DEFAULT 
    ssh_config_file='/path/to/your-config-file', # if rather than default 
    local_bind_address=('localhost', 1111), 
    remote_bind_addresses=('localhost', 8888) 
) 
+0

암이 시도를

당신은 NODE 등의 ProxyCommand 항목에 유효한 구성 파일이 필요합니다 옵션 2, 나는 어쨌든 설정 파일을 설정한다는 의미였습니다. 그것은 명령 행에서 잘 작동합니다. 불행히도 ssh 게이트웨이에 연결할 수 없다는 오류가 발생합니다. ProxyCommand로 좁혔다 고 생각합니다. 프록시가있는 paramiko 클라이언트를 구성 할 때, 저는 이것을 되돌려 놓습니다 :''paramiko.ssh_exception.ProxyCommandFailure : ('ssh HOST -W NODE : 22', 'An '' 호스트 HOST \t 호스트 이름 HOSTIPADDRESS \t 사용자 사용자 \t IdentityFile ~/: 작업이 소켓 ')'' – blackgore

+0

는 참조 용으로, 여기에 설정입니다 이외의 개체에 작업을 시도했습니다.SSH/id_rsa_gsg_keypair를 호스트 NODE \t 사용자 사용자 \t ProxyCommand의 SSH 호스트 -W %의 시간 % P '' – blackgore

+0

당신이'DEBUG_LEVEL = "DEBUG"을'설정하고 질문을 게시 할 수 있습니까? 여러분의 버전과 동일합니다 ('[l. [version. l] [paramiko, sshtunnel]]) – fernandezcuesta