如何将一个命令要求的输入通过管道传递?

问题

直接来举个例子说明问题吧,假设我有一个 test.sh 脚本,运行它会出现下面的输出

bash
1
2
> sh test.sh
Pls make sure you want to run this scripts [y|n]

这个脚本希望我们确认当前的操作,输入 y 表示同意,输入 n 或者其他字符都表示退出。

此时如果是人工正常执行,我们输入 y 就可以继续往后了。但如果我们是使用某些 cicd 工具(比如 jenkins)去自动化执行这个脚本呢?此时就没有办法有用户去做这个输入的操作了。

但我们又想自动化运行 test.sh 脚本,咋办?

解决方案

解决方案就是使用 linux 下的命令行管道 |,比如 test.sh 要求输入 y 来确认,我们就可以这样写

bash
1
echo y | sh test.sh

此时 y 会被自动当作 test.sh 脚本的输入,即跳过了要求用户输入来确认的步骤,会直接往后执行。

这个方式适用于很多命令行执行,不希望有用户输入导致阻塞等待的脚本。

还有一个常用的命令就是切换 linux 下的用户,默认情况下使用的命令是 sudo -u 用户 执行的命令来以另外一个用户的身份执行某个命令,这个操作会要求我们输入目标用户的密码,此时可以用如下方式来替代,新增的 -S 选项代表 sudo -u 将从 stdin 里面提取用户密码。

bash
1
echo 用户密码 | sudo -u 用户名 -S 需要执行的命令

可以使用 whami 命令来测试这个命令的效果,如果执行成功,whami 应该显示另外一个用户的名字,而不是当前执行该命令的用户。