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

问题

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

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来确认,我们就可以这样写

1
echo y | sh test.sh

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

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

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

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

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