我写了一个脚本来帮助其他人在我们的存储系统上运行一个简单的日常命令。该脚本适用于返回简短输出的命令,例如ls,但是,当脚本要运行具有大输出的命令时,不会返回输出。这几乎就好像它超时但根本没有反馈,例如我以为可能有部分命令输出。我已经围绕这个做了一些研究,并发现了其他人有同样的问题。他们得到的答案是使用:
stdin, stdout, stderr = client.exec_command(command)
我已经在我的代码中使用了它。 我想知道它是否与缓冲区大小有关,令人讨厌的是我不知道如何在我的代码中实现它。我尝试使用以下方法添加时间延迟:
time.sleep(10)
但是没有那种喜悦。我也尝试过使用:
print stdout.channel.recv_exit_status()
然而,我得到了127的回报,所以我觉得我在那里没有了! 我的代码是:
def ssh_command(ip, user, passwd, command):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(ip, username=user, password=passwd)
stdin, stdout, stderr = client.exec_command(command)
print stdout.read()
print stderr.read()
return
if __name__ == '__main__':
ssh_command(ip, user, passwd, command)
我省略了前几个代码块,其中一些变量是由用户的原始输入定义的。这是相当长的,所以我认为最好省略,但很自然,我可以发布它,如果需要。
对于那些对我正在尝试运行的命令感兴趣的人来说,这是他们的GPFS(Spectrum Scale)存储系统独有的IBM命令。命令是:
mmdf mmfs1 --block-size auto
该命令返回存储系统上所有磁盘池的存储空间。
stderr.read()
表示命令无法识别(bash: mmdf: command not found
),尽管它在SSH进入存储控制器时仍然有效。
答案 0 :(得分:1)
根据您的最新评论,您应该在运行命令时使用mmdf
的绝对路径:
client.exec_command("/the/path/to/mmdf mmfs1 --block-size auto")
要找出mmdf
的位置,请手动登录服务器并运行:
which mmdf
# or
type -P mmdf