首页 » 信息技术 »

不是所有的输入,都可来自stdin

2019年7月4日 / 20次阅读
Linux

终于搞清楚了一个Linux系统中的基本概念:并不是所有的程序输入,都来自stdin。有的输入,比如程序交互时的密码,不一定可以通过stdin输入。

接收stdin输入,就表示这个输入可以走pipe管道,而有的程序在与用户交互时需要输入密码,这时就无法通过pipe进行输入。这个时候,应该是程序代码强制使用terminal设备来获取输入的情况。

比如sudo命令,默认情况下,密码是不能通过pipe输入的。不过如果加上-S参数,就可以了,这也为我们学习Linux系统的这个特性开了一扇窗,下面是sudo命令man里面关于-S参数的说明:

-S, --stdin
Write the prompt to the standard error and read the password
from the standard input instead of using the terminal device.
The password must be followed by a newline character.

再比如mysqldump程序的密码,就无法通过stdin来接收,也没有参数可以设置。这种情况,要么通过将密码直接写在命令行上(-p或--password都可以,会有warning),或者使用expect这样的交互式脚本。

遇到mysqldump这样的情况,python的subprocess模块就没法通过stdin进行输入,想要交互,只能通过pexpect模块(模拟tty或pty交互)来实现。

我还遇到过一个情况,python程序使用了logging模块,这个模块的输出,有的时候(根据设置情况)就不接受命令行重定向符号的控制。

理解stdin(包括通过pipe后)并不是程序输入的唯一入口,我觉得很重要。

 

本文链接:https://www.maixj.net/ict/chengxu-stdin-21896

相关文章

留言区


前一篇:
后一篇:

栏目精选

云上小悟,麦新杰的独立博客

Ctrl+D 收藏本页

栏目


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。

网站二维码
go to top