Как заставить runuser корректно пересылать все аргументы командной строки, вместо того, чтобы пытаться их интерпретировать? - PullRequest
0 голосов
/ 06 марта 2019

Я получил этот простой скрипт:

#!/bin/bash
SOURCE_USER=$USER
DESTINE_USER=$1

id -u $SOURCE_USER > /dev/null 2>&1

if [ "$?" == "1" ] || [ -z $SOURCE_USER ]
then
    printf "Error: Invalid source user '$SOURCE_USER'\\n"
    exit 1
fi

if [ -z $DESTINE_USER ]
then
    printf "Error: Invalid destine user '$DESTINE_USER'\\n"
    exit 1
fi

SOURCE_GROUPS=$(id -Gn ${SOURCE_USER} | sed "s/${SOURCE_USER} //g" | sed "s/ ${SOURCE_USER}//g" | sed "s/ /,/g")
SOURCE_SHELL=$(awk -F : -v name=${SOURCE_USER} '(name == $1) { print $7 }' /etc/passwd)

id -u $DESTINE_USER > /dev/null 2>&1

if [ "$?" == "1" ]
then
    printf "Creating destine user %s\\n" "$DESTINE_USER"
    useradd --groups ${SOURCE_GROUPS} --shell ${SOURCE_SHELL} --create-home ${DESTINE_USER}
    passwd ${DESTINE_USER}
    xhost '+si:localuser:$DESTINE_USER'
    sudo usermod -G "$SOURCE_USER" "$DESTINE_USER"
else
    printf "Updating destine user '%s' with groups '%s' and shell '%s'\\n" "$DESTINE_USER" "$SOURCE_GROUPS" "$SOURCE_SHELL"
    sudo usermod -a -G "$SOURCE_GROUPS" "$DESTINE_USER"
    sudo chsh -s "$SOURCE_SHELL" "$SOURCE_USER"
fi

sudo runuser sublime_vanilla -c "${@:2}"

Я запускаю это так:

$ bash run_as_user.sh sublime_vanilla /usr/bin/subl -n "./New Empty File"

Но когда я его запустил, я получил эту ошибку:

runuser: invalid option -- 'n'
Try 'runuser --help' for more information.

Но если я заменю sudo runuser sublime_vanilla -c "${@:2}" на sudo runuser sublime_vanilla -c "\"$2\" \"$3\" \"$4\" \"$5\" \"$6\" \"$7\" \"$8\" \"${@:9}\""

Затем Sublime Text правильно открывает файл "./New Empty File" в новом окне.

Как заставить runuser правильно понимать все аргументы с переменным числом аргументов командной строки, т. Е. Без жесткого кодирования "\"$2\" \"$3\" \"$4\" ..."?

1 Ответ

1 голос
/ 06 марта 2019

Это немного отличается от вашего последнего вопроса , потому что вы должны сделать разложение аргументов в одну строку для опции -c.

bash printf formatter% q ваш друг здесь:

cmd=$( printf '%q ' "${@:2}" )
sudo runuser sublime_vanilla -c "$cmd"

С другой стороны, быстрый просмотр справочной страницы runuser предлагает:

sudo runuser -u sublime_vanilla "${@:2}"

Еще одна мысль: sudo runuser -u sublime_vanilla -- "${@:2}" с двойными дефисами для обозначения конца опций runuser.

...