我有一个Python例程,它调用某种CLI(例如telnet),然后在其中执行命令。问题是有时CLI拒绝连接,并且在主机shell中执行命令会导致各种错误。我的想法是在调用CLI后检查shell提示符是否改变。
问题是:如何在Python中获取shell提示字符串?
回应PS1不是一个解决方案,因为有些CLI无法运行它并且它返回一个类似符号的字符串而不是实际的提示符:
SC-2-1:~ # echo $PS1
\[\]\h:\w # \[\]
修改
我的日常工作:
def run_cli_command(self, ssh, cli, commands, timeout = 10):
''' Sends one or more commands to some cli and returns answer. '''
try:
channel = ssh.invoke_shell()
channel.settimeout(timeout)
channel.send('%s\n' % (cli))
if 'telnet' in cli:
time.sleep(1)
time.sleep(1)
# I need to check the prompt here
w = 0
while (channel.recv_ready() == False) and (w < timeout):
w += 1
time.sleep(1)
channel.recv(9999)
if type(commands) is not list:
commands = [commands]
ret = ''
for command in commands:
channel.send("%s\r\n" % (command))
w = 0
while (channel.recv_ready() == False) and (w < timeout):
w += 1
time.sleep(1)
ret += channel.recv(9999) ### The size of read buffer can be a bottleneck...
except Exception, e:
#print str(e) ### for debugging
return None
channel.close()
return ret
这里需要一些解释:ssh参数是一个paramiko.SSHClient()实例。我使用此代码登录服务器,然后从那里调用另一个CLI,可以是SSH,telnet等。
答案 0 :(得分:1)
我建议发送将PS1改为已知字符串的命令。当我使用来自Korn shell脚本的Oracle sqlplus作为协同进程时,我已经这样做了,知道何时结束从我发出的最后一个语句读取数据/输出。所以基本上,你发送:
PS1='end1>'; command1
然后你会读到行,直到你看到“end1&gt;” (为了更容易,在PS1结束时添加换行符。)