问答 请教社区大佬,PYTHON 第三方库 paramiko 连接远程服务器输入命令后,返回的命令不完整,这个有办法解决吗?

zeng · 2022年08月23日 · 最后由 zeng 回复于 2022年08月26日 · 7689 次阅读
host_name = ""
port = 22
user_name = ""
pass_word = ""
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
client.connect(hostname=host_name, port=port, username=user_name, password=pass_word, compress=True)
channel = client.invoke_shell()
# 发送命令,获取返回
channel.send(cmd + '\n').recv(-1).decode("utf-8")

问题:上面 channel.send(cmd + '\n').recv(-1).decode("utf-8") 获取到的返回值里面,命令显示不完整,求解怎么破,感谢大佬们的解答!!!

最佳回复
zeng #1 · 2022年08月26日 Author
陈恒捷 回复

-1 是不限长度,一顿乱改,只要修改 invoke_shell() 的长度就行,比如 invoke_shell(width=1024),默认是 80,太小了,命令比较长会被截断,我理解没错的话

加了宽度的效果:

默认宽度的效果:(命令显示不全)

共收到 7 条回复 时间 点赞
zeng #2 · 2022年08月23日 Author

😂

没看懂这个问题。

代码里的关键命令内容 cmd 内容是啥?
完整的返回值是啥,和截图里有啥不同,缺了啥?

另外,随手查了下这个库的用法,好像不能 send 完立马 receive 的,需要稍等一下?

我看的这个:https://pyneng.readthedocs.io/en/latest/book/18_ssh_telnet/paramiko.html

稍微吐槽下,官方文档好像没有 quickstart 这类快速上手文档,只有怎么装,以及很详细的每个函数的说明。对于想要快速知道典型用法的人来说,看得有点蒙

zeng #4 · 2022年08月25日 Author
陈恒捷 回复

抱歉,复制漏了,cmd 是一串命令,如下面贴出的命令:

jdbcloader card \
--jdbcurl=jdbc:mysql://192.xx.xx.xx:xxxx/test_center \
--jdbcuser=root \
--jdbcpassword=123456 \
--jdbctable=card \
--jdbcdriver=com.mysql.jdbc.Driver

目前是对发送函数做了个 while 循环,匹配到结束符就停止,然后输出 recv 的内容。

def send(cmd, channel):
    # 结束符
    end_symbol = ['>', '>>', ']#']
    channel.send(cmd + '\n')
    results = ''
    i = 0
    while True:
        time.sleep(1)
        result = channel.recv(-1).decode("utf-8")
        results += result
        # 包含结束符则停止循环
        if results[-2:] in end_symbol or results[-1:] in end_symbol:
            break
        i += 1
        # 避免死循环,10秒后停止
        if i > 10:
            break
    print(results)
    return results

遇到的问题:

就如描述中截图,长的命令只显示了一小部分,或者说只返回了一小部分,短的命令可以显示全部

zeng #5 · 2022年08月25日 Author

@shawn 大佬有没有遇到过这种情况,求助!

zeng 回复

你的信息还是不够全面。命令的正常输出是啥,程序返回内容里缺了啥呢?

另外,channel.recv(-1) ,这里参数传入 -1 确认是没问题的吗?我看其他文档都是传具体最大长度值的。

zeng #1 · 2022年08月26日 Author
陈恒捷 回复

-1 是不限长度,一顿乱改,只要修改 invoke_shell() 的长度就行,比如 invoke_shell(width=1024),默认是 80,太小了,命令比较长会被截断,我理解没错的话

加了宽度的效果:

默认宽度的效果:(命令显示不全)

zeng 关闭了讨论 08月29日 08:29
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册