Как я могу использовать RobotFramework для sudo в сеансе ssh, где команда sudo не требует пароля?

#python-3.x #ssh #robotframework #sudo #paramiko

#python-3.x #ssh #robotframework #sudo #парамико

Вопрос:

Я пытаюсь автоматизировать программу, в которой я вхожу в сеанс ssh с именем пользователя и паролем, затем мне требуется выполнить sudo su — «username» без пароля. Я могу войти в сеанс ssh без каких-либо проблем, но я не могу заставить команду sudo работать. Просматривая документы робота, вы должны иметь возможность указать none для пароля, если пароля нет, но, похоже, это просто приводит к зависанию программы, как будто она ожидает ввода пароля. Команда, которую я пытался использовать, такова.

 Execute Command    su - "username"    sudo=True    sudo_password=None
  

Я не уверен, является ли это ошибкой с Robot Framework или просто требуется, чтобы пароль работал правильно. Я написал интерактивный ssh с использованием C, где кто-то мог вручную ввести команду sudo su, после чего автоматизация продолжится. Если у кого-нибудь есть какие-либо предложения по команде robot или как возможно выполнить это с помощью paramiko, я могу импортировать эту библиотеку. Другая моя мысль заключалась в том, что если я смогу заставить программу C работать с robotframework, тогда я смогу это использовать. Спасибо за любые предложения.

Ответ №1:

Я не думаю, что это ошибка в Robot Framework. Так работает оболочка в Linux и не имеет ничего общего с sudo_password=None .
Я далек от эксперта, объясняющего эти вещи.
Однако платформа Robot Framework SSHLibrary использует paramiko exec_command для выполнения команды.
И, как описано в документации, Execute Command всегда будет выполняться в новой оболочке, которая затем закрывается.
SSHLibrary Doc — Выполнить команду

Давайте попробуем запустить это вручную в командной строке.
ssh <login_user>@<server_ip> sudo su - <the_su_username>
Команда не даст никакого ответа и зависнет, так же, как это будет делать в Robot Framework, а также в Paramiko.

Если мы вместо этого выполним команду, которая даст ответ, она будет работать.
ssh <login_user>@<server_ip> sudo ls -ltr
Это будет работать и в robot framework, если вы попытаетесь.
Execute Command ls -ltr sudo=True sudo_password=None

Как вы говорите, это работает, если вы используете интерактивную реализацию на C.
Я рекомендую вам также попробовать реализовать использование интерактивной оболочки в Robot Framework.
Это приведет к запуску нескольких команд в одной оболочке.

Вы можете найти более подробную информацию здесь, как использовать Write и Read .

Комментарии:

1. Хорошо, итак, я смог заставить команду записи с помощью sudo su на самом деле работать, и я думаю, что b / c я использовал приглашение и читал до приглашения. Я могу загрузить файл, оставаясь на канале 1. Следующий шаг, который я не понимаю, — это почему я могу запустить «запись cd ….» и перейти в правильный каталог, но затем, когда я использую команду «Write . /somescript.sh » и верните результат, который он просто возвращаеткоманда, и, похоже, ничего не происходит.

2. Нужна ли для записи вторая команда после нее. В документации говорится, что она добавляет новую строку, которую я бы приравнял к нажатию кнопки возврата после сценария .sh. Я попытался добавить n и r за ним, но, похоже, это только добавляет черную линию и ничего не выполняет. Есть идеи.

3. Вы правы, не должно быть необходимости добавлять новую строку по Write умолчанию. Интересно, печатает ли ваш скрипт символ подсказки. В этом случае Read Until Prompt будет считываться только этот символ и ничего после. Вы могли бы попробовать вместо этого использовать чтение с задержкой, задержкой до тех пор, пока не будет запущен ожидаемый скрипт. Чтобы увидеть, получаете ли вы ожидаемый результат от скрипта. ${output}= Read delay=<your expected execution time for script> s

4. Для временной отладки вы также можете добавить окончательное сообщение для печати в свой скрипт, например script execution successful . А затем пользователь Read Until script execution successful , чтобы убедиться, что скрипт успешно выполнен и что вы получаете ожидаемый результат.