在perl脚本中插入rsh和模块加载

时间:2011-08-23 18:55:02

标签: perl bash

我正在编写一个perl脚本来启动vnc会话。

Firsr我需要rsh到服务器然后加载模块,然后执行“vncserver -otp”。

my $mod=`module load turbovnc-1.0.0; vncserver -otp 2> tmp_vnc.log`;

my $launch=`rsh $host /"$mod/"`;

print $launch;

但它没有用,有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

您的意思是在第一行使用反引号吗?

my $mod=`module load turbovnc-1.0.0; vncserver -otp 2> tmp_vnc.log`;

这会将$mod设置为此命令序列的输出,例如运行

(module load turbovnc-1.0.0; vncserver -otp 2> tmp_vnc.log) | rsh $host
来自shell的

你可能想说

my $mod='module load turbovnc-1.0.0; vncserver -otp 2> tmp_vnc.log';

将设置您在远程主机上运行这些特定命令,然后执行

rsh $host "module load turbovnc-1.0.0; vncserver -otp 2> tmp_vnc.log"

<小时/>

rsh命令中,您试图使用正斜杠来转义引号。在Perl中(据我所知,在其他所有内容中),使用反斜杠来转义特殊字符。

my $launch=`rsh $host /"$mod/"`;    # / wrong /
my $launch=`rsh $host \"$mod\"`;    # \ right \
my $launch=`rsh $host "$mod"`;      # right, esc is not reqd in this case

答案 1 :(得分:2)

许多事情可能出错,但系统命令可能正在悄然失败。加载模块,启动vncserver或rsh。您可以通过在每个命令后检查$?来手动检查其成功或失败...或者您可以使用IPC::System::Simple,如果命令失败,它将会出错。

我首先将它作为一系列shell命令来确保它能够正常工作。

然后我会像使用IPC :: System :: Simple一样重写代码来进行错误检查。另外将$ mod命令分成两个命令,因为我怀疑你正在取回运行vncserver的输出,而不是加载模块。

use strict;
use warnings;

use IPC::System::Simple qw(run capture);

my $host = "something.something";

# Capture the output of loading the module
my $mod = capture('module', 'load', 'turbovnc-1.0.0');
warn "Module output: $mod\n";

# Run the VNC server
run('vncserver -otp 2> tmp_vnc.log');

# Connect to the host
my $launch = capture('ssh', $host, "/$mod/");
warn "ssh output: $launch";

似乎有一种可能错误的假设,即该机器上模块的位置与远程机器上模块的位置相同。那个或我不明白你用$mod做了什么。