如何使用invoke_shell在ssh的被调用子进程中输入命令?

时间:2019-01-11 15:43:36

标签: python-2.7 ssh subprocess paramiko teraterm

我正在尝试自动进行ssh连接。在此会话中,我想发送一些命令以登录到另一个子过程。

import paramiko
import os
import time 


ip = 'a'
port = 22
username = 'b' 
password = 'c'

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,port,username,password)

channel = ssh.invoke_shell()

out = channel.recv(9999)

channel.send('net-client\n')
channel.send('connect\n')
channel.send('yes\n')
channel.send('password\n')
channel.send('help\n')

while not channel.recv_ready():
    time.sleep(3)

out = channel.recv(9999)
print(out.decode("ascii"))

手动准备:

  • $(ssh连接提示)
  • $ net-client(当我编写此命令时,它将打开安装在计算机上的客户端)
  • &connect(我又有一个提示,因为我在子过程中,所以我写“ connect”)
  • 您确定要继续连接(是/否)吗?是(写“是”) 交互式SSH身份验证 输入密码:
  • 密码:“密码”(我写密码)
  • &(现在我已连接到子过程中)

实际结果: 我在“ net-client”之后有正确的答案,但是当我编写下一个命令(在这种情况下为“ connect”)时,它将写在ssh-connection上而不是我的子进程...

我想继续在此子过程中发送命令(因此请放置连接,密码等命令),但是我的脚本无法处理此操作。

这是我从脚本实际打印的内容:

$
net-client
"Correct answer to the command"
& connect
yes
password

help

1 个答案:

答案 0 :(得分:0)

最后我找到了答案。

解决方案很简单:将空格'\ n'移至新行。在输出中,我看到了已发送的命令,但缺少“按Enter”键。需要将其更改为'\ r'-回车,然后所有命令都被进程“接受”。