我有一个Perl脚本,我使用plink执行远程命令,使用pscp进行文件传输(来自系统调用)。我之前的版本一直使用ssh和scp但是我的老板想要远离使用密钥验证并使用他们的密码,如果我留在ssh和scp,用户将不得不输入他们的密码~40 +次,哪个不行。虽然我知道有其他模块可用于此类身份验证,但由于工作场所规定,我无法下载它们。
我这样做的问题是,在第一组plink / pscp调用之后,STDIN没有像我预期的那样动作,具体来说,它不接受返回键作为结束用户输入。经过多次搜索,我在这里找到了一个用户使用过的问题:
@foo = <>;
而不是
$foo = <>;
并且答案谈到了换行符与EoF,并使用CTRL-Z来终止这些输入,虽然这不是我遇到的问题,但我尝试使用CTRL-Z,这似乎有效。
我对此并不满意,最终找到this question所以我尝试添加2&gt;&amp; 1&amp;到我的plink / pscp调用结束时,突然STDIN正常工作。
我对社区的问题是:为什么? plink和/或pscp对导致此问题的环境做了什么?
以下是导致此问题的示例代码:
use strict;
use warnings;
...
system("\"C:\\path\\to\\PuTTY\\plink\" -ssh -pw $mypassword username@remoteserver rm file_to_remove");
system("\"C:\\path\\to\\PuTTY\\pscp\" -scp -pw $mypassword file_to_send username@removeserver:/path/to/destination/folder/file_to_send");
my $foo = <STDIN>;
可以找到的代码:
use strict;
use warnings;
...
system("\"C:\\path\\to\\PuTTY\\plink\" -ssh -pw $mypassword username@remoteserver rm file_to_remove 2>&1 &");
system("\"C:\\path\\to\\PuTTY\\pscp\" -scp -pw $mypassword file_to_send username@removeserver:/path/to/destination/folder/file_to_send 2>&1 &");
my $foo = <STDIN>;
谢谢! (如果在开始时看起来有点乱,那就很抱歉)