Скрипт на shell

30.07.2018 01:54:59 Просмотров 19 Источник

Написал небольшой скрипт(еще не дописан) на shell, но он некорректно работает. Вот код:

#!/bin/sh
#перейти на root
echo "Enter password for user root"
su root
if [ "$(id -u)" == "0" ]; then
    echo 'Вы вошли под пользователем root'
    #создание каталога /s и переход в него
    if [ -d /s ]; then
            echo 'Директория /s существует'
    else
            echo 'Отсутствие директории /s'
            mkdir s
            echo 'Create directory s'
    fi
    #создание каталога /proj
    echo 'Create directiry /proj'
    mkdir s/proj
    #передача прав на папку /s/proj пользователю
    user=""
    echo 'Enter your login: '
    read user
    echo "Передача папки пользователю"
    chown -R $user s/proj
    echo 'Выход из под пользователя root '
    exit
else
    echo 'Неверный пароль'
    exit 0
fi

Он не создает папку /proj и при входе под пользователем root не выводит 'Вы вошли под пользователем root'. Что не так с этим скриптом?

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell#comment1391897_862021
@SeniorPomidor, ничего не изменилось, все так же при входе не выводит сообщение и не создается папка
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell#comment1392716_862021
первый s/proj для создания директории proj, а с командой chown мы передаем права доступа пользователю

Ответы - Скрипт на shell / Скрипт на shell

Andrey

30.07.2018 10:48:03

Самое главное:
Выполнив su root вы вышли из оболочки откуда был запущен скрипт и скрипт прервался

Ну и потом:

root_access_check ()
{
    if [[ "$(id -u)" -ne 0 ]] && grep -qv 'sudo' < <(id $UID); then
        echo 'For execute this script requires a root access.'
        eixt 1
    fi
}

1) [[ "$(id -u)" -ne 0 ]] Проверили не является пользователь root
2) grep -qv 'sudo' < <(id $UID) Проверили не состоит пользователь, от имени которого запущен скрипт, в sudo

Если и то и другое нет, вышли из скрипта
Если все ок, то дальше все команды, кроме read и echo через sudo

if [ -d /s ]; then
            echo 'Директория /s существует'
    else
            echo 'Отсутствие директории /s'
            mkdir /s
            echo 'Create directory s'
fi  

Меняем на sudo mkdir -p /s не так пафосно, зато практично ))

echo 'Enter your login: '
    read user  

Смело меняем на read -r -p 'Enter your login: ' user

else
    echo 'Неверный пароль'
    exit 0
fi

exit 0 Означает что скрипт завешен без ошибок

if [ "$(id -u)" == "0" ]; then
ИМХО корректней так:
if [ "$(id -u)" -eq 0 ]; then
Но работать будет и так и так

UPDATE
Запускаем это su -c './<script_name> "<путь_до_папки_где_хотите_создать_папку_юзеру>"'

#!/bin/bash -e
declare user_name folder_name  parrent_missing parrent_folder_path user_group

parrent_folder_path="$1"
[[ "$parrent_folder_path" ]] || parrent_folder_path='.'

[[ -d "$parrent_folder_path" ]] || parrent_missing=1

while :
do
    clear
    read -r -p 'Enter the username for which the folder is created: ' user_name
    if grep -wq "$user_name" '/etc/passwd'; then
        user_group="$(id -gn "$user_name")"
        break
    else
        echo -e "\e[31mUser $user_name is not registered.\\nPlease check your entry   and try again.\e[m"
        sleep 5
    fi
done

read -r -p 'Enter the desired folder name: ' folder_name

mkdir -p "${parrent_folder_path}/${folder_name}" && echo -e "\e[32mFolder '${parrent_folder_path}/${folder_name}' was successfully created\e[m"

[[ "${parrent_missing}" ]] && echo -e "\e[33mFolder '$parrent_folder_path' was missing, but created\e[m"

chown "${user_name}:${user_group}" "${parrent_folder_path}/${folder_name}"
exit 0

Если не указать "<путь_до_папки_где_хотите_создать_папку_юзеру>" то создаст в текущей папке

https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392422_862239
Проверяем /s, а создаём s. Разница есть? Зачем ключ -p для mkdir? Не вижу тут создания дерева подкаталогов. Shell — трудный язык программирования. Я вообще не понимаю, зачем народ в него постоянно пытается?
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392427_862239
man mkdir читаем до конца -p, --parents Создает недостающие родительские каталоги для каждого указанного каталога. Права доступа к родительским каталогам устанавливаются в значение umask, логически сложенное с 'u+wx'. Аргументы, соответствующие существующим каталогам, игнорируются. (Таким образом, если каталог /a существует, то 'mkdir /a' выдаст ошибку, а 'mkdir -p /a' -- нет.)
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392428_862239
Читайте мой комментарий до конца. Хотя бы четвёртое предложение от начала. И да, я в курсе, что такое -p у mkdir.
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392431_862239
прочитал Не вижу тут создания дерева подкаталогов Не понял к чему. mkdir -p s выполнится без ошибок вне зависимости есть каталог s или нет. Если нет создаст если нет пройдет мимо. Что и требовалоась
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392434_862239
Да всё к тому же, к ненужности ключа -p в данном конкретном случае.
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392435_862239
Ключь -p в данном случае дает отсутсвие ошибки если каталог s существует
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392708_862239
На freebsd sudo не работает
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392711_862239
Как сделать это все без команды sudo?
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392781_862239
su root -c './script-name' и да, если память не изменяет, на freebsd, sudo работает, его просто устанвить нужно.
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392887_862239
к сожалению, при установке были ошибки
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392891_862239
@AndreyKarpov, su root -c './script-name' ошибка: './script-name' команда не найдена
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392896_862239
Там должно быть название Вашего скрипта вместо script-name. И этой командой нужно скрипт запускать убрав из него проверку root. А вообще чтобы потренироваться в bash, поставьте лучше ubuntu, она подружелюбней, для этого дела
https://ru.stackoverflow.com/questions/862021/%d0%a1%d0%ba%d1%80%d0%b8%d0%bf%d1%82-%d0%bd%d0%b0-shell/862239#comment1392924_862239
@AndreyKarpov, я писал имя своего скрипта и получил эту ошибку
Закрыть X