Articles of io redirection

将别名<cmd>透明地改为“do X then <cmd>”

标题很糟糕,但我不确定我想要做什么的正确术语,如果我知道我现在可能已经find了答案! 问题: 由于每当端口23被扫描,一个过分热心的端口扫描器(客户的networking监视器)和一个过于简单化的telnet守护进程(busybox linux),telnetd启动另一个 /bin/login实例,等待用户通过telnetinput。 由于端口扫描器并没有真正尝试login,所以没有会话,所以不会有会话超时,所以我们很快就会运行一个百万个僵尸拷贝/bin/login 。 我想要做的是: telnetd给了我们启动一些其他东西 ( -l )而不是/bin/login所以我想我们可以用一个bash脚本来replace/bin/login ,这个脚本会杀死旧的login进程,然后正常运行/bin/login : #!/bin/sh # First kill off any existing dangling logins # /bin/login disappears on successful login so # there should only ever be one killall -q login # now run login /bin/login 但是这似乎立即返回(没有错误,但没有login提示)。 我也尝试在telnetd的参数中链接命令: telnetd — -l "killall -q login;/bin/login" 但是,这似乎并没有工作(再次 – […]

了解bash中的exec

在阅读了关于exec内build工程的解释之后,我明白它的基本function是replace当前进程而不分叉。 它似乎也被用于redirectI / O和在当前进程中closures文件描述符,这使我感到困惑。 这是一些无关的额外的事情exec吗? 在“取代现在的过程”的背景下能够理解吗? 而如何结合进程替代,如exec 3< <(my program) ?

确定STDERR是否要去terminal

我有一套Java程序,在我们的Linux服务器上用作命令行工具。 他们大多使用一个在STDERR上打印进度条的类,类似于Perl的Term::ProgressBar 。 我希望每当STDERR进入terminal时都会显示进度条,并且在STDERR被redirect时自动禁用自身,这样redirect的数据中就没有各种进度条了。 检查System.console() == null是我的第一个想法,但redirectSTDOUT就足以使这是true ,即使STDERR仍然要去terminal。 有什么我可以检查是特定于STDERR? 特定于Linux的解决scheme或使用本机API的解决scheme对于我的需求可以。

打印STDOUT / STDERR并将它们写入Bash中的文件?

有没有办法让Bash将STDOUT / STDERRredirect到一个文件,但仍然打印到terminal?

Bash:在脚本中dynamic地redirect标准input

我试图做这个决定是否redirectstdin到一个文件或不: [ …some condition here… ] && input=$fileName || input="&0" ./myScript < $input 但是,这是行不通的,因为当variables$ input是“&0”时,bash将其解释为文件名。 不过,我可以这样做: if [ …condition… ];then ./myScript <$fileName else ./myScript 问题是./myScript实际上是一个很长的命令行,我不想重复,也不想为它创build一个函数,因为它不是那么长(这是不值得的)。 然后,我想到了这一点: [ …condition… ] && input=$fileName || input= #empty cat $input | ./myScript 但是这需要运行一个命令和一个pipe道(即一个子shell)。 还有另一种更简单,更高效的方法吗?

具有不可redirect输出的实用程序(Windows)

我正在使用Microsoft命令行实用程序来执行任务。 公用事业的具体细节和执行的任务,我认为是相对不重要的。 这是重要的: 命令行实用程序将文本发送到控制台窗口。 我不知道如何将这个文本redirect到一个文件,尽pipe我已经尝试了所有可以通过研究find的方法。 看来该实用程序正在使用一些奇怪的OS函数调用,导致文本打印方式不受正常的redirect手段。 我正在使用Windows 7 cmd.exe控制台窗口。 这些结构中没有一个redirect有问题的文本输出: util.exe >log.txt util.exe 2>err.txt util.exe >log.txt 2>&1 util.exe 1>log.txt 2>err.txt util.exe 1>log.txt 2>err.txt 3>3.txt 4>4.txt 5>5.txt 6>6.txt 7>7.txt 8>8.txt 9>9.txt 困惑最后一个? 结果发现在Windows-land中有10个输出stream ,但是也没有完成任务。 我可以使用控制台窗口的“编辑”>“标记select和复制”function来复制文本,但是我需要以无头方式捕获该程序的输出,以便自动化。 我无法find任何专门打印到控制台的绕过redirect的OS函数调用。 这样的function是否存在? 这个工具如何设法绕过redirect? 我能用什么方法来捕捉这个工具的输出? 我也试过DbgView,也许这可能包含输出消息,但事实并非如此。 该实用程序不是一个graphics工具。 这显然是一个文本模式程序,可能用C或C ++编写。 它是由微软写的。

ErrorLevel为什么只能在||之后设置 运营商在一个失败的redirect?

当redirect失败时(由于文件不存在或文件访问不足),似乎不会设置ErrorLevel值(在以下示例中,文件test.tmp是写保护的,文件test.nil不存在): >>> (call ) & rem // (reset `ErrorLevel`) >>> > "test.tmp" echo Text Access is denied. >>> echo ErrorLevel=%ErrorLevel% ErrorLevel=0 >>> (call ) & rem // (reset `ErrorLevel`) >>> < "test.nil" set /P DUMMY="" The system cannot find the file specified. >>> echo ErrorLevel=%ErrorLevel% ErrorLevel=0 但是,只要失败的redirect之后是条件级联运算符|| ,这是查询退出代码, ErrorLevel被设置为1 ,意外: >>> (call ) & rem […]

在C中,如何在执行execvp()或类似的调用时将stdin / stdout / stderrredirect到文件?

我有以下代码: pid_t pid = fork(); if (pid == -1) { // … } else if (pid == 0) { stdin = someopenfile; stdout = someotherfile; stderr = somethirdopenfile; execvp(args[0], args); // handle error … } else { // … } 问题是, execvp()调用的input/输出仍然是控制台,而不是文件。 显然我做错了什么,做这个的正确方法是什么?