是否可以“保护” IFS字符以防止字段分裂?

muru

在POSIX sh或Bourne shell(如Solaris 10的/bin/sh)中,可能具有以下内容:

a='some var with spaces and a special space'
printf "%s\n" $a

并且,使用默认值IFS,获取:

some
var
with
spaces
and
a
special space

也就是说,保护之间的空间special,并space通过引用或逃逸的某种组合?

输入的字数a事先未知,或者我会尝试类似的方法:

a='some var with spaces and a special\ space'
printf "%s\n" "$a" | while read field1 field2 ...

上下文是在Cassandra中报告的此错误,其中OP尝试设置环境变量以指定JVM的选项:

export JVM_EXTRA_OPTS='-XX:OnOutOfMemoryError="echo oh_no"'

在执行Cassandra的脚本中,该脚本必须支持POSIX sh和Solaris sh:

JVM_OPTS="$JVM_OPTS $JVM_EXTRA_OPTS"
#...
exec $NUMACTL "$JAVA" $JVM_OPTS $cassandra_parms -cp "$CLASSPATH" $props "$class"

IMO唯一的解决方法是使用包装echo oh_no命令的脚本还有另一种方法吗?

吉勒斯“别再邪恶了”

并不真地。

一种解决方案是保留字符作为字段分隔符。显然,不可能在选项中包括该字符。如果源语言易于插入,Tab和换行符是很明显的候选者。如果您希望具有可移植性,则应避免使用多字节字符(例如,破折号和BusyBox不支持多字节字符)。

如果您依赖IFS拆分,请不要忘记使用关闭通配符扩展set -f

tab=$(printf '\t')
IFS=$tab
set -f
exec java $JVM_EXTRA_OPTS …

另一种方法是引入引号语法。一个非常常见的引用语法是反斜杠保护下一个字符。使用反斜杠的不利之处在于,有许多不同的工具将其用作引号字符,有时可能很难弄清您需要多少个反斜杠。

set java
eval 'set -- "$@"' $(printf '%s\n' "$JVM_EXTRA_OPTS" | sed -e 's/[^ ]/\\&/g' -e 's/\\\\/\\/g') …
exec "$@"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以防止 J48 分类器在同一字段上分裂超过 x 次吗?

是否可以防止ReplicaSet扩大/缩小?

是否可以防止Javascript中的popstate?

是否可以防止Trim()删除空格?

Doctrinepersist()是否可以防止SQL注入?

Git是否可以防止数据降级

Querydsl 是否可以防止 SQL 注入

外部引用结构中的字段是否可以防止对该结构进行垃圾回收?

是否可以防止CSS中带连字符的单词之间出现换行符?

PetaPoco的Query(字符串查询,参数)方法是否可以防止SQL注入?

安全性:shell脚本可以重置IFS变量以防止滥用?

C#字符串参数可以防止注入?

有什么方法可以防止/保护方法在配置更改期间不会中断?

密码保护文件夹可以防止勒索软件吗?

休眠状态下是否提供保护以防止数据丢失?

单个令牌是否可以防止RESTful API中的csrf?

Spring中的SimpleJdbcTemplate是否可以防止SQL注入?

是否可以防止用户在后台运行C ++程序?

是否可以防止Windows 10 uwp中的锁定屏幕?

是否可以防止从冻结的python数据类读取?

私人浏览是否可以防止套接字事件?

“ NOT NULL”是否可以防止rowid混叠?

持有C ++参考是否可以防止变量被破坏?

Knex.js是否可以防止SQL注入?

规范的LINQ查询是否可以防止N + 1

是否可以防止从共享URL中剥离查询参数?

ACPI损坏的电池是否可以防止过度充电?

Spring Data JPA是否可以防止SQL注入

是否可以防止在每个HTTP请求中发送cookie?