我正在编写一个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;
但它没有用,有什么建议吗?
谢谢!
答案 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
做了什么。