如何使用命令行参数从bash运行perl脚本?

时间:2012-09-04 22:16:40

标签: perl bash rt

我正在尝试创建一个脚本,将一组用户批量标记为RT中的特权。我在RT维基上找到了一个脚本,用于将用户添加到组中并为其提供特权状态,然后删除它与添加到组中的位。我剩下的perl脚本是:

#!/usr/bin/perl
# Usage: ./rt_set_privileged.pl <username>

use strict;
use lib "/var/www/ticket.ourcompany.com/lib";
use RT;
use RT::User;
use RT::Interface::CLI;

RT::LoadConfig();
RT::Init();

# Create RT User Object
my $user = new RT::User($RT::SystemUser);

# Instantiate the user object with the user passed as parameter
my $usertoadd = $ARGV[0];
$user->Load( $usertoadd );

# Set the privileged flag (1=privileged, 0=unprivileged)
$user->SetPrivileged(1);

exit 1

我有一个文件中的用户,每行一个用户名。 我还不知道perl,所以我尝试创建一个小的bash脚本来遍历文件并按名称运行perl脚本一次。现在看起来的Bash脚本:

#!/bin/bash

touch commands.sh
cat usernames.txt | while read LINE ; do
        N=$((N+1))
        echo /home/chris/RT/bin/rt_set_privileged.pl \"$LINE\" >> commands.sh
        /home/chris/RT/bin/rt_set_privileged.pl \"$LINE\"
        perl /home/chris/RT/bin/rt_set_privileged.pl \"$LINE\"
        perl -w /home/chris/RT/bin/rt_set_privileged.pl \"$LINE\"
        eval /home/chris/RT/bin/rt_set_privileged.pl \"$LINE\"
        perl "/home/chris/RT/bin/rt_set_privileged.pl $LINE"
done
echo "Processed $N users"

正如你所看到的,我已经尝试了很多方法来运行命令,但无济于事。令人讨厌的是,我可以随后从commands.sh文件中获取任何命令,并将它们直接粘贴到终端没有问题,这很好。当他们通过bash脚本运行时,我只是得到了一堆这些消息:

[Tue Sep  4 07:43:56 2012] [critical]: _AddMember called with a parameter that's not an integer. (/var/www/ticket.ourcompany.com/lib/RT/Group.pm:912)
[Tue Sep  4 07:43:58 2012] [warning]: Use of uninitialized value $principal in pattern match (m//) at /var/www/ticket.ourcompany.com/lib/RT/Group.pm line 970. (/var/www/ticket.ourcompany.com/lib/RT/Group.pm:968)
[Tue Sep  4 07:43:58 2012] [error]: Group::HasMember was called with an argument that isn't an RT::Principal or id. It's (undefined) (/var/www/ticket.ourcompany.com/lib/RT/Group.pm:973)
[Tue Sep  4 07:43:58 2012] [warning]: Use of uninitialized value $principal in pattern match (m//) at /var/www/ticket.ourcompany.com/lib/RT/Group.pm line 970. (/var/www/ticket.ourcompany.com/lib/RT/Group.pm:968)
[Tue Sep  4 07:43:58 2012] [error]: Group::HasMember was called with an argument that isn't an RT::Principal or id. It's (undefined) (/var/www/ticket.ourcompany.com/lib/RT/Group.pm:973)
[Tue Sep  4 07:43:58 2012] [warning]: Use of uninitialized value in concatenation (.) or string at /var/www/ticket.ourcompany.com/lib/RT/User.pm line 341. (/var/www/ticket.ourcompany.com/lib/RT/User.pm:341)
[Tue Sep  4 07:43:58 2012] [critical]: User  is neither privileged nor unprivileged. something is drastically wrong. (/var/www/ticket.ourcompany.com/lib/RT/User.pm:341)
[Tue Sep  4 07:43:58 2012] [warning]: Use of uninitialized value $new_member in pattern match (m//) at /var/www/ticket.ourcompany.com/lib/RT/Group.pm line 911. (/var/www/ticket.ourcompany.com/lib/RT/Group.pm:911)

建议在没有任何参数的情况下运行该命令。在这一点上,我可以在我试图解决它的时候为每个用户实际运行一次命令,有人可以帮忙吗?

5 个答案:

答案 0 :(得分:2)

在Perl代码中有一堆编程错误 - 您获得的错误消息都是编译器消息。所以调用是正确的,但Perl代码是错误的。

您要做的是编辑Perl代码,直到所有错误消息和警告都消失。

编辑:Perl代码在当时运行的环境中是错误的。

答案 1 :(得分:2)

阿尔,我很难过这么长时间才意识到这么简单的问题。 问题是字符串格式化 - 文件usernames.txt是由某人使用Windows创建并具有dos格式(CRLF)。我猜这个参数是以[用户名] [LF]的形式到达并搞砸了$ User变量的实例化。

我确信如果没有来这里讨论它我就永远不会得到这个,我只是在我自己尝试的时候绕圈子。

决议只是为了:

sudo apt-get install tofrodos
sudo fromdos usernames.txt

然后原始脚本工作

非常感谢帮助人员。

编辑:现在已经有足够的时间将我从原始问题的编辑转移到它自己的答案

答案 2 :(得分:1)

perl /home/chris/RT/bin/rt_set_privileged.pl "$LINE"

如果文件是可执行文件,您也可以这样做:

/home/chris/RT/bin/rt_set_privileged.pl "$LINE"

例如,

$ cat usernames.txt 
ikegami
Chris O'Kelly

$ cat script.pl 
#!/usr/bin/env perl
print "arg=<<$ARGV[0]>>\n";

$ while read LINE ; do script.pl "$LINE"; done <usernames.txt
arg=<<ikegami>>
arg=<<Chris O'Kelly>>

您可以使用xargs代替while read

$ xargs -n1 -d\\n script.pl <usernames.txt 
arg=<<ikegami>>
arg=<<Chris O'Kelly>>

答案 3 :(得分:1)

另一个解决方案:不要使用bash脚本,而是直接编辑perl脚本,打开你的usernames.txt文件并逐行阅读 - 这也将解决你的问题。

就像这里http://www.perlfect.com/articles/perlfile.shtml

my $file = "usernames.txt";
open USERS, "<$file" or die "Can't open $file ($!)";

while(<USERS>) {
 my $usertoadd = $_;
 chomp $usertoadd;
 $user->Load( $usertoadd );
 $user->SetPrivileged(1);
}

答案 4 :(得分:0)

更新: 现在考虑到用户名中空格的可能性,这得益于来自Peniwize's Blog的有价值的提示。

OLD_IFS=$IFS
IFS=$'\n'    
priveleged=( $( cat usernames.txt) )
for i in "${priveleged[@]}"
do
    perl /home/chris/RT/bin/rt_set_privileged.pl $i
done
IFS=$OLD_IFS