Как я могу выполнить sudo su и сразу после этого сменить директорию?

Вопрос или проблема

Я хотел бы создать псевдоним, который делал бы что-то похожее на это:

alias userYYY='sudo su userYYY; cd /a/path/that/only/userYYY/has/access'

Таким образом, из командной строки я вошел в систему под пользователем с правами sudo, и я хотел бы ввести псевдоним userYYY, чтобы моя оболочка теперь была авторизована как userYYY, а pwd был /a/path/that/only/userYYY/has/access.

Как я могу это сделать? Этот userYYY предназначен для запуска некоторых процессов, и в его домашней директории должно быть что-то. Поэтому я попытался изменить его $HOME с помощью:

sudo usermod -m -d /a/path/that/only/userYYY/has/access userYYY 

И затем из моей оболочки с файлом sudo я выполнил sudo su userYYY. Но это не сработало. Единственное, что сработало, это sudo su -l userYYY, но это открыло новую оболочку bash внутри моей оригинальной оболочки (-bash-4.1$ ....).

В итоге, что я хочу, так это просто избежать необходимости писать 2 строки в моей оболочке:

sudo su userYYY
cd /a/path/that/only/userYYY/has/access

Есть идеи?

alias userYYY='sudo su userYYY -c "cd /a/path/that/only/userYYY/has/access; /bin/bash"'

Один из вариантов – отредактировать ~/.bashrc целевого пользователя и добавить туда cd:

cd /a/path/that/only/userYYY/has/access

Я знаю, что это немного отличается от оригинального вопроса, но идея заключается в том, чтобы выполнить команду от имени другого пользователя, не вводя пароль, когда политика запрещает sudo su <user> -c.

sudo -u userYYY -- sh -c "cd /a/path/that/only/userYYY/has/access; /bin/bash"

Короткий ответ – вы не можете. sudo su запускает новую оболочку, которая должна выйти перед тем, как дойдет до команды cd.

Для меня комбинация sudo и screen сработала:

sudo -iu vagrant screen -mS npm_install bash -c 'cd /vagrant && npm install'

Эта команда сначала переключается на пользователя vagrant. Затем как vagrant меняет директорию на /vagrant и выполняет npm install.

Ответ или решение

Для того чтобы создать алиас, который одновременно выполняет команду sudo su и переключается в нужную директорию, следует учитывать особенности работы командной строки в Unix-подобных операционных системах. Приведем несколько подходов к решению вашей задачи.

Создание Алиаса

Ваша идея создать алиас имеет смысл, однако результаты управления процессами в Unix/Linux требуют понимания того, как обрабатываются командные оболочки. Дело в том, что команда sudo su запускает новый экземпляр оболочки, и при этом выполнение последующих команд, таких как cd, не произойдет в этой новой оболочке.

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

Вариант 1: Использование sudo с -c

Вы можете создать алиас, который использует sudo с параметром -c, что позволяет передать несколько команд для выполнения в одной строке. Например:

alias userYYY='sudo su userYYY -c "cd /a/path/that/only/userYYY/has/access && exec bash"'

Данный алиас выполнит следующие действия:

  1. Переключится на пользователя userYYY.
  2. Изменит текущую директорию на /a/path/that/only/userYYY/has/access.
  3. Запустит новую сессию bash.

Однако учтите, что это решение может потребовать ввода пароля, если политика безопасности (sudoers файл) этого требует.

Вариант 2: Изменение .bashrc пользователя

Другим способом является внесение изменений в файл конфигурации оболочки целевого пользователя. Вы можете добавить команду cd в файл ~/.bashrc пользователя userYYY:

echo "cd /a/path/that/only/userYYY/has/access" >> /home/userYYY/.bashrc

Теперь, когда вы выполните вход как userYYY, он автоматически перейдет в указанную директорию.

Вариант 3: Использование sudo -u

Если вам нужно запустить команду от имени другого пользователя, не открывая новую оболочку, можно использовать sudo -u с sh:

sudo -u userYYY -- sh -c "cd /a/path/that/only/userYYY/has/access && exec bash"

Этот метод позволяет избегать необходимости вводить пароль, если такие настройки имеются в конфигурации sudoers.

Вариант 4: Использование screen или tmux

Как вариант, можно использовать терминальный мультиплексор, например, screen или tmux. Это позволит вам запускать новую сессию с нужным пользователем и в требуемой директории:

sudo -iu userYYY screen -dm bash -c 'cd /a/path/that/only/userYYY/has/access && exec bash'

Это создаст новую сессию, которая будет работать под пользователем userYYY.

Заключение

Каждый из предложенных способов имеет свои преимущества и недостатки в зависимости от ваших требований к безопасности и удобству. Выберите тот метод, который лучше всего соответствует вашей рабочей среде и политикам безопасности. Это поможет вам минимизировать ввод команд и упростить работу с системой.

Оцените материал
Добавить комментарий

Капча загружается...