Проблема с командой spawn в сценарии ожидания

Я не согласен с частью другого ответа: создание портов с помощью iself категорически не всегда вызывает sudo ( или doas) и должны выполняться обычным (выделенным) пользователем. Только некоторые из целей make, например те, которые устанавливают или удаляют порты, например make install , будут вызывать программу SUDO , если она была указана в /etc/mk.conf или в среде. Причина упоминания этого параметра в руководстве - для массовых сборок с dpb (1).


Причина, по которой эта строка существует, является обратной совместимостью с файлом OpenBSD по умолчанию sudoers , как упоминается в сообщении фиксации :

CVSROOT:        /cvs
Module name:    src
Changes by:     reyk@cvs.openbsd.org     2015/08/28 07:19:50

Modified files:
        usr.bin/doas   : doas.conf.5 

Log message:
Document an example that lets root run unrestricted doas commands as
root ("permit nopass keepenv root as root"), matching the old
behaviour from OpenBSD's sudoers file ("root ALL=(ALL) SETENV: ALL").

OK sthen@

Почему это полезно? Представьте себе сценарий, который выполняет некоторые действия, требующие привилегий root, примерно так:

#!/bin/sh
cmd1
doas cmd2
cmd3

Вы можете успешно запустить этот сценарий только как пользователь, имеющий разрешение на использование doas.По умолчанию ни один пользователь - даже не root - не имеет права использовать doas; вы должны явно указать это, добавив правила в /etc/doas.conf . Без строки разрешить root как root приведенный выше сценарий завершится ошибкой, если вы запустите это как root, что, наверное, удивительно и неудобно.

Теперь переходит к той части, где я согласен с другим ответом: как упоминалось выше, скрипты сборки по умолчанию в OpenBSD имеют переменную SUDO , которую вы можете установить на sudo или ] doas для повышения привилегий. Если какая-либо команда выполняется под $ SUDO , вы хотите сохранить переменные среды, такие как префиксы каталогов и другие вещи, необходимые системе сборки для правильной работы.


Еще одна вещь: обратите внимание, что только первый большой пример в цитируемом отрывке из руководства предназначен для создания портов. Прочтите цитируемый текст в виде маркированного списка с четырьмя независимыми элементами:

Следующий пример

  • разрешает пользователям в группе wsrc создавать порты;
  • wheel выполнять команды от имени любого пользователя, сохраняя при этом переменные среды PS1 и SSH_AUTH_SOCK и отключение ENV;
  • позволяет tedu запускать procmap от имени пользователя root без пароля;
  • дополнительно разрешает пользователю root запускать неограниченные команды от своего имени.

Очевидно, что пример с procmap не имеет ничего общего со сборкой портов, а второй пример - это обычная вещь, когда членам группы wheel разрешено повышать привилегии до root (например, через su, sudo или doas).

Зачем вам это нужно? Ну, некоторые скрипты или make-файлы содержат переменную SUDO.По умолчанию ни один пользователь не имеет права использовать doas. Вы должны явно согласиться, добавив правила в /etc/doas.conf .

2
14.08.2016, 21:52
2 ответа
  • send - для отправки строк процессу
  • expect - ожидание определенной строки от процесса
  • spawn - для запуска команды

Вы должны закрыть все команда, которая запускает запуск, иначе она будет читать ее как строку.

Ваш ожидаемый сценарий должен выглядеть следующим образом с использованием EOF:

#!/usr/bin/expect -f
spawn ssh 10.10.80.1
expect EOF
2
27.01.2020, 21:56

Проблема в том, что expect запускает вашу команду spawn, которая запускает apt-get , затем expect доходит до конца скрипта и поэтому останавливается, а apt-get уничтожается сигналом SIGHUP.

По крайней мере, вы должны добавить еще одну строку

expect eof

в свой сценарий, чтобы ожидал чтения от порожденной команды до тех пор, пока она не получит конец файла.

3
27.01.2020, 21:56

Теги

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