我在ShoreTel语音开关上遇到问题,并且尝试使用Paramiko跳入并运行一些命令。我认为问题可能是,ShoreTel CLI给出的提示与标准Linux不同$。它看起来像这样:
$
server1$:stcli Mitel>gotoshell CLI> (This is where I need to enter 'hapi_debug=1')
Python是否仍在期待它$,还是我还缺少其他东西?
我认为这可能是一件时事,所以我将它们放在time.sleep(1)命令之间。似乎仍然没有采取。
time.sleep(1)
import paramiko import time keyfile = "****" User = "***" ip = "****" command1 = "stcli" command2 = "gotoshell" command4 = "hapi_debug=1" ssh = paramiko.SSHClient() print('paramikoing...') ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname = ip, username = User, key_filename = keyfile) print('giving er a go...') ssh.invoke_shell() stdin, stdout, stderr = ssh.exec_command(command1) time.sleep(1) stdin, stdout, stderr = ssh.exec_command(command2) time.sleep(1) stdin, stdout, stderr = ssh.exec_command(command4) time.sleep(1) print(stdout.read()) ssh.close() print("complete")
从成功执行此代码中,我期望的hapi_debug级别是1。这意味着当我通过SSH进入东西时,我会看到那些HAPI调试正在填充。当我这样做时,我看不到那些调试。
hapi_debug
我假设gotoshell和hapi_debug=1不是顶级命令,而是的子命令stcli。换句话说,stcli是一种外壳。
gotoshell
hapi_debug=1
stcli
在这种情况下,您需要将要在子shell中执行的命令写到其stdin:
stdin
stdin, stdout, stderr = ssh.exec_command('stcli') stdin.write('gotoshell\n') stdin.write('hapi_debug=1\n') stdin.flush()
如果您stdout.read随后调用,它将等到命令stcli完成。它永远不会做。如果您想继续读取输出,则需要发送一个终止子shell的命令(通常是exit\n)。
stdout.read
exit\n
stdin.write('exit\n') stdin.flush() print(stdout.read())