您好我有一个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将是一项繁忙的任务,因为我有很多脚本。
答案 0 :(得分:0)
由于您没有检查任何返回值,您确定shell脚本没有尝试运行perl命令并失败吗?我建议在shell脚本中检查返回码$?并且可能将绝对路径放到perl解释器中以排除任何环境问题。
答案 1 :(得分:0)
您可以尝试使用
在远程shell中运行channel = ssh.invoke_shell()
在exec_command
之前导致缺少伪终端可能存在问题,以消除直接在终端和SSH中运行的差异。
如果这不起作用,你可以尝试使用一些没有perl的简单heredoc,看看它是如何工作的,如果它有效 - 然后尝试简单的perl,依此类推。
是的,尝试捕捉错误,正如已经提到的那样。