Проблема находится в команде echo $line
. С тех пор вокруг нет никаких кавычек $line
, оболочка выполняет разделение слова на нем, затем интерпретирует каждое слово как globbing шаблон. Испытайте его с
a='*.txt foo'
ls $a
В Вашем случае вкладки разделяют слова, которые затем становятся отдельными аргументами echo
. echo
управляйте печатает его аргументы, разделенные пространством. Так cut
заканчивает тем, что получил разграниченные пространством поля вместо разграниченных вкладкой полей.
Всегда помещайте двойные кавычки вокруг подстановок переменных $foo
и замены команды $(foo)
(если Вы не понимаете, почему необходимо пропустить их и почему нормально делать так). echo "$line"
работал бы здесь, но это - сложный способ сделать то, что Вы предлагаете.
Сохраняя Ваш подход парсинга в оболочке, можно сделать read
управляйте анализируют вход в поля.
while read DB USER PASS; do
echo "DB=$DB USER=$USER PASS=$PASS"
done <users.txt
read
поля разделений, разделенные символами в значении IFS
переменная, которая состоит из пространства и вкладки (плюс новая строка, которая не может произойти в строке), по умолчанию. Для разделения только во вкладках установить IFS
к единственной вкладке сначала. Обратите внимание, что, ведя и запаздывая вкладки проигнорированы и последовательное количество вкладок как единственное.
read
обработки \
как специальный символ: проигнорирована обратная косая черта, сопровождаемая новой строкой; \\
становится единственной обратной косой чертой. Если Вы хотите избежать этого поведения, передайте -r
опция.
Объяснение является довольно раздражающим: сам удар является причиной. strace
наш друг (должен быть сам корень SUID, чтобы это работало):
getuid() = 1000
getgid() = 1001
geteuid() = 0
getegid() = 1001
setuid(1000) = 0
setgid(1001) = 0
удар обнаруживает, что был запущен корень SUID (UID! =EUID) и использование его корневое питание выбросить это питание, сбрасывая EUID к UID. И позже даже FSUID, только чтобы быть уверенным...:
getuid() = 1000
setfsuid(1000) = 1000
getgid() = 1001
setfsgid(1001) = 1001
В конце: никакой шанс. Необходимо запустить удар с корня UID (т.е. sudo).
Редактирование 1
В странице справочника говорится это:
Если оболочка запускается с эффективного пользователя (группа) идентификатор, не равный реальному пользователю (группа) идентификатор, и-p опция не предоставляется, никакие файлы запуска не читаются, окружают функции, не наследованы от среды, SHELLOPTS, BASHOPTS, CDPATH, и переменные GLOBIGNORE, если они появляются в среде, проигнорированы, и эффективный идентификатор пользователя установлен на идентификатор реального пользователя. Если-p опция предоставляется при вызове, поведение запуска является тем же, но эффективный идентификатор пользователя не сбрасывается.
Но это не работает на меня. -p
даже не упоминается среди опций запуска. Я также попробовал --posix
; не работал также.
В любом случае корневая программа SUID не работает со средой корня ($HOME
, конфигурация для оболочки, безотносительно), это работает с корневыми полномочиями (т.е. она может удалить любой файл, изменить любые полномочия, и т.д.).