Выполнить команду / скрипт, используя другую оболочку в SSH / Paramiko - PullRequest
0 голосов
/ 25 июня 2018

Я довольно новичок в Linux и Paramiko, но проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я пытаюсь изменить оболочку, зависает удаленный сеанс Paramiko.

Удаленный хост по умолчанию /etc/csh Я запускаю различные скрипты, некоторые требуют csh, а другие требуют bash. Любой из моих сценариев, работающих в csh, работает правильно, поскольку удаленный хост по умолчанию находится в csh.

Для запуска других скриптов мне нужно быть в bash. Всякий раз, когда я пытаюсь изменить оболочку, используя bash или /bin/bash, соединение paramiko просто зависает. Я использую следующую команду для проверки оболочек до подключения и после попытки временно изменить оболочку, чтобы увидеть, что работает, но ничего не происходит. Это использует Paramiko и Python 3.6.5 . Примечание: это также не помогает; если я по умолчанию установлю удаленный хост bash, он не сможет переключиться на csh

main.py

connection = SSH.SSH(hostname, username, password)
connection.changeShell('echo $0 ; echo $shell; /bin/bash ; echo $shell ; echo $0')

Это также было опробовано как bash и chsh

SSH.py

class SSH:
    client = None

    def __init__(self, address, username, password):
        print("Login info sent.")
        print("Connecting to server.")
        self.client = client.SSHClient()    # Create a new SSH client
        self.client.set_missing_host_key_policy(client.AutoAddPolicy())
        self.client.connect(address, username=username,
                password=password, look_for_keys=False) # connect

    def changeShell(self, command):
        print("Sending your command")
        # Check in connection is made previously
        if (self.client):
            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
                    alldata = stdout.channel.recv(2048)
                    while stdout.channel.recv_ready():
                        # Retrieve the next 1024 bytes
                        alldata += stdout.channel.recv(2048)

                    # Print as string with utf8 encoding
                    print(str(alldata, "utf8"))

            stdin.close()
            stdout.close()
            stderr.close()

        else:
            print("Connection not opened.")

1 Ответ

0 голосов
/ 25 июня 2018

Ваш вопрос не имеет ничего общего с Paramiko.Попробуйте вставить свою команду в SSH-терминал - она ​​также не будет работать.


Синтаксис aaa ; bbb выполняет команды одну после другую.bbb не будет выполнено, пока не закончится aaa.Точно так же, /bin/bash ; echo $shell выполняет bash, и echo не будет выполняться до тех пор, пока не завершится bash, чего не происходит, отсюда и зависание.

Вы на самом деле не хотите выполнять echo после bash - вы хотите выполнить echo в bash.

Если вы хотите выполнить скрипт / команды в другой оболочке, выесть три варианта:

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