【问题标题】:How to get each dependent command execution output using Paramiko exec_command如何使用 Paramiko exec_command 获取每个依赖的命令执行输出
【发布时间】:2023-08-05 00:23:01
【问题描述】:

我正在使用 Paramiko 来执行单个或多个命令并获取其输出。

由于 Paramiko 不允许在同一个通道会话中执行多个命令,因此我将命令列表中的每个命令连接起来并在一行中执行,但输出可能是一个很大的输出文本,具体取决于命令,所以很难区分每个命令的输出。

ssh.exec_command("pwd ls- l cd / ls -l")

我想要类似的东西:

command_output = [('pwd','output_for_pwd'),('ls -l','output_for_ls'), ... ]

更轻松地处理每个命令输出。

有没有办法在不改变 Paramiko 库的情况下做到这一点?

【问题讨论】:

    标签: python linux shell ssh paramiko


    【解决方案1】:

    唯一的解决方案是(正如@Barmar 已经建议的那样)在各个命令之间插入唯一的分隔符。喜欢:

    pwd && echo "end-of-pwd" && cd /foo && echo "end-of-cd" && ls -l && echo "end-of-ls"
    

    然后在输出中寻找唯一的字符串。


    虽然 imo,最好将命令简单地分成单独的 exec_command 调用。尽管我并不认为您需要经常连续执行多个命令。通常你只需要cdset 之类的东西,而这些命令并不会真正输出任何内容。

    喜欢:

    1. pwd
    2. ls -la /foo(或cd /foo && ls -la

    对于类似的问题(对于“shell”频道),请参阅:
    Execute multiple dependent commands individually with Paramiko and find out when each command finishes

    【讨论】:

    • 我尝试了这种方法,但用 & 号代替管道谢谢
    【解决方案2】:

    我曾经这样做是为了在 ssh 和 telnet 中发送命令,你可以捕获每个命令的输出并尝试。

    cmd = ['pwd', 'ls - lrt', 'exit']
    cmd_output =[]
    for cmd in cmd:
        tn.write(cmd)
        tn.write("\r\n")
        out = tn.read_until('#')
        cmd_output.append((cmd,out))
        print out
    

    【讨论】:

    • 我觉得不是交互式会话,所以没有提示。