Я вошел в среду UNIX под пользователем user1, в этой среде у меня есть сценарий оболочки, который содержит некоторую задачу, которую нужно выполнить по другому пути с другим пользователем, скажем user2, потому что у user1 нет доступа к этому пути.
Я хочу переключиться на пользователя2 от пользователя1 в сценарии оболочки для выполнения этой задачи, и после завершения задачи я хочу снова переключиться на пользователя1 от пользователя2.
Пожалуйста, подскажите, как я могу реализовать этот сценарий.
Я вызываю shell script с помощью java, так что если у вас есть другой способ, пожалуйста, предложите
Я предполагаю, что у пользователя user1 нет пароля -less доступ к sudo, правильно? Если это так, вы можете использовать команду runuser.
runuser -l user2 -c 'whoami'
Вы можете просто использовать su / sudo, если у вас настроены разрешения sudo.
su - user2 -c 'whoami'
Однако я предполагаю, что у вас нет sudo без пароля и / или у вас может не быть пароля для пользователя user2. Вы можете сделать сложную задачу, сгенерировав пару ключей RSA для пользователя user1, а затем добавив ключ id_rsa.pub в файл $ HOME / .ssh / authorized_keys пользователя2, чтобы включить аутентификацию с открытым ключом RSA, а затем использовать SSH, чтобы сделать это без пароля.
От имени пользователя user1 выполните следующее: ssh keygen Просто нажмите клавишу ввода в запросах Затем выполните следующее, чтобы добавить ключ автоматически (вы можете сделать это вручную, чтобы). Если вы используете эту команду, вам понадобится пароль пользователя 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 "remote-command1; remote-command2"
Вы можете добиться желаемого с помощью sudo
: вы можете разрешить пользователю user2 выполнять нужный ему сценарий как user1, разрешив только этот скрипт должен быть выполнен, таким образом сохраняя безопасность вашей системы (пользователь2 не может пойти на мошенничество и использовать оболочку как пользователь1). Вы можете сделать это:
sudo visudo
(для редактирования файла конфигурации sudo) user2 ALL = (user1) NOPASSWD: / path / to / ваш / script.sh
Теперь, если вы откроете оболочку как user2, вы можете использовать sudo -u user1 /path/to/your/script.sh
, чтобы запустить ее как user1; вы можете использовать ту же команду из java. Безопасность сохраняется, поскольку пользователь 2 не может запускать оболочку как пользователь 1: sudo -u user1 bash
будет отклонено.
Однако , я думаю, что более четкое решение может быть достигнуто путем простого создания группы, которую будут совместно использовать user1 и user2, и использования этой группы для управления разрешениями на выполнение для файла. В зависимости от ваших требований вы также можете рассмотреть ACL или бит setuid (например, chmod 4700 /path/to/your/script.sh
), если ожидается, что больше пользователей будут выполнять этот скрипт как user1.