Paramiko отправляет текст в оболочку psuedo - PullRequest
0 голосов
/ 18 апреля 2020

Тестирование отправки команд на устройства IoT, которые переводят пользователя в сценарий python вместо оболочки bash.

т.е. в / etc / passwd - admin: x: 1000: 0: admin: / home / admin: /home/admin/IoT.py

Так что нельзя использовать обычные bash exec_commands для общения со скриптом python. В основном, когда он подключается, ему нужно отправить командную строку и получить выходные данные. Ниже скрипт читает IP-адреса из текстового файла, как правильно отправлять и получать команды

#!/usr/bin/env python
import paramiko
import sys

def LogonSSH(ipAddress) :

    ssh = paramiko.SSHClient()

    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    for line in open(ipAddress, "r").readlines() :

        ipAddr = line.strip()
        username='admin'
        password='admin'

        try :
            print "[+] Trying %s with username: %s password: %s " % (ipAddr, username, password)
            ssh.connect(ipAddr, username=username, password=password)

        except paramiko.AuthenticationException:
            print "[x] %s  - could not log in" % (ipAddr)
            continue

                stdin, stdout, stderr = ssh.exec_command('help')
                stdin.flush()
            stdin.write('help\n')
                out = stdout.read()
                stdin.flush()
                print out
                ssh.close()
                break

if __name__ == "__main__" :
    LogonSSH(sys.argv[1])

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Следующий код получит MOTD, но отправка все еще не работает

             my_ssh_shell = ssh.invoke_shell()
                my_ssh_shell.settimeout(2)
                while True :
                    data = my_ssh_shell.recv(1024).decode('ascii')
                    if len(data) < 1 :break
                    print(data)
                return
                  #### DOESNT SEND HERE OR GET RECEIVE RESULTS#########
              #      my_ssh_shell.send('help\n') 
              #      while True :
              #          data = my_ssh_shell.recv(1024).decode('ascii')
              #          if len(data) < 1 :break
              #          print(data)
              #      return  
                my_ssh_shell.close()
0 голосов
/ 18 апреля 2020

Ниже изменения могут вам помочь. Просто сделайте send и recv, recv принимает только последние выходные команды, но вам нужно учесть:

  • Задержите немного сна после отправки команды (только методом проб и ошибок)
  • Некоторые хитрости выходные данные, потому что они содержат невидимые строковые части, такие как (..)
  • Некоторые выходные данные могут быть слишком большими для обработки> 65100 байтов recv, просто проверьте Paramiko Docs для метода recv.
#!/usr/bin/env python
import paramiko
import sys

def LogonSSH(ipAddress) :
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    for line in open(ipAddress, "r").readlines() :
        ipAddr = line.strip()
        username='admin'
        password='admin'

        try:
            print "[+] Trying %s with username: %s password: %s " % (ipAddr, username, password)
            ssh.connect(ipAddr, port=22, username=uname, password=pin, timeout=240,banner_timeout=250, auth_timeout=500)
            my_ssh_shell = ssh.invoke_shell()
        except Exception as ex:
            print("Some exception occured:" + str(ex))
            continue

        my_ssh_shell.send(bytes("help" + "\x0D", 'utf-8'))
        result_screen = my_ssh_shell.recv(65100).decode('ascii')
        print("Your SSH -help- command returns:" + str(result_screen))
        my_ssh_shell.close()
        break

if __name__ == "__main__" :
    LogonSSH(sys.argv[1])

Редактировать: просто измените его на любое исключение для соединения, а также некоторые дополнительные параметры в строке соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...