当bash脚本以root身份运行时,为什么硬编码字符串var会发生变化?

时间:2009-08-26 17:18:12

标签: bash path

我使用ufraw:

使用快速脏的bash脚本批量转换一些图片
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 个答案:

答案 0 :(得分:3)

你结束了$IFS "n";它不是将\n解释为换行符,而是将其无意义地转义n。我隐约怀疑你是否正在为$IFS根目录进行某种记录不明的保护(因为它是一个众所周知的漏洞利用向量),但你可能想尝试在你的文件中嵌入一个文字换行符而不是符号符号。脚本使用 ctrl - v 输入

答案 1 :(得分:2)

如果您的脚本中没有明确的#!行,那么sudo-ed命令可能会在/bin/sh而不是/bin/bash下运行,如果您'在最近的Linux系统上重新运行,/bin/sh可能是dash而不是bash。破坏者的维护者认为IFS不应该解释转义序列(例如,参见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

答案 2 :(得分:0)

您的代码似乎有拼写错误。如果实际代码是IFS ='\ n'或IFS =“\ n”,则将分隔符设置为两个字符的列表,\和n。如果IFS = \ n,那么一个char A POSIX shell不会将\ 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