Выполнение интерактивных команд в Paramiko

Неустранимая ошибка: вызов функции-члена ... на не-объект

происходит с кодом, подобным xyz->method(), где xyz не является объектом и, следовательно, method не может

Это фатальная ошибка, которая остановит сценарий (уведомление о прямой совместимости: это станет захватывающей ошибкой, начиная с PHP 7).

Чаще всего это знак что в коде отсутствуют проверки условий ошибок. Убедитесь, что объект фактически является объектом перед вызовом его методов.

Пример типичного будет

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

В приведенном выше примере запрос не может и prepare() назначит false на $statement. Попытка вызвать метод execute() приведет к Fatal Error, потому что false является «не объектом», потому что значение является логическим.

Выясните , почему ваша функция вернула логическое значение вместо объекта. Например, проверьте объект $pdo для последней произошедшей ошибки. Подробности о том, как отлаживать это, будут зависеть от того, как обрабатываются ошибки для конкретной рассматриваемой функции / объекта / класса.

Если даже сбой ->prepare не выполняется, то ваш дескриптор

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

базы данных

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

не попал в текущий объем . Найдите, где он определился. Затем передайте его как параметр, сохраните его как свойство или поделите его через глобальную область.

Другой проблемой может быть условное создание объекта, а затем попытка вызова метода вне этого условного блока. Например,

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

Пытаясь выполнить метод вне условного блока, ваш объект не может быть определен.

Вопросы, относящиеся:

37
задан shahjapan 20 December 2011 в 10:51
поделиться

3 ответа

Полное paramiko распределение поставлется с большим количеством хороших демонстрации .

В подкаталоге демонстраций, demo.py и interactive.py имеют полные интерактивные примеры TTY, которые, вероятно, были бы излишеством для Вашей ситуации.

В Вашем примере выше ssh_stdin действия как стандартный объект файла Python, таким образом ssh_stdin.write должен работать, пока канал все еще открыт.

я никогда не должен был писать в stdin, но документы предполагают, что канал закрывается, как только команда выходит, таким образом с помощью стандарта stdin.write, метод для повышения пароля, вероятно, не будет работать. Там ниже находятся на одном уровне команды paramiko на самом канале, которые дают Вам, больше управления - видит, как SSHClient.exec_command метод реализован для всех окровавленных деталей.

30
ответ дан scy 27 November 2019 в 04:53
поделиться

Я не знаком с paramiko, но это может работать:

ssh_stdin.write('input value')
ssh_stdin.flush()

Для получения информации о stdin:

http://docs.python.org/library/sys.html?highlight=stdin#sys.stdin

3
ответ дан monkut 27 November 2019 в 04:53
поделиться

Вам нужен Pexpect, чтобы получить лучшее из обоих миров (expect и ssh-оболочки).

5
ответ дан 27 November 2019 в 04:53
поделиться
Другие вопросы по тегам:

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