【问题标题】:using grep in a script which prompt user for input在提示用户输入的脚本中使用 grep
【发布时间】:2013-02-28 11:20:10
【问题描述】:

我编写了一个 shell 脚本,它要求从标准输入中输入一些用户名和密码。 输入用户名和密码后,将根据脚本中传递的参数输出。

假设我的脚本名称是 XYZ.ksh。

现在我的问题是这些脚本的用户想要使用这些脚本与其他 shell 命令如 grep、less、more、wc 等结合使用。

通常是的,他们可以使用

XYZ.ksh | grep abc

但在我的情况下,由于 XYZ 提示输入用户名和密码,我们无法使用“|”在那之前。它永远阻塞。

我只是想知道如何实现该功能。

我尝试了什么 我尝试从用户输入“更多命令”,其中用户键入“| grep abc” 但是当我在脚本中使用此输入时,它不起作用。

【问题讨论】:

    标签: bash ksh


    【解决方案1】:

    像这样使用<<<

    XYZ.ksh <<< "your inputs" | grep abc
    

    【讨论】:

    • 是的,我想到了这一点,但问题是我不希望用户输入密码,它不应该是可见的,这就是为什么我在脚本本身中提示用户输入密码。
    【解决方案2】:

    在您的脚本中,您可以测试 stdout 是否连接到终端:

    if [[ -t 1 ]]
    

    这样,如果输出不进入控制台,您可以取消提示。 或者,使用“更多命令”解决方案,运行连接到命名管道的命令。

    【讨论】:

      【解决方案3】:

      这类问题通常有多种解决方案,但没有一个是完美的:

      • 从标准输入读取密码。这使得在管道中使用脚本变得非常困难。此方法由处理更改密码的命令使用:passwdsmbpasswd
      • 在命令行参数中提供用户名和密码。此解决方案适用于在管道中使用脚本,但任何人都可以查看命令行,例如使用ps -ef。这被mysqlhtpasswdsqlplus、...使用。
      • 将未加密的用户名和密码存储在用户主目录的文件中。此解决方案适用于在管道中使用脚本,但脚本必须检查文件是否对其他用户可见或可修改。这是mysql使用的
      • 将私钥存储在本地文件中,将公钥存储在远程文件中,如 SSH 使用的那样。您必须具备良好的加密知识才能正确执行此操作(或依赖 SSH),但它非常适合在管道中使用,甚至在不同机器上创建管道!
      • 不处理密码,假设用户登录系统,就有权运行程序。您可以仅将执行权限授予一组,以过滤谁可以使用该程序。这由来自 Oracle、VirtualBox、某些 Linux 发行版上的游戏的 sqlplus 使用...

      我最喜欢的解决方案是最后一个,因为在安全性方面,该系统肯定比我能编写的任何程序都要好。

      如果密码用于登录其他服务,那么我可能会选择包含密码的私人文件。

      【讨论】:

        【解决方案4】:

        一种不太理想的可能性是将提示显示到stderr 而不是stdout

        echo -n "Username:" >/dev/stderr
        

        更好的解决方案是检查 shell 的stdin。如果它是终端,则打开它进行写入并重定向到该文件。不幸的是,我不确定如何在 bash 或 ksh 中做到这一点。也许像

        echo -n "Username:" >/dev/tty
        

        【讨论】:

          【解决方案5】:

          您可以使用(我假设您正在使用read 读取脚本中的用户名和密码)

          (
              read -p "user:" USER
              read -p "pass:" PASS
          ) < /dev/tty > /dev/tty
          

          然后你就可以跑了

          $ cmd | XYZ.ksh
          

          但是,我同意其他答案:只是不要询问用户和密码,并为脚本提供正确的权限以允许访问。

          【讨论】:

            猜你喜欢
            • 2010-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多