Вызывать несколько команд внутри процесса в интерактивном режиме SSH - PullRequest
1 голос
/ 02 апреля 2019

Я начал использовать paramiko для вызова команд на моем сервере из скрипта python на моем компьютере.

Я написал следующий код:

from paramiko import client

class ssh:
    client = None

    def __init__(self, address, port, username="user", password="password"):
        # Let the user know we're connecting to the server
        print("Connecting to server.")
        # Create a new SSH client
        self.client = client.SSHClient()
        # The following line is required if you want the script to be able to access a server that's not yet in the known_hosts file
        self.client.set_missing_host_key_policy(client.AutoAddPolicy())
        # Make the connection
        self.client.connect(address, port, username=username, password=password, look_for_keys=False)

    def sendcommand(self, command):
        # Check if connection is made previously
        if self.client is not None:
            stdin, stdout, stderr = self.client.exec_command(command)
            while not stdout.channel.exit_status_ready():
                # Print stdout data when available
                if stdout.channel.recv_ready():
                    # Retrieve the first 1024 bytes
                    _data = stdout.channel.recv(1024)
                    while stdout.channel.recv_ready():
                        # Retrieve the next 1024 bytes
                        _data += stdout.channel.recv(1024)

                    # Print as string with utf8 encoding
                    print(str(_data, "utf8"))
        else:
            print("Connection not opened.")


    def closeconnection(self):
        if self.client is not None:
            self.client.close()

def main():
    connection = ssh('10.40.2.222', 2022 , "user" , "password")
    connection.sendcommand("cd /opt/process/bin/; ./process_cli; scm")    
    print("here")

    #connection.sendcommand("yes")
    #connection.sendcommand("nsgadmin")
    #connection.sendcommand("ls")

    connection.closeconnection()

if __name__ == '__main__':
    main()

Теперь последняя команда в команде Iотправляю на мой сервер (scm) команду, которая должна быть отправлена ​​процессу "process_cli", который я запускаю на сервере, и должна вывести мне выходные данные процесса (процесс получает входные данные от stdin оболочки сервераи выводит вывод на стандартный вывод оболочки сервера).
Когда я работаю в интерактивном режиме, все в порядке, но когда я запускаю сценарий, я получаю успех при подключении к своему серверу и выполнении всех основных команд оболочки на этом сервере (пример: ls, pwd и т. д.), но я не могу запустить какие-либо команды для процесса, который выполняется внутри этого сервера.

Как я могу исправить эту проблему?

1 Ответ

0 голосов
/ 02 апреля 2019

Канал SSH «exec» (который используется SSHClient.exec_command) выполняет каждую команду в отдельной оболочке. Как следствие:

  1. cd /opt/process/bin/ никак не повлияет на ./process_cli.
  2. scm будет выполняться как команда оболочки, а не как подкоманда process_cli.

Вам необходимо:

  1. Выполнить cd и process_cli как одну команду (в одной оболочке):

    stdin, stdout, stderr = client.exec_command('cd /opt/process/bin/ && ./process_cli') 
    

    или

    stdin, stdout, stderr = client.exec_command('/opt/process/bin/process_cli') 
    
  2. Подайте (под) команды process_cli на стандартный ввод:

    stdin.write('scm\n')
    stdin.flush()
    

Похожие вопросы:

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