Я новичок в bash. Я написал скрипт, состоящий из множества строк и команд. Это файл установки для получения и установки нескольких пакетов. В результате мне нужно использовать множество команд установки в моем скрипте, например, эта команда:
sudo apt install python2.7 python-pip
Чтобы избежать использования слишком большого количества символов sudo
в моем скрипте, я решил удалить sudo
перед каждой командой и выполнить скрипт следующим образом sudo ./setup.sh
: .
Работает нормально, но проблема в том, что есть некоторые команды, которые на самом деле не нужны sudo
перед ними, например mkdir
, wget
и ...
Когда я запускаю свой скрипт с помощью sudo ./setup.sh
, каталоги, которые создаются с помощью этого скрипта, не могут быть удалены, скопированы или отредактированы без использования sudo
, однако я хотел, чтобы они были доступны для всех пользователей. Поэтому мой вопрос заключается в следующем:
При запуске скрипта с помощью sudo (например, sudo ./setup.sh
), есть ли способ не выполнять некоторые из его внутренних команд, например, mkdir
или wget
с привилегиями суперпользователя?
решение1
При использовании sudo
вы запускаете новую оболочку как пользователь, sudo
на которого вы указали переключиться (по умолчанию root). Это установит SUDO_USER
переменную на имя пользователя этого пользователя:
$ cat foo.sh
#!/bin/bash
echo "SUDO_USER: $SUDO_USER"
Если я запущу этот скрипт от своего имени, то ничего не получу, так как переменная не установлена:
$ foo.sh
SUDO_USER:
Но если я запущу его с помощью sudo
, переменная будет установлена:
$ sudo foo.sh
SUDO_USER: terdon
Имея это в виду, вы можете просто запустить определенные команды, которые вы хотите запустить как обычный пользователь, используя имя пользователя, запускающего скрипт. Поэтому измените свои wget
и chmod
и любые другие команды, которые вы хотите запустить как обычный пользователь в скрипте, и заставьте их запускаться с помощью sudo -u $SUDO_USER
так, чтобы они запускались как обычный пользователь, а не как root:
apt install python2.7 python-pip ## will run as root
sudo -u $SUDO_USER mkdir foo ## will run as $SUDO_USER
Использование SUDO_USER
переменной гарантирует, что все созданные вами каталоги и файлы будут принадлежать пользователю, запустившему скрипт, и вам не придется явно указывать скрипту имя этого пользователя каждый раз при его запуске.
решение2
Чтобы сделать каталоги, созданные mkdir, доступными для использования всеми пользователями, необходимо изменить права доступа на WORLD (чтение/запись) с помощью команды chmod.
В скрипте после выполнения mkdir
используйте следующую команду:
chmod -R 755 «directory-name»
(Чтение доступно всем, запись доступна только пользователю root)
или
chmod -R 777 «directory-name»
(Все пользователи системы могут читать и записывать)
Для wget
используйте chmod
команду после загрузки.
ИЛИ
Если вы все же хотите выполнить команду от имени другого пользователя, используйте команду su:
su - «username» -c 'command to be executed'