Я пытался написать команду (сервер Solaris), которая добавляет пользователя в определенную группу. Это довольно длинная команда, поэтому я опубликую всю команду здесь, а затем разбью ее.

USER=myUser && sudo /usr/sbin/usermod -G `awk -v delim="," -F: '/[:,]'$USER'/ { groups = groups $1 delim; } END { groups = groups "myGroup"; print groups}' /etc/group` myUser

Внутренняя команда awk составляет список текущих групп, разделенных запятыми, а внешняя команда принимает этот список в параметре -G.

И awk, и usermod выдают мне синтаксические ошибки (рядом со строкой 1, но есть только одна строка), но я чувствую, что одна ошибка вызвана другой.

Есть ли здесь какие-то явные синтаксические ошибки, которые мне не хватает? Может ли это быть вызвано проблемой оболочки? В качестве отказа от ответственности я использую конструкцию && вместо точки с запятой из-за некоторых проблем обработки текста более высокого уровня, но это, по моему мнению, не должно влиять на выполнение (я проверял это).

1 ответ1

2

awk работает по-разному в Solaris - версия, доступная в /usr/bin , не поддерживает параметр -v . Используйте nawk для более POSIX-подобной версии.


Вторая проблема в том, что, как вы уже заметили, есть только одна строка. Не пытайтесь писать однострочники, если в этом нет необходимости; удобочитаемые команды легче исправить. Если вам нужно поместить команду в файл конфигурации где-нибудь - вместо этого поместите ее в сценарий .sh .

Не используйте $USER в качестве временной переменной; многие программы ожидают, что эта переменная будет содержать ваше имя для входа. Вместо этого выберите что-то вроде $user .

Не разбирайте /etc/group когда есть инструменты, которые делают это за вас, например, groups . (В дополнение к упрощению кода они также работают с нелокальными учетными записями.)

#!/bin/sh
user=myUser
group=myGroup
oldgroups=$(groups "$user" | sed "y/ /,/")
usermod -G "$oldgroups,$group" "$user"

или если вы настаиваете

user=myUser && sudo usermod -G "$(groups "$user" | sed "y/ /,/"),myGroup" "$user"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .