【问题标题】:how can a single command take stdin in one program and filename in other单个命令如何在一个程序中使用标准输入,在另一个程序中使用文件名
【发布时间】:2021-08-10 23:13:07
【问题描述】:

我想要做的是将参数传递给第二个程序,它需要 cmdline-args 并使用 sudo 打开,但与我传递给 sudo 的 stdin 没有任何关系。

下面是一个例子来理解我想要做什么。

echo "mypass" | sudo -S nvim "filename"

这里 sudo 必须采用标准输入,nvim 必须采用 cmdline-arg 的文件名。但是 nvim 打开一个未命名的文件并将标准输入放入该文件,甚至不关心我传递给它的参数。

我的最终目标不是只打开文件而不输入密码,而是了解如何以我想要的方式传递参数

有可能吗?

【问题讨论】:

  • 我不明白。你为什么不echo "mypass" | sudo -S nvim "$1"?还有,顺便问一下,你知道sudoedit吗?
  • @mumboFromAvnotaklu : AFIK,sudo 不从标准输入读取。
  • @user1934428 我也是这么想的。因为我不知道 OP 使用的 -S 选项,所以我查看了手册,上面写着:“-S, --stdin 将提示写入标准错误并从标准输入中读取密码而不是使用终端设备。”你知道这是什么意思吗?
  • sudo 在大多数系统上肯定会从stdin 读取,但不是密码。 echo date|sudo su 将读取 stdin 以获取以 root 身份执行和运行 date 的命令。不过,-S 选项可以。
  • “正确”的做法是忽略-S,并配置sudo 让您在没有密码的情况下运行nvim filename

标签: bash sudo cmdline-args


【解决方案1】:

只需将文件名作为脚本的第一个参数传递:

echo "<your password>" | sudo -S nvim "$1"

并使用以下命令调用脚本:

./script.sh myfile.txt

请注意,sudo-S 选项的行为会有所不同,具体取决于凭据是否已缓存。最好还使用-k 选项使凭据无效:

echo "<your password>" | sudo -k -S nvim "$1"

【讨论】:

    【解决方案2】:

    由于the sudo 密码不需要重复两个连续的sudo 命令,我应该发出两个连续的命令:

    echo "mypass" | sudo -S -v 
    sudo nvim "filename"         # will not prompt for password this time
    

    解释:sudo -v 只是更新sudo 的凭据,而不执行任何命令。

    【讨论】:

    • 由于我没有安装nvim,如果未使用的密码转到nvim,我无法检查第一个命令是否不需要密码。使用vimgvim,我没有上面 Renaud Pascalet 描述的问题。
    • nvim-specific 唯一的事情就是它所做的 输入未被sudo 使用。
    • 另外,sudo 记住以前的身份验证的时间和时间是可配置的,所以我不认为第二行不需要密码。
    【解决方案3】:

    正如您所拥有的那样,它似乎应该可以工作。
    也许明确地尝试 bash 调用。即使您需要单独的输入重定向,这也有效。

    $ echo "$pw"|sudo -S bash -c "head -3 < foo"
    0
    1
    2
    

    如果您需要传递文件参数,可以在别处显式绑定您的标准输入。

    $ echo "$pw"|sudo -S bash -c "head -5 foo </dev/null"
    0
    1
    2
    

    【讨论】:

    • 这确实有效,问题在于 sudo 缓存密码。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    相关资源
    最近更新 更多