【问题标题】:Python Paramiko get full outputPython Paramiko 获得完整输出
【发布时间】:2016-05-16 23:18:20
【问题描述】:

我正在设置与远程服务器的远程 SSH 连接并运行特定命令来转储数据库表。远程服务器是一个硬化的 Linux 操作系统,它有自己的外壳。我正在运行远程 sql 类型的命令来转储大量数据。我的 python 脚本使用交互式 SSH 会话来执行此操作。正如你在下面看到的,我正在运行一个命令,让它休眠 5 秒,然后转储缓冲区。我已经为“remote_conn.recv()”函数尝试了许多不同的选项,但我无法获得完整的输出。输出非常大,并且是分页的(按空格了解更多)。我什至没有得到第一页的完整输出。如果第一页有 50 行,我只得到前 4 行。

有没有更好的方法来做到这一点?我如何才能获取完整的输出?下面是我脚本的 Paramiko 部分。

# Create instance of SSHClient object
remote_conn_pre = paramiko.SSHClient()

# Automatically add untrusted hosts
remote_conn_pre.set_missing_host_key_policy(
     paramiko.AutoAddPolicy())

# initiate SSH connection
remote_conn_pre.connect(options.ip, username=options.userName, password=options.password)

# Use invoke_shell to establish an 'interactive session'
remote_conn = remote_conn_pre.invoke_shell()

remote_conn.send("<remote sql command here>")
time.sleep(5)
output = remote_conn.recv(65535)

print output
remote_conn.close()

【问题讨论】:

  • 为什么不直接使用 SQL 客户端??
  • 操作系统是一个硬化的Linux,有自己的外壳。我必须从 CLI 运行它自己的命令。这不是一个标准的 SQL 调用,不幸的是你不能远程访问它,否则我会走那条路。
  • 这台机器上允许 SCP 吗?
  • 不幸的是,事实并非如此。您只能通过 VTY 对其进行 SSH 连接,VTY 会使用自己的命令显示自己的 shell 类型。

标签: python ssh paramiko


【解决方案1】:

我能够通过抓取较小的缓冲区块并将它们连接在一起直到我在缓冲区中找到某个字符串来获得完整的输出。

while True:
    data = remote_conn.recv(500)

    if "<string>" in data:
        break
    else:
        finalOutput += data

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2018-03-18
    相关资源
    最近更新 更多