MateoGlowinski Ответов: 1

Python fabric - run метод не завершается


всем привет,
Я подготовил фрагмент кода, который намеревается войти в систему как пользователь root.
Я не могу использовать метод "sudo", потому что он не существует в системе, которую я хочу контролировать, и ведение журнала непосредственно как "root" невозможно. Моя идея состоит в том, чтобы войти в систему как пользователь "admin", а затем использовать команду "su", чтобы переключиться на пользователя "root".

Раздел ниже содержит код, который почти работает для меня. Есть идеи, как это решить? Заранее спасибо:)

Что я уже пробовал:

Мое окружение:
Питон 3.7
Ткань 2.4.0

Код:
from fabric import Connection
from invoke import Responder

sudopass = Responder(pattern=r'Password:', response='adminPassword\n')

with Connection('192.168.0.106', user="admin", port=22, connect_kwargs={"password": "admin"}) as dss:
    command = "uname -s"
    print("Response on {} is: {}".format(command, dss.run(command)))
    command = "whoami"
    print("Response on {} is: {}".format(command, dss.run(command)))
    command = "su"
    print("Response on {} is after executing su command: {}".format(command,
                                                                    dss.run(command, pty=True, watchers=[sudopass])))
    command = "whoami"
    print("Response on {} is: {}".format(command, dss.run(command)))
print("Script end")


Выход:
Linux
Response on uname -s is: Command exited with status 0.
=== stdout ===
Linux

(no stderr)
dssadmin
Response on whoami is: Command exited with status 0.
=== stdout ===
dssadmin

(no stderr)
Password: 
/home/dssadmin # 


Как видите, скрипт застрял после отправки команды "su".

Richard MacCutchan

Вам нужно поговорить с владельцем системы Linux. Возможно, существуют ограничения на использование Су.

MateoGlowinski

Нет, их нет. Это версия linux, подготовленная нашей компанией, которая не включает команду sudo

Member 14102755

ExcelR предлагает бизнес-аналитику / Data Scientist Course / Data Analytics Training & Data Science Course Training в Бангалоре, со 100% размещением.<a href="https://www.excelr.com/business-analytics-training-in-bangalore/”>сертификация науки о данных в Бангалоре

Member 14102755

ExcelR предлагает бизнес-аналитику / Data Scientist Course / Data Analytics Training & Data Science Course Training в Бангалоре, со 100% размещением.<a href="https://www.excelr.com/business-analytics-training-in-bangalore/”>обучение науке о данных в Бангалоре

1 Ответов

Рейтинг:
0

MateoGlowinski

Я нашел решение:

sudopass = Responder(pattern=r'Password:', response='admin__password\n')

def su(connection, command) -> int:
    return connection.run(f"su -c '{command}'", pty=True, watchers=[sudopass])


with Connection('192.168.0.106', user="dssadmin", port=22, connect_kwargs={"password": "password"}) as ssh_connection:
    command = "uname -s"
    print("Response on {} is: {}".format(command, ssh_connection.run(command)))
    command = "whoami"
    print("Response on {} is: {}".format(command, ssh_connection.run(command)))
    command = "opkg update"
    print("Response on {} is after executing su command: {}".format(command, su(ssh_connection, command)))
   command = "opkg install rescue-utils"
    print("Response on {} is after executing su command: {}".format(command, su(ssh_connection, command)))
    command = "whoami"
    print("Response on {} is: {}".format(command, su(dss, command)))
print("Script end")