Я создал файл .screenrc для автоматической настройки различных окон при запуске screen . В одном окне я бы хотел: переключиться на пользователя root, а затем перейти в определенный каталог. В настоящее время я делаю это вручную после создания нового окна экрана следующим образом:

  • sudo bash
  • cd /etc/[dir]/

Как я могу повторить это в .screenrc? В другом месте я читал, что для запуска нескольких команд в одной строке вы можете использовать && , но я не могу заставить его работать с sudo bash (предположительно потому, что он создает новый экземпляр bash и поэтому остальные команды либо игнорируется или запускается в новом экземпляре, а затем завершается).

1 ответ1

1

(предположительно потому что он создает новый экземпляр bash

Да, то же самое происходит практически со всеми механизмами переключения пользователей (su , sudo -s и т.д.), Но ваш вариант делает совершенно очевидным, что запускается новый процесс bash .

и поэтому остальные команды либо игнорируются, либо запускаются в новом экземпляре, а затем завершаются).

Нет, родительская оболочка просто ожидает выхода sudo и, следовательно, нового экземпляра bash. (Как это было бы с любой другой командой.)

  • Основная оболочка запускает sudo bash и ожидает его выхода.
    • sudo запускает bash и ждет его выхода.
      • Bash дает вам интерактивное приглашение, в котором вы запускаете свои корневые команды.
      • Когда вы набираете «exit», bash выходит.
    • sudo заканчивает ожидание, убирает и выходит также.
  • Основная оболочка завершает ожидание, запускает следующую команду, если таковая имеется.

Однако вы можете указать любой оболочке выполнять команды неинтерактивно, используя опцию -c которая принимает одну командную строку: например, bash -c "cd /etc && ls" . (Это используется за кулисами ssh или su -c .)

Чтобы получить интерактивную оболочку, просто убедитесь, что последняя команда в этой подкоманде запускает интерактивную оболочку. (Это довольно много примеров bash, но это не проблема.)

sudo bash -c "cd /etc/foo && bash"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .