【问题标题】:shell script: single quote in executeshell脚本:执行中的单引号
【发布时间】:2012-05-24 18:49:07
【问题描述】:

我在从 shell 脚本中执行的命令中使用单引号时遇到问题。 在我的脚本中,我执行了一个 rdesktop 命令,该命令应该有 -u '' (

如果我只是 echo $command 输出很好,如果我执行它会创建奇怪的输出

这是脚本中不起作用的部分:

command="rdesktop -u "\'\'" $server"
`$command`

我也试过直接执行:

`rdesktop -u "\'\'" $server`

我将不胜感激,因为我阅读了很多关于在 shell 脚本中转义字符的教程,但没有找到解决方案..

编辑:

有趣的是,如果我只是使用

command=rdesktop -u '' $server

并回显它,输出很好 但是,如果我用

执行它
$command

失败了……

【问题讨论】:

  • rdesktop -u "''" $server 怎么样?
  • 不应该是超级用户吗?

标签: shell escaping shellexecute


【解决方案1】:

如果您的 shell 是 bash、ksh 或 zsh,那么使用数组而不是字符串来构建命令会更安全、更容易:

command=( rdesktop -u '' $server )

并像这样执行它

"${command[@]}"

我无法想象远程服务器需要看到一个名称为 '' 的用户名(即 2 个单引号)——它可能只需要一个空字符串。

【讨论】:

  • @derFunk,不,仅当您想捕获输出时。当你这样做echo foo 时,你会看到 foo;当您这样做$(echo foo) 时,您将命令替换的结果作为命令发送到 shell 以 execute -- 您将得到 foo: command not found
【解决方案2】:

当您调用rdesktop -u '' $server 时,您正在使用 3 个参数调用 rdesktop,其中第二个是空字符串。我不清楚你为什么要在反引号中调用它,但你可以使用你的第一个命令定义得到你想要的,并且:

eval $command

注意,如果你没有完全控制$server的内容,那么这是一个很大的安全隐患。 (比如如果server是字符串; cmd,那么调用eval会执行cmd

【讨论】:

    【解决方案3】:

    首先,如果你输入

    `rdesktop something`
    

    这意味着调用rdesktop,获取输出,然后将该输出作为命令运行。要“直接执行”,只需键入

    rdesktop something
    

    现在是报价。如果你执行

    rdesktop -u '' $server
    

    然后rdesktop 将看不到引号。它们作为 shell 解析命令的一部分被删除。要让 rdesktop 看到参数 '',请使用

    rdesktop -u "''" $server
    

    实际上没有必要添加任何进一步的转义,因为单引号在双引号字符串中并不特殊。

    编辑:当你想要对变量中的命令做的只是执行它时,请注意这种引号的剥离只发生一次:

    cmd="rdesktop -u '' $server"
    $cmd
    

    【讨论】:

    • 嗯,不幸的是,这对我不起作用,如果我使用cmd="rdesktop -u \"''\" $server",它将传递“''”作为参数,而不是''
    • 已编辑。虽然我仍然不认为您的远程用户名实际上包含两个单引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2011-05-21
    • 2011-04-25
    • 2020-04-06
    • 1970-01-01
    相关资源
    最近更新 更多