
Я вошел в среду UNIX как пользователь user1, в этой среде у меня есть скрипт оболочки, содержащий некоторую задачу, которую необходимо выполнить по другому пути с другим пользователем, например user2, поскольку у user1 нет доступа к этому пути.
Я хочу переключиться на пользователя user2 с пользователя user1 в скрипте оболочки для выполнения этой задачи, а после завершения задачи я хочу снова переключиться на пользователя user1 с пользователя user2.
Пожалуйста, предложите, как мне реализовать этот сценарий.
Я вызываю скрипт оболочки с помощью Java, так что если у вас есть другой способ, пожалуйста, предложите.
решение1
Вы можете добиться желаемого с помощью sudo
: вы можете разрешить пользователю user2 выполнить скрипт, который ему нужен как пользователю user1, разрешивтолькоэтот скрипт будет выполнен, тем самым сохраняя безопасность вашей системы (пользователь 2 не может выйти из-под контроля и использовать оболочку как пользователь 1). Вы можете сделать это следующим образом:
sudo visudo
(для редактирования файла конфигурации sudo)- Добавьте это в конец файла:
user2 ALL = (user1) NOPASSWD:/path/to/your/script.sh
- Сохраните и закройте файл.
Теперь, если вы откроете оболочку как user2, вы можете использовать sudo -u user1 /path/to/your/script.sh
ее для выполнения как user1; вы можете использовать эту же самую команду из java. Безопасность сохраняется, так как user2 не может выполнить оболочку как user1: sudo -u user1 bash
будет отклонено.
Однако, я думаю, что более чистое решение можно было бы получить, просто создав группу, которую будут совместно использовать user1 и user2, и используя эту группу для управления разрешением на выполнение файла. В зависимости от ваших требований, вы также можете рассмотреть ACL или бит setuid (например chmod 4700 /path/to/your/script.sh
), если ожидается, что больше пользователей будут выполнять этот скрипт как user1.
решение2
Я предполагаю, что у пользователя user1 нет доступа к sudo без пароля, верно? Если есть, то можно использовать команду runuser.
runuser -l user2 -c 'whoami'
Если у вас настроены права sudo, вы можете просто использовать su/sudo.
su - user2 -c 'whoami'
Однако я предполагаю, что у вас нет беспарольного sudo и/или у вас может не быть пароля для user2. Вы можете усложнить задачу, сгенерировав пару ключей RSA для user1, а затем добавив ключ id_rsa.pub в файл $HOME/.ssh/authorized_keys пользователя user2, чтобы включить аутентификацию с открытым ключом RSA, а затем использовать SSH, чтобы сделать это без пароля.
Как пользователь user1 выполните следующее: ssh keygen Просто нажмите Enter в подсказках. Затем выполните следующее, чтобы автоматически добавить ключ (вы можете сделать это вручную). Если вы используете эту команду, вам понадобится пароль пользователя user2 только в первый раз.
ssh-copy-id -i $HOME/.ssh/id_rsa.pub user2@hostname
Если это сработает, вы сможете войти как user1, а затем запустить ssh user2@localhost, чтобы войти как user2 без пароля. Убедитесь, что в /etc/ssh/sshd_config на сервере включена аутентификация PublicKey.
Затем для удаленного выполнения команды можно запустить что-то вроде:
ssh user2@localhost "удаленная-команда1;удаленная-команда2"