【问题标题】:Passing empty arguments to sudo -i将空参数传递给 sudo -i
【发布时间】:2015-03-09 16:15:49
【问题描述】:

这是我想使用sudo -i 运行的示例 bash 脚本:

#!/bin/bash

echo "arg 1: $1"
echo "arg 2: $2"

当我使用一个空参数正常运行此命令时,它会按预期运行:

$ /tmp/args.sh "" two
arg 1:
arg 2: two

使用普通的 sudo,我得到了预期的结果:

$ sudo /tmp/args.sh "" two
arg 1:
arg 2: two

但是,如果我使用 -i(获取用户的 shell 和登录脚本),第一个参数突然消失了:

$ sudo -i /tmp/args.sh "" two
arg 1: two
arg 2:

而且我想不出任何方法来引用或转义第一个空参数。

注意:我想出了一个解决方法,将/tmp/args.sh "" two 写入文件,然后使用sudo -i 执行它,但我想知道是否有任何方法可以直接从命令行。

【问题讨论】:

标签: linux bash shell sudo


【解决方案1】:

用单引号引用空的双引号参数,如下所示:

$ sudo -i /tmp/args.sh '""' two

【讨论】:

  • 这行不通。它将文字引号作为第一个参数,而不是空字符串。
  • 为我工作。外引号确保 "" 参数被传递给由于 -i 选项而执行的用户 shell,然后该 shell 将 "" 解释为空参数。
  • 这是我的尝试之一。它打印 arg1: "" 而不是 arg1:
  • 我编写了一个 C 程序来打印传递给它的参数,并完全按照我在答案中显示的那样调用它。它将两个命令行参数打印为字符串,每个参数都用双引号括起来,如下所示:printf("argv 1: \"%s\" argv 2: \"%s\"\n", argv[1], argv[2]);。结果:argv 1: "" argv 2: "two",这意味着第一个参数不包含引号,而是空字符串,完全符合您的要求。
  • 不幸的是,我的 bash/sudo (Ubuntu 14.04.1) 组合使用这个命令给了我文字引号。
【解决方案2】:

这对我有用:

sudo -i bash -c '/tmp/args.sh "" two'

【讨论】:

  • 如果您需要将环境变量传递到命令中,另一种选择是转义双引号。 sudo -i bash -c "/tmp/args.sh \"\" two"
猜你喜欢
  • 2020-03-16
  • 2012-08-23
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多