場(chǎng)景
有一個(gè)機(jī)房叶沛,機(jī)房?jī)?nèi)的機(jī)器與外界網(wǎng)絡(luò)不通蒲讯,但是機(jī)房提供了一臺(tái)機(jī)器讓我們可以訪問(wèn)到機(jī)房?jī)?nèi)的機(jī)器,對(duì)于這臺(tái)機(jī)器我們稱為跳板機(jī)恬汁。同時(shí)提供對(duì)外的服務(wù)部署在機(jī)房外的一臺(tái)機(jī)器上伶椿,現(xiàn)在需要訪問(wèn)到跳板機(jī)或者機(jī)房?jī)?nèi)機(jī)器(ssh)。如圖
image.png
其中api_server可以免密登錄jump_server氓侧,jump_server可以免密登錄private_server
ssh到j(luò)ump server
client = paramiko.SSHClient()
# client.load_system_host_keys()
# 允許連接不在know_hosts文件中的主機(jī)
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='jump_server_ip', port=22, username='root', password='pwd')
# 私鑰方式
# pkey = paramiko.RSAKey.from_private_key_file(id_rsa_path) # 私鑰
# client.connect(hostname=hostname, port=port, username=username, pkey=pkey)
stdin, stdout, stderr = client.exec_command('pwd') # 執(zhí)行命令
code, out, err = stdout.channel.recv_exit_status(), stdout.read(), stderr.read()
client.close()
ssh到private server
with sshtunnel.open_tunnel(
ssh_address_or_host='jump_server_ip',
ssh_username='root',
ssh_password='pwd',
# ssh_pkey='local_id_rda',
remote_bind_address=('private_server_ip', 22),
# local_bind_address=('127.0.0.1', 10022) # 綁定本機(jī)10022端口
) as tunnel:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='127.0.0.1', port=tunnel.local_bind_port, username='root', password='pwd')
# pkey = paramiko.RSAKey.from_private_key_file('jump_id_rda') # 跳板機(jī)的私鑰
# client.connect(hostname='127.0.0.1', port=tunnel.local_bind_port, username='root', pkey=pkey)
stdin, stdout, stderr = client.exec_command('pwd')
code, out, err = stdout.channel.recv_exit_status(), stdout.read(), stderr.read()
client.close()
這里其實(shí)相當(dāng)于將private_server的22端口轉(zhuǎn)發(fā)到到本地的一個(gè)端口脊另,再利用paramiko連接本地的端口。private_server上并沒(méi)有配置api_server的公鑰约巷,所以不能用api_server的私鑰登錄偎痛。但是jump_server與private_server是可以免密登錄的,可以利用jump_server的私鑰登錄独郎,所以我將jump_server的私鑰拷到了api_server上踩麦。