0

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

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

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

通常是的,他们可以使用

XYZ.ksh | grep abc

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

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

我尝试了什么我尝试 从用户那里输入“更多命令”,其中用户输入诸如“| grep abc”之类的东西,但是当我在我的脚本中使用这个输入时它不起作用。

4

5 回答 5

0

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

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

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

echo -n "Username:" >/dev/tty
于 2014-08-26T19:49:05.880 回答
0

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

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

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

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

于 2013-03-01T09:52:37.607 回答
0

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

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

你就可以跑了

$ cmd | XYZ.ksh

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

于 2014-08-26T20:08:04.987 回答
0

像这样使用<<<

XYZ.ksh <<< "your inputs" | grep abc
于 2013-02-28T11:33:58.273 回答
0

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

if [[ -t 1 ]]

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

于 2013-02-28T12:51:09.997 回答