Вопрос или проблема
Я хотел бы создать псевдоним, который делал бы что-то похожее на это:
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"'
Данный алиас выполнит следующие действия:
- Переключится на пользователя
userYYY
. - Изменит текущую директорию на
/a/path/that/only/userYYY/has/access
. - Запустит новую сессию 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
.
Заключение
Каждый из предложенных способов имеет свои преимущества и недостатки в зависимости от ваших требований к безопасности и удобству. Выберите тот метод, который лучше всего соответствует вашей рабочей среде и политикам безопасности. Это поможет вам минимизировать ввод команд и упростить работу с системой.