加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

转义bash函数参数以供su -c使用

发布时间:2020-12-15 22:13:30 所属栏目:安全 来源:网络整理
导读:我希望能够编写一个函数su_mt_user(当前)看起来像这样: su_mt_user() { su someuser -c "$*"} 目标是能够像这样使用它: su_mt_user mt-auth --stuff etc 哪个将以用户someuser运行命令mt-auth -stuff等.当前版本适用于此特定命令,但对于以下命令失败: som
我希望能够编写一个函数su_mt_user(当前)看起来像这样:

su_mt_user() {
    su someuser -c "$*"
}

目标是能够像这样使用它:

su_mt_user mt-auth --stuff etc

哪个将以用户someuser运行命令mt-auth -stuff等.当前版本适用于此特定命令,但对于以下命令失败:

some_filename_with_spaces="/home/user/hello there i like spaces in filenames.txt"
su_mt_user stat "$some_filename_with_spaces"

此操作失败,并出现以下错误:

stat: cannot stat '/home/user/hello': No such file or directory
stat: cannot stat 'there': No such file or directory
stat: cannot stat 'i': No such file or directory
stat: cannot stat 'like': No such file or directory
stat: cannot stat 'spaces': No such file or directory
stat: cannot stat 'in': No such file or directory
stat: cannot stat 'filenames.txt': No such file or directory

我假设发生此错误是因为即使$some_filename_with_spaces作为一个参数正确传递给su_mt_user函数,该函数也会将其扩展为带有“$*”的多个参数.

我也试过这个,试错了:

su_mt_user() {
    su someuser -c "$0 $@"
}

但那也失败了(/usr/bin/stat:无法执行二进制文件(什么?))

当然,stat“$some_filename_with_spaces”可以从当前用户和someuser用户按预期工作.

这看起来像是需要做一些逃避,但是bash知道如何做到这一点吗?是否需要手动替代?如果是这样,哪些角色需要转义?

解决方法

要通过函数将多个参数传递给命令,需要“$@”. “$@”的特殊之处在于即使它在双引号之间,单独的参数也以不同的词结尾,所以它们完全按原样传递.这与带有引号的$@或$*不同,后者会将每个参数拆分为包含空格并将每个结果单词解释为glob模式,并从“$*”中将所有参数合并为一个带有空格的单个参数.之间.

还有一个额外的皱纹,因为su不直接吃掉论点,它们通过一个shell. su的非选项参数作为参数传递给sh -c,然后您需要为-c提供适当的命令.

su_mt_user() {
    su someuser -c '"$0" "$@"' -- "$@"
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读