как переключиться на другого пользователя с паролем в скрипте оболочки

как переключиться на другого пользователя с паролем в скрипте оболочки

Я вошел в среду UNIX как пользователь user1, в этой среде у меня есть скрипт оболочки, содержащий некоторую задачу, которую необходимо выполнить по другому пути с другим пользователем, например user2, поскольку у user1 нет доступа к этому пути.

Я хочу переключиться на пользователя user2 с пользователя user1 в скрипте оболочки для выполнения этой задачи, а после завершения задачи я хочу снова переключиться на пользователя user1 с пользователя user2.

Пожалуйста, предложите, как мне реализовать этот сценарий.

Я вызываю скрипт оболочки с помощью Java, так что если у вас есть другой способ, пожалуйста, предложите.

решение1

Вы можете добиться желаемого с помощью sudo: вы можете разрешить пользователю user2 выполнить скрипт, который ему нужен как пользователю user1, разрешивтолькоэтот скрипт будет выполнен, тем самым сохраняя безопасность вашей системы (пользователь 2 не может выйти из-под контроля и использовать оболочку как пользователь 1). Вы можете сделать это следующим образом:

  1. sudo visudo(для редактирования файла конфигурации sudo)
  2. Добавьте это в конец файла:user2 ALL = (user1) NOPASSWD:/path/to/your/script.sh
  3. Сохраните и закройте файл.

Теперь, если вы откроете оболочку как 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"

Связанный контент