在提示用户输入的脚本中使用grep

时间:2013-02-28 11:20:10

标签: bash ksh

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

说我的脚本名称是 XYZ.ksh。

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

通常是的,他们可以使用

XYZ.ksh | grep abc

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

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

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

5 个答案:

答案 0 :(得分:0)

像这样使用<<<

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

答案 1 :(得分:0)

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

if [[ -t 1 ]]

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

答案 2 :(得分:0)

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

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

我的首选解决方案将是最后一个,因为系统肯定比我在安全方面可编写的任何程序都要好。

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

您可以使用(我假设您正在使用read

在脚本中阅读用户名和密码
(
    read -p "user:" USER
    read -p "pass:" PASS
) < /dev/tty > /dev/tty

你可以运行

$ cmd | XYZ.ksh

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