Переадресация портов Paramiko не работает с UTF-8 - PullRequest
0 голосов
/ 12 марта 2020

У меня есть целевой сервер, к которому может быть подключен сервер перехода (мы называем его бастионным сервером). Я использую переадресацию портов Paramiko, как показано ниже. Таким образом, поток будет выглядеть следующим образом:

local -> bastion server 200.200.200.200:12345 -> target server 10.10.10.10:12345

Все было хорошо, пока я не обнаружил, что он работает странно, когда я прохожу Китайские символы.

# -*- coding: utf-8 -*-
import paramiko
from paramiko.ssh_exception import SSHException
import time
import os

SSH_PORT = 12345   # fake
SSH_USER = 'root'  
KEY_FILE_NAME = 'ssh.key'
dest_host_ip = '10.10.10.10'   # fake
bastion_ip = '200.200.200.200'   # fake
key_path = os.path.join('./', KEY_FILE_NAME)


def _get_proxy_sock(bastion_ip, key):
    try:
        new_ssh = paramiko.SSHClient()
        new_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        new_ssh.connect(
            bastion_ip,
            port=SSH_PORT,
            username=SSH_USER,
            pkey=key,
            allow_agent=False, look_for_keys=False
        )
        proxy_socket = new_ssh.get_transport().open_channel(
            'direct-tcpip', (dest_host_ip, SSH_PORT), (bastion_ip, SSH_PORT)
        )
        return proxy_socket
    except(paramiko.AuthenticationException,
           paramiko.BadAuthenticationType,
           SSHException):
        raise Exception('paramiko_proxy_error')


k = paramiko.RSAKey.from_private_key_file(key_path)
proxy_socket = _get_proxy_sock(bastion_ip, k)
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(
    dest_host_ip,
    port=SSH_PORT,
    username=SSH_USER,
    key_filename=key_path,
    sock=proxy_socket,
    timeout=10,
    allow_agent=False,
    look_for_keys=False
)

channel = ssh.invoke_shell()
out = channel.recv(9999)
channel.send('ls 哈哈\n')           # command is here
# channel.send('ls\n')
while not channel.recv_ready():
    time.sleep(3)

out = channel.recv(9999)
print(out.decode("utf-8"))

ssh.close()

Результат, который я получил:

ls 哈哈
-bash: HISTCONTROL: readonly variable
-bash: HISTSIZE: readonly variable
root@sg-misc-200-200-200-200:~# ls
root@sg-misc-200-200-200-200:~# 

Тем не менее, ожидаемый результат:

root@sg-misc-200-200-200-200:~# ls 哈哈
ls: cannot access 哈哈: No such file or directory

Мастера, есть какие-нибудь советы по этому поводу? ОРЗ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...