Почему жестко запрограммированная строка var изменяется, когда скрипт bash запускается от имени пользователя root? - PullRequest
0 голосов
/ 26 августа 2009

Я выполняю пакетное преобразование некоторых изображений с помощью быстрого и грязного сценария bash, используя ufraw:

IFS=$'\n'
PICS="/media/disk/kevin/Images/";
for pic in $(find $PICS -name "*CR2");
do
    ufraw-batch $pic --out-type jpg --size=2048 --overwrite --out-path=$PICS;
    rm -f $pic
done;
IFS=" ";

Он работает нормально с обычными правами, но если я запускаю его с:

sudo ./convert.sh

Я получил эту странную ошибку:

find: "/media/disk/kevi" : no such file or directory.

Я сделал это:

IFS=$'\n'
PICS="/media/disk/kevin/Images/";
echo PICS;

Тогда я получил удивительно:

/media/disk/kevi /Images/

WTF?

Ответы [ 3 ]

3 голосов
/ 26 августа 2009

Вы заканчиваете с $IFS, являющимся "n"; это не интерпретирует \n как новую строку, а как бессмысленно сбежавший n. Я смутно подозреваю, что вы сталкиваетесь с какой-то плохо документированной защитой $IFS для root (поскольку это хорошо известный вектор эксплойтов), но вы можете попробовать встроить буквальный перевод строки вместо символического в свой скрипт ctrl - v введите .

2 голосов
/ 27 августа 2009

Если в вашем сценарии нет явной строки #!, есть вероятность, что команда sudo-ed выполняется под /bin/sh, а не /bin/bash, и, если вы работаете в недавнем Linux система, скорее всего, /bin/sh это dash, а не bash. Сопровождающие dash утверждают, что IFS не должен интерпретировать escape-последовательности (см., Например, here).

$ more convert.sh
IFS=$'\n'
PICS="/media/disk/kevin/Images/";
echo $PICS;
ps
$ ./convert.sh
/media/disk/kevin/Images/
  PID TTY          TIME CMD
30827 pts/0    00:00:01 bash
32042 pts/0    00:00:00 bash
32043 pts/0    00:00:00 ps
$ sudo ./convert.sh
/media/disk/kevi /Images/
  PID TTY          TIME CMD
32044 pts/0    00:00:00 sh
32045 pts/0    00:00:00 ps
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2009-08-06 19:10 /bin/sh -> dash

Таким образом, поведение, которое вы видите, только косвенно связано с запуском под root. Вы бы увидели то же самое, если бы вы явно использовали тире. И еще один способ обойти эту проблему - включить в свой сценарий объяснение #!/bin/bash.

0 голосов
/ 26 августа 2009

Ваш код содержит опечатку. Если фактический код IFS = '\ n' или IFS = "\ n", вы устанавливаете разделитель на список из двух символов, \ и n. Если IFS = \ n, то один символ POSIX не интерпретирует \ n как LF. Это не имеет ничего общего с root.

$ BLAH='\n'
$ echo $BLAH
\n
$ BLAH="\n"
$ echo $BLAH
\n
$ BLAH=\n
$ echo $BLAH
n
$ BLAH="Both\n\and\aregone"
$ echo $BLAH
Both   a d arego e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...