클러스터의 특정 노드에서 실행중인 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)
암이 시도를
당신은
NODE
등의ProxyCommand
항목에 유효한 구성 파일이 필요합니다 옵션 2, 나는 어쨌든 설정 파일을 설정한다는 의미였습니다. 그것은 명령 행에서 잘 작동합니다. 불행히도 ssh 게이트웨이에 연결할 수 없다는 오류가 발생합니다. ProxyCommand로 좁혔다 고 생각합니다. 프록시가있는 paramiko 클라이언트를 구성 할 때, 저는 이것을 되돌려 놓습니다 :''paramiko.ssh_exception.ProxyCommandFailure : ('ssh HOST -W NODE : 22', 'An '' 호스트 HOST \t 호스트 이름 HOSTIPADDRESS \t 사용자 사용자 \t IdentityFile ~/: 작업이 소켓 ')'' – blackgore는 참조 용으로, 여기에 설정입니다 이외의 개체에 작업을 시도했습니다.SSH/id_rsa_gsg_keypair를 호스트 NODE \t 사용자 사용자 \t ProxyCommand의 SSH 호스트 -W %의 시간 % P '' – blackgore
당신이'DEBUG_LEVEL = "DEBUG"을'설정하고 질문을 게시 할 수 있습니까? 여러분의 버전과 동일합니다 ('[l. [version. l] [paramiko, sshtunnel]]) – fernandezcuesta