Paramiko:在shell脚本中执行perl脚本

时间:2015-03-17 13:00:28

标签: perl ssh paramiko

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

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 Script:

>>> 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将是一项繁忙的任务,因为我有很多脚本。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以尝试使用

在远程shell中运行
channel = ssh.invoke_shell()

exec_command之前导致缺少伪终端可能存在问题,以消除直接在终端和SSH中运行的差异。

如果这不起作用,你可以尝试使用一些没有perl的简单heredoc,看看它是如何工作的,如果它有效 - 然后尝试简单的perl,依此类推。

是的,尝试捕捉错误,正如已经提到的那样。

相关问题