我想写一个程序(在Windows 7上的Python 3.x中),它通过ssh在远程shell上执行多个命令。在查看paramikos的exec_command()
函数后,我意识到它不适合我的用例(因为通道在命令执行之后关闭),因为这些命令取决于环境变量(由先前命令设置),并且不能被连接成一个exec_command()
调用,因为它们将在程序中的不同时间被执行。
因此,我希望在同一个通道中执行命令,我研究的下一个选项是使用paramikos的invoke_shell()
函数实现交互式shell:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=psw, port=22)
channel = ssh.invoke_shell()
out = channel.recv(9999)
channel.send('cd mivne_final\n')
channel.send('ls\n')
while not channel.recv_ready():
time.sleep(3)
out = channel.recv(9999)
print(out.decode("ascii"))
channel.send('cd ..\n')
channel.send('cd or_fail\n')
channel.send('ls\n')
while not channel.recv_ready():
time.sleep(3)
out = channel.recv(9999)
print(out.decode("ascii"))
channel.send('cd ..\n')
channel.send('cd simulator\n')
channel.send('ls\n')
while not channel.recv_ready():
time.sleep(3)
out = channel.recv(9999)
print(out.decode("ascii"))
ssh.close()
此代码存在一些问题:
1.第一个print
并不总是打印ls
输出(有时只在第二个print
上打印)。
1.第一个cd
和ls
命令总是出现在输出中(我通过recv
命令获得它们,作为输出的一部分),而后面的所有cd
和ls
命令有时会打印出来,有时则不会。
1.第二个和第三个cd
和ls
命令(打印时)始终出现在第一个ls
输出之前。
我对这种“非决定论”感到困惑,非常感谢你的帮助。
2条答案
按热度按时间643ylb081#
yvfmudvl2#
我尝试了上面的答案,但它不起作用,因为ECHO命令在Python CLI中返回了错误,我在SSH中使用了该命令。
所以我编写了另一个适用于Python CLI的代码,假设输出在一行中。
我也认为像f“print('{finish}')”这样的函数可以做和上面的ECHO一样的事情(终止符??),但是我没有使用它,因为我的输出总是在一行中。