2013-02-28 52 views
0

我写了一个shell脚本,它要求从标准输入中输入用户名和密码。 一旦输入用户名和密码,就会有一个输出取决于脚本中传递的参数。在提示用户输入的脚本中使用grep

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

现在我的问题是,这些脚本的用户希望使用要在结合使用这个脚本与其他shell命令一样grep的,更小,更,厕所等

通常是他们可以使用

XYZ.ksh | grep abc 

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

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

我试过 我试图从用户那里就像用户类型的东西采取“多个命令”中输入“| grep的ABC” 但是当我在我的脚本中使用此输入也没有工作。

回答

0

使用<<<这样的:

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

是的,我想到了这一点,但问题是我不希望用户输入密码,它不应该是可见的,这就是为什么我提示用户在脚本本身的密码。 – 2013-02-28 13:09:21

0

在你的脚本,你可以测试一下,看看是否标准输出连接到终端有:

if [[ -t 1 ]] 

这样,如果输出你可以禁止提示不会去控制台。 或者,使用“更多命令”解决方案,运行连接到命名管道的命令。

0

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

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

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

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

0

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

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

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

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

可以使用(我假设你正在阅读的用户名和密码在你的脚本read

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

,你就可以运行

$ cmd | XYZ.ksh 

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