【问题标题】:Paramiko: Executing a perl script within a shell scriptParamiko:在 shell 脚本中执行 perl 脚本
【发布时间】:2015-03-17 13:00:28
【问题描述】:

您好,我有一个嵌入了 perl 脚本的 shell 脚本。

cat chkLog.sh

LOGFILE=`echo $1`
echo "#Action15: Check Log" | tee -ia $LOGFILE
perl << '__THERE__' | tee -ia $LOGFILE
print("hello Word\n");
.Some more complex perl codes
.
.
__THERE__
echo "#EndAct" | tee -ia $LOGFILE

基本上我使用 Here-docs 概念来执行 perl 代码。现在,如果我直接在服务器上执行上述脚本,我会得到所需的输出。但是当我通过 paramiko 发送它时,perl 部分被完全忽略了。输出是:

通过 Paramiko 输出:

#Action15: Check Log
#EndAct"

Paramiko 脚本:

>>> hostname='192.168.122.1'
>>> username='may'
>>> password='*******'
>>> setupcommand="/user/may/click_demo_test/chkLog.sh"
>>> resultloc="/user/spm/click_demo_test/setuplog/chkLog.sh"
>>> execomand= setupcommand + ' ' + resultloc
>>> ssh = paramiko.SSHClient()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect(hostname,username=username,password=password)
>>> channel = ssh.get_transport().open_session()
>>> channel.exec_command(execomand)
>>> while not channel.exit_status_ready():
              time.sleep(1)
>>> stdout = channel.makefile("rb")
>>> print stdout.readlines()

将 Perl 转换为完整的 shell 将是一项繁重的任务,因为我有很多脚本。

【问题讨论】:

    标签: perl ssh paramiko


    【解决方案1】:

    由于您没有检查任何返回值,您确定 shell 脚本没有尝试运行 perl 命令并失败了吗?我建议在 shell 脚本 $? 中检查返回码?并且也许将绝对路径放置到 perl 解释器以排除任何环境问题。

    【讨论】:

      【解决方案2】:

      你可以尝试在远程shell中运行

      channel = ssh.invoke_shell()
      

      exec_command 之前可能会出现没有伪终端的问题,以消除直接在终端中运行和通过 SSH 运行的差异。

      如果这不起作用,您可以尝试一些没有 perl 的简单 heredoc,看看它是如何通过 SSH 工作的,如果有效 - 然后尝试简单的 perl,等等。

      是的,如前所述,尝试捕获错误。

      【讨论】:

        最近更新 更多