【问题标题】:osascript using bash variable with a spaceosascript 使用带有空格的 bash 变量
【发布时间】:2014-07-18 08:23:15
【问题描述】:

我在 Bash 中使用 osascript 通过 Apple 脚本在通知中心 (Mac OS X) 中显示消息。我正在尝试将文本变量从 Bash 传递给脚本。对于没有空格的变量,这很好用,但不适用于有空格的变量:

定义

var1="Hello"
var2="Hello World"

并使用

osascript -e 'display notification "'$var1'"'

有效,但使用

osascript -e 'display notification "'$var2'"'

产量

syntax error: Expected string but found end of script.

我需要改变什么(我是新手)?谢谢!

【问题讨论】:

    标签: bash variables syntax applescript osascript


    【解决方案1】:

    您可以尝试改用:

    osascript -e "display notification \"$var2\""
    

    或者:

    osascript -e 'display notification "'"$var2"'"'
    

    这解决了在 bash 中操作包含空格的变量的问题。但是,此解决方案不能防止 osascript 代码的注入。所以最好选择Charles Duffy's solutions之一或使用bash参数扩展:

    # if you prefer escape the doubles quotes
    osascript -e "display notification \"${var2//\"/\\\"}\""
    # or
    osascript -e 'display notification "'"${var2//\"/\\\"}"'"'
    
    # if you prefer to remove the doubles quotes
    osascript -e "display notification \"${var2//\"/}\""
    # or
    osascript -e 'display notification "'"${var2//\"/}"'"'
    

    感谢 mklement0 这个非常有用的建议!

    【讨论】:

    • ...至于“X 没有被这个答案解决”——就像任何生成允许注入错误的 SQL 的答案都应该受到人群的嘲笑一样,关于问题的答案如何正确地在 bash 和 osascript 之间进行接口实际上并没有考虑到正确/安全地使用 osascript 有很好的理由同样被拒绝。
    • @CharlesDuffy:我不知道如何在这种情况下注入代码(AppleScript 不允许在 1 行上放置多个命令;不过,一般来说,关于注射表示赞赏);但是,特别是对包含 " 的值的担忧是有效的(就破坏命令而言);这是(有点麻烦的)补救措施,使用bash 参数扩展:osascript -e "display notification \"${var2//\"/\\\"}\""
    • @IdrissNeumann,您是否会考虑采用 mklement0 的建议:使用参数扩展来转义任何双引号?如果你在页面顶部的回答完成了,我会感觉更舒服。
    • @CharlesDuffy 干得好,没想到。但是,使用 转义双引号,正如我所建议的 (${var2//\"/\\\"}),此漏洞利用将不起作用 - 或者您是否也看到了解决方法?
    • @mklement0, ...这就是为什么我要求 Idriss 采纳您的建议,而不是撤回答案。我没有立即逃避的办法,但如果我要尝试创建一个,我可能会开始研究 Unicode 字符集转换逻辑(这是一个常见的弱点),和/或阅读正式的语言规范.
    【解决方案2】:

    与尝试使用字符串连接的变体不同,此版本对注入攻击完全安全。

    osascript \
      -e "on run(argv)" \
      -e "return display notification item 1 of argv" \
      -e "end" \
      -- "$var2"
    

    ...或者,如果有人更喜欢在标准输入而不是 argv 上传递代码:

    osascript -- - "$var2" <<'EOF'
      on run(argv)
        return display notification item 1 of argv
      end
    EOF
    

    【讨论】:

    • +1 用于从命令行安全地将任意参数传递给osascript 的强大解决方案(尽管对于手头的情况可能有点矫枉过正)。
    • 感谢更强大的解决方案 - 我最终接受了另一个解决方案,因为它对于手头的情况已经足够了,预计不会有注入攻击或带有 ` 的变量。
    • 没有真正的理由使用正确、安全的代码;当你没有预料到攻击是你最容易受到攻击的时候。
    • 顺便说一句:on run argv 行有效,尽管没有将参数 - argv - 括在括号中,这在 AppleScript 处理程序中通常是必需的。这种奇怪的语法异常 - 仅适用于处理程序名称 run - 已经存在了很长时间(因此可能不会消失)。但是,非异常语法也有效:on run(argv).
    • @chepner:很好。幸运的是,那些接受的答案的变体带有转义或删除双引号应该是安全的。
    猜你喜欢
    • 2011-08-14
    • 2012-10-23
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    相关资源
    最近更新 更多